diff options
| author | Josh Ferrell <josh@vector35.com> | 2025-09-26 13:49:38 -0400 |
|---|---|---|
| committer | Josh Ferrell <josh@vector35.com> | 2025-09-29 14:42:30 -0400 |
| commit | 4870c90e6fbf31898c57db04f97c69f647157fd5 (patch) | |
| tree | 463f7097173c500b055219caffbbdbbd673f23c1 | |
| parent | df599006c0a805dda992910722ac69a9adf794fc (diff) | |
Allow generating and linking to stubs from cmake
| -rw-r--r-- | CMakeLists.txt | 62 | ||||
| -rw-r--r-- | cmake/FindBinaryNinjaCore.cmake | 19 | ||||
| -rw-r--r-- | rust/binaryninjacore-sys/build.rs | 2 | ||||
| -rw-r--r-- | stubs/CMakeLists.txt | 2 |
4 files changed, 41 insertions, 44 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 197897a6..1c1f5263 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ project(binaryninjaapi CXX C) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") option(BN_API_BUILD_EXAMPLES "Builds example plugins" OFF) +option(BN_ALLOW_STUBS "Allow generating and linking against stubs if a Binary Ninja installation was not found" OFF) option(BN_REF_COUNT_DEBUG "Add extra debugging checks for RefCountObject leaks" OFF) mark_as_advanced(BN_REF_COUNT_DEBUG) @@ -33,29 +34,29 @@ add_library(binaryninjaapi STATIC ${BN_API_SOURCES}) target_include_directories(binaryninjaapi PUBLIC ${PROJECT_SOURCE_DIR}) +# Store path to user plugin dir +if(WIN32) + set(BN_USER_PLUGINS_DIR "$ENV{APPDATA}\\Binary Ninja\\plugins") +elseif(APPLE) + set(BN_USER_PLUGINS_DIR "$ENV{HOME}/Library/Application Support/Binary Ninja/plugins") +else() + set(BN_USER_PLUGINS_DIR "$ENV{HOME}/.binaryninja/plugins") +endif() +message(STATUS "Binary Ninja User Plugins Dir: ${BN_USER_PLUGINS_DIR}") + find_package(BinaryNinjaCore) if(BinaryNinjaCore_FOUND) target_link_libraries(binaryninjaapi PUBLIC ${BinaryNinjaCore_LIBRARIES}) target_link_directories(binaryninjaapi PUBLIC ${BinaryNinjaCore_LIBRARY_DIRS}) target_compile_definitions(binaryninjaapi PUBLIC ${BinaryNinjaCore_DEFINITIONS}) -else() +elseif(BN_ALLOW_STUBS) add_subdirectory(stubs EXCLUDE_FROM_ALL) # Be sure to only link against the stubs archive file add_dependencies(binaryninjaapi binaryninjacore_stubs) - - if(APPLE) - target_link_libraries(binaryninjaapi PUBLIC "$<TARGET_PROPERTY:binaryninjacore_stubs,ARCHIVE_OUTPUT_DIRECTORY>/$<TARGET_PROPERTY:binaryninjacore_stubs,OUTPUT_NAME>.dylib") - elseif(MSVC) - if(${CMAKE_GENERATOR} MATCHES "^Visual Studio") - # Visual Studio's generator adds the config to the file path - target_link_libraries(binaryninjaapi PUBLIC "$<TARGET_PROPERTY:binaryninjacore_stubs,ARCHIVE_OUTPUT_DIRECTORY>/$<CONFIG>/$<TARGET_PROPERTY:binaryninjacore_stubs,OUTPUT_NAME>.lib") - else() - target_link_libraries(binaryninjaapi PUBLIC "$<TARGET_PROPERTY:binaryninjacore_stubs,ARCHIVE_OUTPUT_DIRECTORY>/$<TARGET_PROPERTY:binaryninjacore_stubs,OUTPUT_NAME>.lib") - endif() - else() - target_link_libraries(binaryninjaapi PUBLIC "$<TARGET_PROPERTY:binaryninjacore_stubs,ARCHIVE_OUTPUT_DIRECTORY>/$<TARGET_PROPERTY:binaryninjacore_stubs,OUTPUT_NAME>.so.1") - endif() + target_link_libraries(binaryninjaapi PUBLIC binaryninjacore_stubs) +else() + message(FATAL_ERROR "No Binary Ninja installation was found and stub generation is disabled") endif() if(BN_REF_COUNT_DEBUG) @@ -111,25 +112,24 @@ if(NOT HEADLESS) endif() function(bn_install_plugin target) - if(NOT BN_INTERNAL_BUILD) - # Get API source directory so we can find BinaryNinjaCore - get_target_property(BN_API_SOURCE_DIR binaryninjaapi SOURCE_DIR) - message(STATUS "${BN_API_SOURCE_DIR}") - list(APPEND CMAKE_MODULE_PATH "${BN_API_SOURCE_DIR}/cmake") + if(WIN32) + set(BN_USER_PLUGINS_DIR "$ENV{APPDATA}\\Binary Ninja\\plugins") + elseif(APPLE) + set(BN_USER_PLUGINS_DIR "$ENV{HOME}/Library/Application Support/Binary Ninja/plugins") + else() + set(BN_USER_PLUGINS_DIR "$ENV{HOME}/.binaryninja/plugins") + endif() - # BinaryNinjaCore has the user plugins dir define that we want - find_package(BinaryNinjaCore) - if(BinaryNinjaCore_FOUND) - if(WIN32) - install(TARGETS ${target} RUNTIME - DESTINATION ${BinaryNinjaCore_USER_PLUGINS_DIR}) + if(NOT BN_INTERNAL_BUILD) + if(WIN32) + install(TARGETS ${target} RUNTIME + DESTINATION ${BN_USER_PLUGINS_DIR}) - install(FILES $<TARGET_PDB_FILE:${target}> - DESTINATION ${BinaryNinjaCore_USER_PLUGINS_DIR} OPTIONAL) - else() - install(TARGETS ${target} LIBRARY - DESTINATION ${BinaryNinjaCore_USER_PLUGINS_DIR}) - endif() + install(FILES $<TARGET_PDB_FILE:${target}> + DESTINATION ${BN_USER_PLUGINS_DIR} OPTIONAL) + else() + install(TARGETS ${target} LIBRARY + DESTINATION ${BN_USER_PLUGINS_DIR}) endif() endif() endfunction() diff --git a/cmake/FindBinaryNinjaCore.cmake b/cmake/FindBinaryNinjaCore.cmake index a702d4d9..30f53892 100644 --- a/cmake/FindBinaryNinjaCore.cmake +++ b/cmake/FindBinaryNinjaCore.cmake @@ -2,7 +2,6 @@ # Once done this will define # BinaryNinjaCore_FOUND - If Binary Ninja Core is found # BinaryNinjaCore_ROOT_DIR - The installation path of Binary Ninja -# BinaryNinjaCore_USER_PLUGINS_DIR - The path for user plugins # BinaryNinjaCore_INCLUDE_DIRS - The directories to include for compiling core plugins # BinaryNinjaCore_LIBRARIES - The libraries for linking core plugins # BinaryNinjaCore_LIBRARY_DIRS - The link paths required for core plugins @@ -34,6 +33,12 @@ if(NOT BN_INTERNAL_BUILD) NAMES binaryninjacore libbinaryninjacore.so.1 HINTS ${PATH_HINTS}) + if(NOT CORE_LIBRARY_FOUND) + set(BN_FOUND 0) + set(BinaryNinjaCore_FOUND 0) + return() + endif() + include(FindPackageHandleStandardArgs) find_package_handle_standard_args(BinaryNinjaCore FOUND_VAR BinaryNinjaCore_FOUND @@ -52,27 +57,22 @@ if(NOT BN_INTERNAL_BUILD) if(WIN32) set(BinaryNinjaCore_LIBRARY_DIRS "${INSTALL_BIN_DIR}") set(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}") - set(BinaryNinjaCore_USER_PLUGINS_DIR "$ENV{APPDATA}\\Binary Ninja\\plugins") elseif(APPLE) set(BinaryNinjaCore_LIBRARY_DIRS "${INSTALL_BIN_DIR}") # Binary Ninja.app/Contents/MacOS/binaryninja -> Binary Ninja.app/ get_filename_component(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}" DIRECTORY) get_filename_component(BinaryNinjaCore_ROOT_DIR "${BinaryNinjaCore_ROOT_DIR}" DIRECTORY) - set(BinaryNinjaCore_USER_PLUGINS_DIR "$ENV{HOME}/Library/Application Support/Binary Ninja/plugins") else() set(BinaryNinjaCore_LIBRARY_DIRS "${INSTALL_BIN_DIR}") set(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}") - set(BinaryNinjaCore_USER_PLUGINS_DIR "$ENV{HOME}/.binaryninja/plugins") endif() message(STATUS "Binary Ninja Install Dir: ${BinaryNinjaCore_ROOT_DIR}") - message(STATUS "Binary Ninja User Plugins Dir: ${BinaryNinjaCore_USER_PLUGINS_DIR}") # Compatibility set(BN_FOUND "${BinaryNinjaCore_FOUND}") set(BN_INSTALL_DIR "${BinaryNinjaCore_ROOT_DIR}") set(BN_INSTALL_BIN_DIR "${INSTALL_BIN_DIR}") - set(BN_USER_PLUGINS_DIR "${BinaryNinjaCore_USER_PLUGINS_DIR}") set(BN_CORE_LIBRARY "${CORE_LIBRARY}") set(BN_CORE_DEFINITIONS "${BinaryNinjaCore_DEFINITIONS}") else() @@ -81,15 +81,12 @@ else() if(WIN32) set(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}") - set(BinaryNinjaCore_USER_PLUGINS_DIR "$ENV{APPDATA}\\Binary Ninja\\plugins") elseif(APPLE) # Binary Ninja.app/Contents/MacOS/binaryninja -> Binary Ninja.app/ get_filename_component(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}" DIRECTORY) get_filename_component(BinaryNinjaCore_ROOT_DIR "${BinaryNinjaCore_ROOT_DIR}" DIRECTORY) - set(BinaryNinjaCore_USER_PLUGINS_DIR "$ENV{HOME}/Library/Application Support/Binary Ninja/plugins") else() set(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}") - set(BinaryNinjaCore_USER_PLUGINS_DIR "$ENV{HOME}/.binaryninja/plugins") endif() set(BinaryNinjaCore_FOUND 1) @@ -98,16 +95,14 @@ else() set(BinaryNinjaCore_LIBRARIES binaryninjacore) set(BinaryNinjaCore_LIBRARY_DIRS "${INSTALL_BIN_DIR}") set(BinaryNinjaCore_DEFINITIONS "") - + message(STATUS "Found Binary Ninja Core: binaryninjacore") message(STATUS "Binary Ninja Link Dirs: ${INSTALL_BIN_DIR}") message(STATUS "Binary Ninja Install Dir: ${BinaryNinjaCore_ROOT_DIR}") - message(STATUS "Binary Ninja User Plugins Dir: ${BinaryNinjaCore_USER_PLUGINS_DIR}") set(BN_FOUND "${BinaryNinjaCore_FOUND}") set(BN_INSTALL_DIR "${BinaryNinjaCore_ROOT_DIR}") set(BN_INSTALL_BIN_DIR "${INSTALL_BIN_DIR}") - set(BN_USER_PLUGINS_DIR "${BinaryNinjaCore_USER_PLUGINS_DIR}") set(BN_CORE_LIBRARY binaryninjacore) set(BN_CORE_DEFINITIONS "${BinaryNinjaCore_DEFINITIONS}") endif() diff --git a/rust/binaryninjacore-sys/build.rs b/rust/binaryninjacore-sys/build.rs index 672615da..9a83b5d0 100644 --- a/rust/binaryninjacore-sys/build.rs +++ b/rust/binaryninjacore-sys/build.rs @@ -51,6 +51,8 @@ fn generate_stubs() -> PathBuf { .unwrap(); let stubs_path = api_base_path.join("stubs"); + + // TODO: does visual studio add the config name as a subdirectory? cmake::Config::new(stubs_path) .generator("Ninja") .build() diff --git a/stubs/CMakeLists.txt b/stubs/CMakeLists.txt index 35ab6177..a3cdda47 100644 --- a/stubs/CMakeLists.txt +++ b/stubs/CMakeLists.txt @@ -28,7 +28,7 @@ set_target_properties(binaryninjacore_stubs CXX_STANDARD_REQUIRED ON VISIBILITY_INLINES_HIDDEN ON POSITION_INDEPENDENT_CODE ON - ARCHIVE_OUTPUT_DIRECTORY $<1:${PROJECT_BINARY_DIR}> + ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}" ) target_include_directories(binaryninjacore_stubs PUBLIC ${ABSOLUTE_API_PATH}) |
