diff options
| author | Glenn Smith <glenn@vector35.com> | 2022-02-01 16:34:18 -0500 |
|---|---|---|
| committer | Glenn Smith <glenn@vector35.com> | 2022-02-02 19:22:08 -0500 |
| commit | b8af211f9a3647687c7e45c0fd04b0768df87ffe (patch) | |
| tree | 64f13fe262399189d70aadf33e1c6e33f0a74c3e /CMakeLists.txt | |
| parent | 5f5785fd2b1cee6bc9a082e1209de00b1497d410 (diff) | |
Fancier CMake: find scripts, out-of-tree example builds
Diffstat (limited to 'CMakeLists.txt')
| -rw-r--r-- | CMakeLists.txt | 116 |
1 files changed, 41 insertions, 75 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index b504c1b4..029c53c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required(VERSION 3.13 FATAL_ERROR) -project(binaryninjaapi) +project(binaryninjaapi CXX C) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") option(BN_API_BUILD_EXAMPLES "Builds example plugins" OFF) @@ -14,35 +15,6 @@ if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) endif() endif() -if(WIN32) - if(NOT BN_INSTALL_DIR) - set(BN_INSTALL_DIR "C:\\Program Files\\Vector35\\BinaryNinja" - CACHE PATH "Binary Ninja installation directory") - endif() - set(BN_INSTALL_BIN_DIR "${BN_INSTALL_DIR}" - CACHE PATH "Binary Ninja binary directory") - set(BN_USER_PLUGINS_DIR "$ENV{APPDATA}/Binary Ninja/plugins" - CACHE PATH "Binary Ninja user plugins directory") -elseif(APPLE) - if(NOT BN_INSTALL_DIR) - set(BN_INSTALL_DIR "/Applications/Binary Ninja.app" - CACHE PATH "Binary Ninja installation directory") - endif() - set(BN_INSTALL_BIN_DIR "${BN_INSTALL_DIR}/Contents/MacOS" - CACHE PATH "Binary Ninja binary directory") - set(BN_USER_PLUGINS_DIR "$ENV{HOME}/Library/Application Support/Binary Ninja/plugins" - CACHE PATH "Binary Ninja user plugins directory") -else() - if(NOT BN_INSTALL_DIR) - set(BN_INSTALL_DIR "$ENV{HOME}/binaryninja" - CACHE PATH "Binary Ninja installation directory") - endif() - set(BN_INSTALL_BIN_DIR "${BN_INSTALL_DIR}" - CACHE PATH "Binary Ninja binary directory") - set(BN_USER_PLUGINS_DIR "$ENV{HOME}/.binaryninja/plugins" - CACHE PATH "Binary Ninja user plugins directory") -endif() - file(GLOB BN_API_SOURCES *.cpp *.h json/json.h json/json-forwards.h) if(NOT DEMO) list(APPEND BN_API_SOURCES json/jsoncpp.cpp) @@ -53,70 +25,64 @@ add_library(binaryninjaapi STATIC ${BN_API_SOURCES}) target_include_directories(binaryninjaapi PUBLIC ${PROJECT_SOURCE_DIR}) -# We only need to find the core and UI when we also build the examples -if((NOT BN_CORE_LIBRARY) AND (NOT BN_INTERNAL_BUILD)) - find_library(BN_CORE_LIBRARY REQUIRED - NAMES binaryninjacore libbinaryninjacore.so.1 - PATHS ${BN_INSTALL_BIN_DIR}) +find_package(BinaryNinjaCore REQUIRED) +target_link_libraries(binaryninjaapi PUBLIC ${BinaryNinjaCore_LIBRARIES}) +target_link_directories(binaryninjaapi PUBLIC ${BinaryNinjaCore_LIBRARY_DIRS}) +target_compile_definitions(binaryninjaapi PUBLIC ${BinaryNinjaCore_DEFINITIONS}) - if(BN_CORE_LIBRARY) - message(STATUS "Binary Ninja Core: ${BN_CORE_LIBRARY}") - else() - message(FATAL_ERROR "Binary Ninja Core Not Found") - endif() -endif() +set_target_properties(binaryninjaapi PROPERTIES + CXX_STANDARD 17 + CXX_VISIBILITY_PRESET hidden + CXX_STANDARD_REQUIRED ON + VISIBILITY_INLINES_HIDDEN ON + POSITION_INDEPENDENT_CODE ON + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/out) if(NOT HEADLESS) - if((NOT BN_UI_LIBRARY) AND (NOT BN_INTERNAL_BUILD)) - find_library(BN_UI_LIBRARY REQUIRED - NAMES binaryninjaui libbinaryninjaui.so.1 - PATHS ${BN_INSTALL_BIN_DIR}) + if(NOT BN_INTERNAL_BUILD) + # For backwards compatibility, include binaryninjaui in the api module + # If you don't need it, you can safely ignore these warnings - if(BN_UI_LIBRARY) - message(STATUS "Binary Ninja UI: ${BN_UI_LIBRARY}") + find_package(BinaryNinjaUI) + if(BinaryNinjaUI_FOUND) + # Precompiled ui library + add_library(binaryninjaui INTERFACE) + target_link_libraries(binaryninjaui INTERFACE ${BinaryNinjaUI_LIBRARIES}) + target_link_directories(binaryninjaui INTERFACE ${BinaryNinjaUI_LIBRARY_DIRS}) + target_compile_definitions(binaryninjaui INTERFACE ${BinaryNinjaUI_DEFINITIONS}) + + # UI headers are in here + target_include_directories(binaryninjaui INTERFACE ${PROJECT_SOURCE_DIR}/ui) else() - message(FATAL_ERROR "Binary Ninja UI Not Found") + # Add a fake target for binaryninjaui to intentionally break anything that tries to link against it, + # since the find script failed and your build would otherwise break in less obvious places. + add_custom_target(binaryninjaui + COMMAND ${CMAKE_COMMAND} -E false) + message(WARNING "Binary Ninja UI not found but -DHEADLESS was not specified. You will not be able to build UI plugins.") endif() - endif() -endif() - -if(NOT BN_INTERNAL_BUILD) - target_link_libraries(binaryninjaapi PUBLIC ${BN_CORE_LIBRARY}) - target_link_directories(binaryninjaapi PUBLIC ${BN_INSTALL_BIN_DIR}) -else() - target_link_libraries(binaryninjaapi PUBLIC binaryninjacore) -endif() - -if(NOT HEADLESS) - target_include_directories(binaryninjaapi PUBLIC ${PROJECT_SOURCE_DIR}/ui) - - if(NOT BN_INTERNAL_BUILD) - target_link_libraries(binaryninjaapi PUBLIC ${BN_UI_LIBRARY}) - target_link_directories(binaryninjaapi PUBLIC ${BN_INSTALL_BIN_DIR}) else() # Nothing endif() endif() -set_target_properties(binaryninjaapi PROPERTIES - CXX_STANDARD 17 - CXX_VISIBILITY_PRESET hidden - CXX_STANDARD_REQUIRED ON - VISIBILITY_INLINES_HIDDEN ON - POSITION_INDEPENDENT_CODE ON - ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/out) - 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") + + # BinaryNinjaCore has the user plugins dir define that we want + find_package(BinaryNinjaCore REQUIRED) if(WIN32) install(TARGETS ${target} RUNTIME - DESTINATION ${BN_USER_PLUGINS_DIR}) + DESTINATION ${BinaryNinjaCore_USER_PLUGINS_DIR}) install(FILES $<TARGET_PDB_FILE:${target}> - DESTINATION ${BN_USER_PLUGINS_DIR} OPTIONAL) + DESTINATION ${BinaryNinjaCore_USER_PLUGINS_DIR} OPTIONAL) else() install(TARGETS ${target} LIBRARY - DESTINATION ${BN_USER_PLUGINS_DIR}) + DESTINATION ${BinaryNinjaCore_USER_PLUGINS_DIR}) endif() endif() endfunction() |
