Skip to content

Commit 4870c90

Browse files
committed
Allow generating and linking to stubs from cmake
1 parent df59900 commit 4870c90

File tree

4 files changed

+42
-45
lines changed

4 files changed

+42
-45
lines changed

CMakeLists.txt

Lines changed: 32 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ project(binaryninjaapi CXX C)
44
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
55

66
option(BN_API_BUILD_EXAMPLES "Builds example plugins" OFF)
7+
option(BN_ALLOW_STUBS "Allow generating and linking against stubs if a Binary Ninja installation was not found" OFF)
78

89
option(BN_REF_COUNT_DEBUG "Add extra debugging checks for RefCountObject leaks" OFF)
910
mark_as_advanced(BN_REF_COUNT_DEBUG)
@@ -33,29 +34,29 @@ add_library(binaryninjaapi STATIC ${BN_API_SOURCES})
3334
target_include_directories(binaryninjaapi
3435
PUBLIC ${PROJECT_SOURCE_DIR})
3536

37+
# Store path to user plugin dir
38+
if(WIN32)
39+
set(BN_USER_PLUGINS_DIR "$ENV{APPDATA}\\Binary Ninja\\plugins")
40+
elseif(APPLE)
41+
set(BN_USER_PLUGINS_DIR "$ENV{HOME}/Library/Application Support/Binary Ninja/plugins")
42+
else()
43+
set(BN_USER_PLUGINS_DIR "$ENV{HOME}/.binaryninja/plugins")
44+
endif()
45+
message(STATUS "Binary Ninja User Plugins Dir: ${BN_USER_PLUGINS_DIR}")
46+
3647
find_package(BinaryNinjaCore)
3748
if(BinaryNinjaCore_FOUND)
3849
target_link_libraries(binaryninjaapi PUBLIC ${BinaryNinjaCore_LIBRARIES})
3950
target_link_directories(binaryninjaapi PUBLIC ${BinaryNinjaCore_LIBRARY_DIRS})
4051
target_compile_definitions(binaryninjaapi PUBLIC ${BinaryNinjaCore_DEFINITIONS})
41-
else()
52+
elseif(BN_ALLOW_STUBS)
4253
add_subdirectory(stubs EXCLUDE_FROM_ALL)
4354

4455
# Be sure to only link against the stubs archive file
4556
add_dependencies(binaryninjaapi binaryninjacore_stubs)
46-
47-
if(APPLE)
48-
target_link_libraries(binaryninjaapi PUBLIC "$<TARGET_PROPERTY:binaryninjacore_stubs,ARCHIVE_OUTPUT_DIRECTORY>/$<TARGET_PROPERTY:binaryninjacore_stubs,OUTPUT_NAME>.dylib")
49-
elseif(MSVC)
50-
if(${CMAKE_GENERATOR} MATCHES "^Visual Studio")
51-
# Visual Studio's generator adds the config to the file path
52-
target_link_libraries(binaryninjaapi PUBLIC "$<TARGET_PROPERTY:binaryninjacore_stubs,ARCHIVE_OUTPUT_DIRECTORY>/$<CONFIG>/$<TARGET_PROPERTY:binaryninjacore_stubs,OUTPUT_NAME>.lib")
53-
else()
54-
target_link_libraries(binaryninjaapi PUBLIC "$<TARGET_PROPERTY:binaryninjacore_stubs,ARCHIVE_OUTPUT_DIRECTORY>/$<TARGET_PROPERTY:binaryninjacore_stubs,OUTPUT_NAME>.lib")
55-
endif()
56-
else()
57-
target_link_libraries(binaryninjaapi PUBLIC "$<TARGET_PROPERTY:binaryninjacore_stubs,ARCHIVE_OUTPUT_DIRECTORY>/$<TARGET_PROPERTY:binaryninjacore_stubs,OUTPUT_NAME>.so.1")
58-
endif()
57+
target_link_libraries(binaryninjaapi PUBLIC binaryninjacore_stubs)
58+
else()
59+
message(FATAL_ERROR "No Binary Ninja installation was found and stub generation is disabled")
5960
endif()
6061

6162
if(BN_REF_COUNT_DEBUG)
@@ -111,25 +112,24 @@ if(NOT HEADLESS)
111112
endif()
112113

