-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathaddons.cmake
179 lines (165 loc) · 6.01 KB
/
addons.cmake
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# For backwards compatibility, include the common configuration
include(${CMAKE_CURRENT_LIST_DIR}/common.cmake)
if (DEFINED PLUGIN_NAME)
set(IS_PLUGIN 1)
set(ADDON_KIND "plugin")
set(ADDON_NAME ${PLUGIN_NAME})
set(ADDON_SOURCES ${PLUGIN_SOURCES})
unset(PLUGIN_SOURCES)
set(ADDON_BIN "plugins")
if (DEFINED PLUGIN_OUTPUT_NAME)
set(ADDON_OUTPUT_NAME ${PLUGIN_OUTPUT_NAME})
unset(PLUGIN_OUTPUT_NAME)
endif()
# Linker
if (DEFINED PLUGIN_LINK_LIBRARIES)
set(ADDON_LINK_LIBRARIES ${PLUGIN_LINK_LIBRARIES})
unset(PLUGIN_LINK_LIBRARIES)
endif()
# Include directories
if (DEFINED PLUGIN_INCLUDE_DIRECTORIES)
set(ADDON_INCLUDE_DIRECTORIES ${PLUGIN_INCLUDE_DIRECTORIES})
unset(PLUGIN_INCLUDE_DIRECTORIES)
endif()
if (NOT DEFINED PLUGIN_RUN_ARGS)
set(PLUGIN_RUN_ARGS "-t")
endif()
elseif(DEFINED LOADER_NAME)
set(IS_LOADER 1)
set(ADDON_KIND "file loader")
set(ADDON_NAME ${LOADER_NAME})
set(ADDON_SOURCES ${LOADER_SOURCES})
set(ADDON_BIN "loaders")
if (DEFINED LOADER_OUTPUT_NAME)
set(ADDON_OUTPUT_NAME ${LOADER_OUTPUT_NAME})
unset(LOADER_OUTPUT_NAME)
endif()
# Linker
if (DEFINED LOADER_LINK_LIBRARIES)
set(ADDON_LINK_LIBRARIES ${LOADER_LINK_LIBRARIES})
unset(LOADER_LINK_LIBRARIES)
endif()
# Include directories
if (DEFINED LOADER_INCLUDE_DIRECTORIES)
set(ADDON_INCLUDE_DIRECTORIES ${LOADER_INCLUDE_DIRECTORIES})
unset(LOADER_INCLUDE_DIRECTORIES)
endif()
if (NOT DEFINED LOADER_RUN_ARGS)
set(LOADER_RUN_ARGS "-c -A")
endif()
elseif(DEFINED PROCMOD_NAME)
set(IS_PROCMOD 1)
set(ADDON_KIND "processor module")
set(ADDON_NAME ${PROCMOD_NAME})
set(ADDON_SOURCES ${PROCMOD_SOURCES})
set(ADDON_BIN "procs")
if (DEFINED PROCMOD_OUTPUT_NAME)
set(ADDON_OUTPUT_NAME ${PROCMOD_OUTPUT_NAME})
unset(PROCMOD_OUTPUT_NAME)
endif()
# Linker
if (DEFINED PROCMOD_LINK_LIBRARIES)
set(ADDON_LINK_LIBRARIES ${PROCMOD_LINK_LIBRARIES})
unset(PROCMOD_LINK_LIBRARIES)
endif()
# Include directories
if (DEFINED PROCMOD_INCLUDE_DIRECTORIES)
set(ADDON_INCLUDE_DIRECTORIES ${PROCMOD_INCLUDE_DIRECTORIES})
unset(PROCMOD_INCLUDE_DIRECTORIES)
endif()
if (NOT DEFINED PROCMOD_RUN_ARGS)
set(PROCMOD_RUN_ARGS "-c -A")
endif()
endif()
# Create a library for the current plugin
add_library(${ADDON_NAME} SHARED ${ADDON_SOURCES})
# Set the default plugin output name
if (NOT DEFINED ADDON_OUTPUT_NAME)
set(ADDON_OUTPUT_NAME ${ADDON_NAME})
message("-- Setting the default ${ADDON_KIND} output file name to: ${ADDON_OUTPUT_NAME}")
endif()
if (DEFINED __NT__)
target_compile_definitions(${ADDON_NAME} PRIVATE __NT__)
elseif(DEFINED __MAC__)
target_compile_definitions(${ADDON_NAME} PRIVATE __MAC__)
elseif(DEFINED __LINUX__)
target_compile_definitions(${ADDON_NAME} PRIVATE __LINUX__)
endif()
# 64bit addressing?
if (${EA64})
target_compile_definitions(${ADDON_NAME} PRIVATE __EA64__=1)
target_link_libraries(${ADDON_NAME} ${IDALIB64} ${ADDON_LINK_LIBRARIES})
set_target_properties(${ADDON_NAME} PROPERTIES OUTPUT_NAME ${ADDON_OUTPUT_NAME})
else()
# Use x64 IDA 32bits addressing
target_link_libraries(${ADDON_NAME} ${IDALIB32} ${ADDON_LINK_LIBRARIES})
set_target_properties(${ADDON_NAME} PROPERTIES OUTPUT_NAME ${ADDON_OUTPUT_NAME}32)
endif()
# Look for libida one directory up relative to plugin folder, just like official Hex-Rays plugins on Linux
if(DEFINED __LINUX__)
set_target_properties(${ADDON_NAME} PROPERTIES
BUILD_WITH_INSTALL_RPATH true
INSTALL_RPATH "$ORIGIN/.."
LINK_OPTIONS "-Wl,--disable-new-dtags")
endif()
# Set include directory
target_include_directories(${ADDON_NAME} PRIVATE ${IDASDK}/include ${ADDON_INCLUDE_DIRECTORIES})
# Set common defines
target_compile_definitions(${ADDON_NAME} PRIVATE __IDP__ MAXSTR=${MAXSTR})
# Adjust output folders
if (DEFINED __NT__)
# On Windows and for release builds, statically link
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
# That's a Windows subsystem plugin (not Console)
if(MSVC)
set_property(TARGET ${ADDON_NAME} APPEND_STRING PROPERTY LINK_FLAGS " /SUBSYSTEM:WINDOWS")
else()
set_property(TARGET ${ADDON_NAME} APPEND_STRING PROPERTY LINK_FLAGS " -mwindows")
endif()
# Set the destination folder to be in IDA's binary output folder
foreach (cfg IN LISTS CMAKE_CONFIGURATION_TYPES)
string(TOUPPER ${cfg} cfg)
set_target_properties(${ADDON_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${cfg} ${IDABIN}/${ADDON_BIN})
endforeach()
else()
# Set the destination folder to be in IDA's binary output folder
set_target_properties(${ADDON_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${IDABIN}/${ADDON_BIN})
set_target_properties(${ADDON_NAME} PROPERTIES PREFIX "")
endif()
# Set convenience user debugging information for MSVC projects
if (DEFINED IS_PLUGIN)
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
configure_file(
"${CMAKE_CURRENT_LIST_DIR}/plugins.vcxproj.user"
"${PLUGIN_NAME}.vcxproj.user"
@ONLY)
endif()
elseif(DEFINED IS_LOADER)
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
configure_file(
"${CMAKE_CURRENT_LIST_DIR}/loaders.vcxproj.user"
"${LOADER_NAME}.vcxproj.user"
@ONLY)
endif()
elseif(DEFINED IS_PROCMOD)
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
configure_file(
"${CMAKE_CURRENT_LIST_DIR}/procmod.vcxproj.user"
"${PROCMOD_NAME}.vcxproj.user"
@ONLY)
endif()
endif()
unset(ADDON_OUTPUT_NAME)
unset(ADDON_NAME)
unset(ADDON_BIN)
unset(ADDON_SOURCES)
unset(ADDON_LINK_LIBRARIES)
unset(ADDON_KIND)
unset(PLUGIN_NAME)
unset(PLUGIN_RUN_ARGS)
unset(LOADER_NAME)
unset(LOADER_RUN_ARGS)
unset(PROCMOD_NAME)
unset(PROCMOD_RUN_ARGS)
# Mark disabled source files
set_source_files_properties(${DISABLED_SOURCES} PROPERTIES LANGUAGE "")