summaryrefslogtreecommitdiff
path: root/cmake
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2022-02-01 16:34:18 -0500
committerGlenn Smith <glenn@vector35.com>2022-02-02 19:22:08 -0500
commitb8af211f9a3647687c7e45c0fd04b0768df87ffe (patch)
tree64f13fe262399189d70aadf33e1c6e33f0a74c3e /cmake
parent5f5785fd2b1cee6bc9a082e1209de00b1497d410 (diff)
Fancier CMake: find scripts, out-of-tree example builds
Diffstat (limited to 'cmake')
-rw-r--r--cmake/FindBinaryNinjaCore.cmake111
-rw-r--r--cmake/FindBinaryNinjaUI.cmake63
2 files changed, 174 insertions, 0 deletions
diff --git a/cmake/FindBinaryNinjaCore.cmake b/cmake/FindBinaryNinjaCore.cmake
new file mode 100644
index 00000000..e497e794
--- /dev/null
+++ b/cmake/FindBinaryNinjaCore.cmake
@@ -0,0 +1,111 @@
+# Try to find a Binary Ninja installation
+# 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
+# BinaryNinjaCore_DEFINITIONS - Compiler switches required for core plugins
+#
+# According to Good CMake Hygiene, we should use BinaryNinjaCore_<VAR> named variables.
+# Existing plugins likely use BN_<VAR> names already, so both are provided.
+
+cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
+
+if(NOT BN_INTERNAL_BUILD)
+ set(PATH_HINTS "$ENV{BN_INSTALL_DIR}")
+ if(WIN32)
+ # System-wide install
+ list(APPEND PATH_HINTS "C:\\Program Files\\Vector35\\BinaryNinja")
+ # User install
+ list(APPEND PATH_HINTS "$ENV{LocalAppData}\\Vector35\\BinaryNinja")
+ elseif(APPLE)
+ list(APPEND PATH_HINTS "/Applications/Binary Ninja.app/Contents/MacOS")
+ list(APPEND PATH_HINTS "$ENV{HOME}/Applications/Binary Ninja.app/Contents/MacOS")
+ list(APPEND PATH_HINTS "$ENV{BN_INSTALL_DIR}/Contents/MacOS")
+ else()
+ list(APPEND PATH_HINTS "$ENV{HOME}/binaryninja")
+ endif()
+
+ find_library(CORE_LIBRARY
+ NAMES binaryninjacore libbinaryninjacore.so.1
+ HINTS ${PATH_HINTS})
+
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(BinaryNinjaCore
+ FOUND_VAR BinaryNinjaCore_FOUND
+ REQUIRED_VARS CORE_LIBRARY
+ FAIL_MESSAGE "Could NOT find Binary Ninja installation. Please configure with -DBN_INSTALL_DIR=<path to Binary Ninja> or set the BN_INSTALL_DIR environment variable.")
+
+ message(STATUS "Found Binary Ninja Core: ${CORE_LIBRARY}")
+
+ set(BinaryNinjaCore_INCLUDE_DIRS "")
+ set(BinaryNinjaCore_LIBRARIES "${CORE_LIBRARY}")
+ set(BinaryNinjaCore_DEFINITIONS "")
+
+ get_filename_component(INSTALL_BIN_DIR "${CORE_LIBRARY}" DIRECTORY)
+ message(STATUS "Binary Ninja Link Dirs: ${INSTALL_BIN_DIR}")
+
+ 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()
+ # Internal build
+ set(INSTALL_BIN_DIR "${BN_CORE_OUTPUT_DIR}")
+
+ 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)
+ set(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}")
+ set(BinaryNinjaCore_INCLUDE_DIRS "")
+ 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/cmake/FindBinaryNinjaUI.cmake b/cmake/FindBinaryNinjaUI.cmake
new file mode 100644
index 00000000..608d2d87
--- /dev/null
+++ b/cmake/FindBinaryNinjaUI.cmake
@@ -0,0 +1,63 @@
+# Try to find Binary Ninja UI
+# Once done this will define
+# BinaryNinjaUI_FOUND - If Binary Ninja UI is found
+# BinaryNinjaUI_INCLUDE_DIRS - The directories to include for compiling UI plugins
+# BinaryNinjaUI_LIBRARIES - The libraries for linking UI plugins
+# BinaryNinjaUI_LIBRARY_DIRS - The link paths required for ui plugins
+# BinaryNinjaUI_DEFINITIONS - Compiler switches required for UI plugins
+
+cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
+
+find_package(BinaryNinjaCore REQUIRED)
+
+find_library(UI_LIBRARY
+ NAMES binaryninjaui libbinaryninjaui.so.1
+ HINTS ${BinaryNinjaCore_LIBRARY_DIRS})
+
+# Use qmake to find the qt6 cmake libs, if we have it in PATH
+find_program(QMAKE_COMMAND qmake)
+if(QMAKE_COMMAND)
+ # qmake will tell us where the libs are!
+ execute_process(
+ COMMAND ${QMAKE_COMMAND} -query QT_INSTALL_LIBS
+ OUTPUT_VARIABLE QT_LIB_PATH
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ # Qt cmake files are in QT_INSTALL_LIBS/cmake
+ set(QT_CMAKE_PATH "${QT_LIB_PATH}/cmake")
+ message(STATUS "Found Qt CMake path: ${QT_CMAKE_PATH}")
+ list(APPEND CMAKE_MODULE_PATH ${QT_CMAKE_PATH})
+endif()
+
+# Also find Qt6 which is required
+find_package(Qt6 COMPONENTS Core Gui Widgets)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(BinaryNinjaUI
+ FOUND_VAR BinaryNinjaUI_FOUND
+ REQUIRED_VARS UI_LIBRARY Qt6_FOUND
+ FAIL_MESSAGE "Could NOT find Binary Ninja UI installation. Check that you are using a valid Binary Ninja, non-headless install, and qmake is in your PATH.")
+
+if(NOT Qt6_FOUND)
+ message(WARNING "Could not find Qt6! Make sure qmake is in your PATH.")
+else()
+ message(STATUS "Found Binary Ninja UI: ${UI_LIBRARY}")
+endif()
+
+# UI headers are added in the api cmake
+set(BinaryNinjaUI_INCLUDE_DIRS "")
+
+set(BinaryNinjaUI_LIBRARIES "${UI_LIBRARY}")
+list(APPEND BinaryNinjaUI_LIBRARIES Qt6::Core)
+list(APPEND BinaryNinjaUI_LIBRARIES Qt6::Gui)
+list(APPEND BinaryNinjaUI_LIBRARIES Qt6::Widgets)
+set(BinaryNinjaUI_DEFINITIONS "")
+set(BinaryNinjaUI_LIBRARY_DIRS "${BinaryNinjaCore_LIBRARY_DIRS}")
+
+# Compatibility
+set(BN_UI_LIBRARY "${UI_LIBRARY}")
+set(BN_UI_LIBRARY_DIRS "${BinaryNinjaUI_LIBRARY_DIRS}")
+set(BN_UI_DEFINITIONS "${BinaryNinjaUI_DEFINITIONS}")
+
+
+