summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Ferrell <josh@vector35.com>2025-09-26 13:49:38 -0400
committerJosh Ferrell <josh@vector35.com>2025-09-29 14:42:30 -0400
commit4870c90e6fbf31898c57db04f97c69f647157fd5 (patch)
tree463f7097173c500b055219caffbbdbbd673f23c1
parentdf599006c0a805dda992910722ac69a9adf794fc (diff)
Allow generating and linking to stubs from cmake
-rw-r--r--CMakeLists.txt62
-rw-r--r--cmake/FindBinaryNinjaCore.cmake19
-rw-r--r--rust/binaryninjacore-sys/build.rs2
-rw-r--r--stubs/CMakeLists.txt2
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})