1- cmake_minimum_required (VERSION 3.13 FATAL_ERROR )
1+ cmake_minimum_required (VERSION 3.15 FATAL_ERROR )
22
33project (binaryninjaapi CXX C )
44list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR} /cmake" )
55
66option (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
89option (BN_REF_COUNT_DEBUG "Add extra debugging checks for RefCountObject leaks" OFF )
910mark_as_advanced (BN_REF_COUNT_DEBUG )
@@ -33,46 +34,39 @@ add_library(binaryninjaapi STATIC ${BN_API_SOURCES})
3334target_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+
3647find_package (BinaryNinjaCore )
3748if (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} )
52+ elseif (BN_ALLOW_STUBS)
53+ add_subdirectory (stubs EXCLUDE_FROM_ALL )
54+
55+ # Be sure to only link against the stubs archive file
56+ add_dependencies (binaryninjaapi binaryninjacore_stubs )
57+ target_link_libraries (binaryninjaapi PUBLIC binaryninjacore_stubs )
4158else ()
42- if (APPLE )
43- target_link_options (binaryninjaapi PUBLIC -undefined dynamic_lookup )
44- elseif (MSVC )
45- # Generate stubs.cpp with implementations of all the BNAPI functions
46- execute_process (COMMAND python ${PROJECT_SOURCE_DIR} /cmake/generate_stubs.py ${PROJECT_SOURCE_DIR} /binaryninjacore.h ${PROJECT_BINARY_DIR} /stubs )
47-
48- # Compile those stubs into a stub library we can use to fool the linker
49- add_library (binaryninjacore SHARED ${PROJECT_BINARY_DIR} /stubs/stubs.cpp )
50- set_target_properties (binaryninjacore
51- PROPERTIES OUTPUT_NAME binaryninjacore
52- SOVERSION 1
53- ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} /stubs
54- LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} /stubs
55- RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} /stubs
56- )
57- target_include_directories (binaryninjacore PUBLIC ${PROJECT_SOURCE_DIR} )
58-
59- # Be sure to only link against the stubs archive file
60- add_dependencies (binaryninjaapi binaryninjacore )
61- if (${CMAKE_GENERATOR} MATCHES "^Visual Studio" )
62- # Visual Studio's generator adds the config to the file path
63- target_link_libraries (binaryninjaapi PUBLIC "$<TARGET_PROPERTY :binaryninjacore ,ARCHIVE_OUTPUT_DIRECTORY >/$<CONFIG >/$<TARGET_PROPERTY :binaryninjacore ,OUTPUT_NAME >.lib" )
64- else ()
65- target_link_libraries (binaryninjaapi PUBLIC "$<TARGET_PROPERTY :binaryninjacore ,ARCHIVE_OUTPUT_DIRECTORY >/$<TARGET_PROPERTY :binaryninjacore ,OUTPUT_NAME >.lib" )
66- endif ()
67- else ()
68- target_link_options (binaryninjaapi PUBLIC "LINKER:--allow-shlib-undefined" )
69- endif ()
59+ message (FATAL_ERROR "No Binary Ninja installation was found and stub generation is disabled" )
7060endif ()
7161
7262if (BN_REF_COUNT_DEBUG)
7363 target_compile_definitions (binaryninjaapi PUBLIC BN_REF_COUNT_DEBUG )
7464endif ()
7565
66+ if (CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)
67+ target_compile_definitions (binaryninjaapi PRIVATE BN_ENABLE_LOG_TRACE )
68+ endif ()
69+
7670add_subdirectory (vendor/fmt EXCLUDE_FROM_ALL )
7771set_target_properties (fmt PROPERTIES POSITION_INDEPENDENT_CODE ON )
7872target_link_libraries (binaryninjaapi PUBLIC fmt::fmt )
@@ -83,7 +77,7 @@ if(APPLE)
8377endif ()
8478
8579set_target_properties (binaryninjaapi PROPERTIES
86- CXX_STANDARD 17
80+ CXX_STANDARD 20
8781 CXX_VISIBILITY_PRESET hidden
8882 CXX_STANDARD_REQUIRED ON
8983 VISIBILITY_INLINES_HIDDEN ON
@@ -99,7 +93,7 @@ if(NOT HEADLESS)
9993 if (BinaryNinjaUI_FOUND)
10094 # Precompiled ui library
10195 add_library (binaryninjaui INTERFACE )
102- target_link_libraries (binaryninjaui INTERFACE ${BinaryNinjaUI_LIBRARIES} )
96+ target_link_libraries (binaryninjaui INTERFACE binaryninjaapi ${BinaryNinjaUI_LIBRARIES} )
10397 target_link_directories (binaryninjaui INTERFACE ${BinaryNinjaUI_LIBRARY_DIRS} )
10498 target_compile_definitions (binaryninjaui INTERFACE ${BinaryNinjaUI_DEFINITIONS} )
10599
@@ -118,25 +112,24 @@ if(NOT HEADLESS)
118112endif ()
119113
120114function (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+
121123 if (NOT BN_INTERNAL_BUILD)
122- # Get API source directory so we can find BinaryNinjaCore
123- get_target_property (BN_API_SOURCE_DIR binaryninjaapi SOURCE_DIR )
124- message (STATUS "${BN_API_SOURCE_DIR} " )
125- list (APPEND CMAKE_MODULE_PATH "${BN_API_SOURCE_DIR} /cmake" )
126-
127- # BinaryNinjaCore has the user plugins dir define that we want
128- find_package (BinaryNinjaCore )
129- if (BinaryNinjaCore_FOUND)
130- if (WIN32 )
131- install (TARGETS ${target} RUNTIME
132- DESTINATION ${BinaryNinjaCore_USER_PLUGINS_DIR} )
133-
134- install (FILES $<TARGET_PDB_FILE :${target} >
135- DESTINATION ${BinaryNinjaCore_USER_PLUGINS_DIR} OPTIONAL )
136- else ()
137- install (TARGETS ${target} LIBRARY
138- DESTINATION ${BinaryNinjaCore_USER_PLUGINS_DIR} )
139- 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} )
140133 endif ()
141134 endif ()
142135endfunction ()
0 commit comments