113114
function(bn_install_plugin target)
115+
if(WIN32)
116+
set(BN_USER_PLUGINS_DIR "$ENV{APPDATA}\\Binary Ninja\\plugins")
117+
elseif(APPLE)
118+
set(BN_USER_PLUGINS_DIR "$ENV{HOME}/Library/Application Support/Binary Ninja/plugins")
119+
else()
120+
set(BN_USER_PLUGINS_DIR "$ENV{HOME}/.binaryninja/plugins")
121+
endif()
122+
114123
if(NOT BN_INTERNAL_BUILD)
115-
# Get API source directory so we can find BinaryNinjaCore
116-
get_target_property(BN_API_SOURCE_DIR binaryninjaapi SOURCE_DIR)
117-
message(STATUS "${BN_API_SOURCE_DIR}")
118-
list(APPEND CMAKE_MODULE_PATH "${BN_API_SOURCE_DIR}/cmake")
119-
120-
# BinaryNinjaCore has the user plugins dir define that we want
121-
find_package(BinaryNinjaCore)
122-
if(BinaryNinjaCore_FOUND)
123-
if(WIN32)
124-
install(TARGETS ${target} RUNTIME
125-
DESTINATION ${BinaryNinjaCore_USER_PLUGINS_DIR})
126-
127-
install(FILES $<TARGET_PDB_FILE:${target}>
128-
DESTINATION ${BinaryNinjaCore_USER_PLUGINS_DIR} OPTIONAL)
129-
else()
130-
install(TARGETS ${target} LIBRARY
131-
DESTINATION ${BinaryNinjaCore_USER_PLUGINS_DIR})
132-
endif()
124+
if(WIN32)
125+
install(TARGETS ${target} RUNTIME
126+
DESTINATION ${BN_USER_PLUGINS_DIR})
127+
128+
install(FILES $<TARGET_PDB_FILE:${target}>
129+
DESTINATION ${BN_USER_PLUGINS_DIR} OPTIONAL)
130+
else()
131+
install(TARGETS ${target} LIBRARY
132+
DESTINATION ${BN_USER_PLUGINS_DIR})
133133
endif()
134134
endif()
135135
endfunction()

cmake/FindBinaryNinjaCore.cmake

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
# Once done this will define
33
# BinaryNinjaCore_FOUND - If Binary Ninja Core is found
44
# BinaryNinjaCore_ROOT_DIR - The installation path of Binary Ninja
5-
# BinaryNinjaCore_USER_PLUGINS_DIR - The path for user plugins
65
# BinaryNinjaCore_INCLUDE_DIRS - The directories to include for compiling core plugins
76
# BinaryNinjaCore_LIBRARIES - The libraries for linking core plugins
87
# BinaryNinjaCore_LIBRARY_DIRS - The link paths required for core plugins
@@ -34,6 +33,12 @@ if(NOT BN_INTERNAL_BUILD)
3433
NAMES binaryninjacore libbinaryninjacore.so.1
3534
HINTS ${PATH_HINTS})
3635

