Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,7 @@ reach_wrap_output.json
**/resolve_log.out*

*.facts
*.facts.zst
*.facts.zst

# rust
*target*
1 change: 1 addition & 0 deletions docs/development/building-from-source.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
**RESOLVE** has been tested on **Ubuntu 24.04.4 LTS**, but should work on other distributions that can provide the following packages:

- Nightly Rust
- cbindgen (`cargo install cbindgen --version 0.29.0 --locked`)
- uv
- CMake
- build-essential
Expand Down
38 changes: 38 additions & 0 deletions resolve-facts/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,44 @@ endif()
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)

######################################################################
# RUST FACTS ABI

set(FACTS_RS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/rs")
set(FACTS_RS_TARGET_DIR "${FACTS_RS_DIR}/target/release")
set(FACTS_RS_STATICLIB "${FACTS_RS_TARGET_DIR}/libfacts_rs.a")
set(FACTS_RS_GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
set(FACTS_RS_HEADER "${FACTS_RS_GENERATED_DIR}/facts_rs.hpp")
file(MAKE_DIRECTORY "${FACTS_RS_GENERATED_DIR}")

find_program(CARGO_EXECUTABLE cargo REQUIRED)
find_program(CBINDGEN_EXECUTABLE cbindgen HINTS "$ENV{HOME}/.cargo/bin" REQUIRED)

file(GLOB FACTS_RS_SOURCES CONFIGURE_DEPENDS "${FACTS_RS_DIR}/src/*.rs")
add_custom_command(
OUTPUT "${FACTS_RS_STATICLIB}" "${FACTS_RS_HEADER}"
COMMAND "${CMAKE_COMMAND}" -E make_directory "${FACTS_RS_GENERATED_DIR}"
COMMAND "${CARGO_EXECUTABLE}" build --manifest-path "${FACTS_RS_DIR}/Cargo.toml" --release
COMMAND "${CBINDGEN_EXECUTABLE}" --config "${FACTS_RS_DIR}/cbindgen.toml"
--crate facts-rs --output "${FACTS_RS_HEADER}" "${FACTS_RS_DIR}"
DEPENDS ${FACTS_RS_SOURCES} "${FACTS_RS_DIR}/Cargo.toml" "${FACTS_RS_DIR}/Cargo.lock"
"${FACTS_RS_DIR}/cbindgen.toml"
WORKING_DIRECTORY "${FACTS_RS_DIR}"
COMMENT "Building facts-rs and generating its C++ ABI header"
VERBATIM
)
add_custom_target(facts_rs_build ALL DEPENDS "${FACTS_RS_STATICLIB}" "${FACTS_RS_HEADER}")

add_library(facts_rs STATIC IMPORTED GLOBAL)
set_target_properties(facts_rs PROPERTIES
IMPORTED_LOCATION "${FACTS_RS_STATICLIB}"
INTERFACE_INCLUDE_DIRECTORIES "${FACTS_RS_GENERATED_DIR}"
)
add_dependencies(facts_rs facts_rs_build)

install(FILES "${FACTS_RS_STATICLIB}" DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(FILES "${FACTS_RS_HEADER}" DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

add_subdirectory(vendor/argparse)
add_subdirectory(vendor/json)

Expand Down
11 changes: 9 additions & 2 deletions resolve-facts/Config.cmake.in
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
@PACKAGE_INIT@

include("${CMAKE_CURRENT_LIST_DIR}/ResolveFactsTargets.cmake")

include(CMakeFindDependencyMacro)
find_dependency(glaze)

if(NOT TARGET facts_rs)
add_library(facts_rs STATIC IMPORTED)
set_target_properties(facts_rs PROPERTIES
IMPORTED_LOCATION "${PACKAGE_PREFIX_DIR}/@CMAKE_INSTALL_LIBDIR@/libfacts_rs.a"
INTERFACE_INCLUDE_DIRECTORIES "${PACKAGE_PREFIX_DIR}/@CMAKE_INSTALL_INCLUDEDIR@"
)
endif()

include("${CMAKE_CURRENT_LIST_DIR}/ResolveFactsTargets.cmake")

check_required_components(ResolveFacts)
Expand Down
4 changes: 4 additions & 0 deletions resolve-facts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,7 @@ Tools for creating and querying RESOLVE binary metadata, including the `reach` t

- Facts: <https://riversideresearch.github.io/resolve/latest/components/facts/>
- `reach` tool: <https://riversideresearch.github.io/resolve/latest/components/reach/>

## Future Improvements

Strings are interned at an LLVM Module-level. If we were to intern strings across every module together, we would be able to get more space savings, but likely at the expense of more CPU-heavy assembly/decompression. It's also unclear if/how we could compress ELF strings inline.
65 changes: 65 additions & 0 deletions resolve-facts/rs/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions resolve-facts/rs/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[package]
name = "facts-rs"
version = "0.1.0"
edition = "2024"

[lib]
crate-type = ["rlib", "staticlib", "cdylib"]

[dependencies]
bytemuck = { version = "1", features = ["derive"] }
21 changes: 21 additions & 0 deletions resolve-facts/rs/cbindgen.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
language = "C++"
namespace = "facts_rs"
pragma_once = true
include_guard = "RESOLVE_FACTS_RS_H"
header = """
/*
* Generated by cbindgen from resolve-facts/rs. Do not edit by hand.
*/
"""

[parse]
parse_deps = false

[parse.expand]
crates = ["facts-rs"]

[export]
include = [
"Node",
"Edge",
]
Loading