summaryrefslogtreecommitdiff
path: root/cmake/FindBinaryNinjaCore.cmake
blob: cc436dea7d988111cd9f1f342d27207039b38f22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# 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_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.15 FATAL_ERROR)

if(NOT BN_INTERNAL_BUILD)
    set(PATH_HINTS "$ENV{BN_INSTALL_DIR}" "${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")
        list(APPEND PATH_HINTS "$ENV{LocalAppData}\\Programs\\Vector35\\BinaryNinja")
    elseif(APPLE)
        list(APPEND PATH_HINTS "${BN_INSTALL_DIR}/Contents/MacOS")
        list(APPEND PATH_HINTS "$ENV{BN_INSTALL_DIR}/Contents/MacOS")
        list(APPEND PATH_HINTS "/Applications/Binary Ninja.app/Contents/MacOS")
        list(APPEND PATH_HINTS "$ENV{HOME}/Applications/Binary Ninja.app/Contents/MacOS")
    else()
        list(APPEND PATH_HINTS "$ENV{HOME}/binaryninja")
    endif()

    find_library(CORE_LIBRARY
        NAMES binaryninjacore libbinaryninjacore.so.1
        HINTS ${PATH_HINTS})

    if(NOT CORE_LIBRARY)
        set(BN_FOUND 0)
        set(BinaryNinjaCore_FOUND 0)
        return()
    endif()

    include(FindPackageHandleStandardArgs)
    find_package_handle_standard_args(BinaryNinjaCore
        FOUND_VAR BinaryNinjaCore_FOUND
        REQUIRED_VARS CORE_LIBRARY)

    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}")
    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)
    else()
        set(BinaryNinjaCore_LIBRARY_DIRS "${INSTALL_BIN_DIR}")
        set(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}")
    endif()

    message(STATUS "Binary Ninja Install Dir: ${BinaryNinjaCore_ROOT_DIR}")

    # Compatibility
    set(BN_FOUND "${BinaryNinjaCore_FOUND}")
    set(BN_INSTALL_DIR "${BinaryNinjaCore_ROOT_DIR}")
    set(BN_INSTALL_BIN_DIR "${INSTALL_BIN_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}")
    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)
    else()
        set(BinaryNinjaCore_ROOT_DIR "${INSTALL_BIN_DIR}")
    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}")

    set(BN_FOUND "${BinaryNinjaCore_FOUND}")
    set(BN_INSTALL_DIR "${BinaryNinjaCore_ROOT_DIR}")
    set(BN_INSTALL_BIN_DIR "${INSTALL_BIN_DIR}")
    set(BN_CORE_LIBRARY binaryninjacore)
    set(BN_CORE_DEFINITIONS "${BinaryNinjaCore_DEFINITIONS}")
endif()