36+
if(NOT CORE_LIBRARY_FOUND)
37+
set(BN_FOUND 0)
38+
set(BinaryNinjaCore_FOUND 0)
39+
return()
40+
endif()
41+
3742
include(FindPackageHandleStandardArgs)
3843
find_package_handle_standard_args(BinaryNinjaCore
3944
FOUND_VAR BinaryNinjaCore_FOUND
@@ -52,27 +57,22 @@ if(NOT BN_INTERNAL_BUILD)
5257
if(WIN32)
5358
set(BinaryNinjaCore_LIBRARY_DIRS "${INSTALL_BIN_DIR}")
5459
set(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}")
55-
set(BinaryNinjaCore_USER_PLUGINS_DIR "$ENV{APPDATA}\\Binary Ninja\\plugins")
5660
elseif(APPLE)
5761
set(BinaryNinjaCore_LIBRARY_DIRS "${INSTALL_BIN_DIR}")
5862
# Binary Ninja.app/Contents/MacOS/binaryninja -> Binary Ninja.app/
5963
get_filename_component(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}" DIRECTORY)
6064
get_filename_component(BinaryNinjaCore_ROOT_DIR "${BinaryNinjaCore_ROOT_DIR}" DIRECTORY)
61-
set(BinaryNinjaCore_USER_PLUGINS_DIR "$ENV{HOME}/Library/Application Support/Binary Ninja/plugins")
6265
else()
6366
set(BinaryNinjaCore_LIBRARY_DIRS "${INSTALL_BIN_DIR}")
6467
set(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}")
65-
set(BinaryNinjaCore_USER_PLUGINS_DIR "$ENV{HOME}/.binaryninja/plugins")
6668
endif()
6769

6870
message(STATUS "Binary Ninja Install Dir: ${BinaryNinjaCore_ROOT_DIR}")
69-
message(STATUS "Binary Ninja User Plugins Dir: ${BinaryNinjaCore_USER_PLUGINS_DIR}")
7071

7172
# Compatibility
7273
set(BN_FOUND "${BinaryNinjaCore_FOUND}")
7374
set(BN_INSTALL_DIR "${BinaryNinjaCore_ROOT_DIR}")
7475
set(BN_INSTALL_BIN_DIR "${INSTALL_BIN_DIR}")
75-
set(BN_USER_PLUGINS_DIR "${BinaryNinjaCore_USER_PLUGINS_DIR}")
7676
set(BN_CORE_LIBRARY "${CORE_LIBRARY}")
7777
set(BN_CORE_DEFINITIONS "${BinaryNinjaCore_DEFINITIONS}")
7878
else()
@@ -81,15 +81,12 @@ else()
8181

8282
if(WIN32)
8383
set(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}")
84-
set(BinaryNinjaCore_USER_PLUGINS_DIR "$ENV{APPDATA}\\Binary Ninja\\plugins")
8584
elseif(APPLE)
8685
# Binary Ninja.app/Contents/MacOS/binaryninja -> Binary Ninja.app/
8786
get_filename_component(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}" DIRECTORY)
8887
get_filename_component(BinaryNinjaCore_ROOT_DIR "${BinaryNinjaCore_ROOT_DIR}" DIRECTORY)
89-
set(BinaryNinjaCore_USER_PLUGINS_DIR "$ENV{HOME}/Library/Application Support/Binary Ninja/plugins")
9088
else()
9189
set(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}")
92-
set(BinaryNinjaCore_USER_PLUGINS_DIR "$ENV{HOME}/.binaryninja/plugins")
9390
endif()
9491

9592
set(BinaryNinjaCore_FOUND 1)
@@ -98,16 +95,14 @@ else()
9895
set(BinaryNinjaCore_LIBRARIES binaryninjacore)
9996
set(BinaryNinjaCore_LIBRARY_DIRS "${INSTALL_BIN_DIR}")
10097
set(BinaryNinjaCore_DEFINITIONS "")
101-
98+
10299
message(STATUS "Found Binary Ninja Core: binaryninjacore")
103100
message(STATUS "Binary Ninja Link Dirs: ${INSTALL_BIN_DIR}")
104101
message(STATUS "Binary Ninja Install Dir: ${BinaryNinjaCore_ROOT_DIR}")
105-
message(STATUS "Binary Ninja User Plugins Dir: ${BinaryNinjaCore_USER_PLUGINS_DIR}")
106102

107103
set(BN_FOUND "${BinaryNinjaCore_FOUND}")
108104
set(BN_INSTALL_DIR "${BinaryNinjaCore_ROOT_DIR}")
109105
set(BN_INSTALL_BIN_DIR "${INSTALL_BIN_DIR}")
110-
set(BN_USER_PLUGINS_DIR "${BinaryNinjaCore_USER_PLUGINS_DIR}")
111106
set(BN_CORE_LIBRARY binaryninjacore)
112107
set(BN_CORE_DEFINITIONS "${BinaryNinjaCore_DEFINITIONS}")
113108
endif()

rust/binaryninjacore-sys/build.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ fn generate_stubs() -> PathBuf {
5151
.unwrap();
5252

5353
let stubs_path = api_base_path.join("stubs");
54+
55+
// TODO: does visual studio add the config name as a subdirectory?
5456
cmake::Config::new(stubs_path)
5557
.generator("Ninja")
5658
.build()

stubs/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ set_target_properties(binaryninjacore_stubs
2828
CXX_STANDARD_REQUIRED ON
2929
VISIBILITY_INLINES_HIDDEN ON
3030
POSITION_INDEPENDENT_CODE ON
31-
ARCHIVE_OUTPUT_DIRECTORY $<1:${PROJECT_BINARY_DIR}>
31+
ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}"
3232
)
3333

3434
target_include_directories(binaryninjacore_stubs PUBLIC ${ABSOLUTE_API_PATH})

0 commit comments

Comments
 (0)