-
-
Notifications
You must be signed in to change notification settings - Fork 53
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
223 lines (185 loc) · 8.11 KB
/
CMakeLists.txt
File metadata and controls
223 lines (185 loc) · 8.11 KB
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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
cmake_minimum_required(VERSION 3.31 FATAL_ERROR)
# Don't create a project if it was already created by another CMakeLists.txt.
# This allows one library to embed another library without making a collision.
if (NOT CMAKE_PROJECT_NAME OR "${CMAKE_PROJECT_NAME}" STREQUAL "asmtk")
project(asmtk CXX)
endif()
include(GNUInstallDirs)
# =============================================================================
# [AsmTK - Deprecated]
# =============================================================================
if (DEFINED ASMTK_BUILD_EMBED)
message(DEPRECATION "ASMTK_BUILD_EMBED is deprecated, use ASMTK_EMBED")
set(ASMTK_EMBED "${ASMTK_BUILD_EMBED}")
endif()
if (DEFINED ASMTK_BUILD_STATIC)
message(DEPRECATION "ASMTK_BUILD_STATIC is deprecated, use ASMTK_STATIC")
set(ASMTK_STATIC "${ASMTK_BUILD_STATIC}")
endif()
# =============================================================================
# [AsmTK - Configuration]
# =============================================================================
if (NOT DEFINED ASMTK_DIR)
set(ASMTK_DIR "${CMAKE_CURRENT_LIST_DIR}")
endif()
if (NOT DEFINED ASMJIT_DIR)
set(ASMJIT_DIR "${ASMTK_DIR}/../asmjit")
endif()
if (NOT DEFINED ASMJIT_EXTERNAL)
set(ASMJIT_EXTERNAL FALSE)
endif()
if (NOT DEFINED ASMTK_EMBED)
set(ASMTK_EMBED FALSE)
endif()
if (NOT DEFINED ASMTK_STATIC)
set(ASMTK_STATIC ${ASMJIT_EMBED})
endif()
set(ASMTK_DIR "${ASMTK_DIR}" CACHE PATH "Location of 'asmtk'")
set(ASMJIT_DIR "${ASMJIT_DIR}" CACHE PATH "Location of 'asmjit'")
set(ASMJIT_EXTERNAL ${ASMJIT_EXTERNAL} CACHE BOOL "External 'asmjit'")
set(ASMTK_TEST ${ASMTK_TEST} CACHE BOOL "Build 'asmtk' test applications")
set(ASMTK_EMBED ${ASMTK_EMBED} CACHE BOOL "Embed 'asmtk' library (no targets)")
set(ASMTK_STATIC ${ASMTK_STATIC} CACHE BOOL "Build 'asmtk' library as static")
# =============================================================================
# [AsmTK - Project]
# =============================================================================
set(ASMTK_INCLUDE_DIRS "${ASMTK_DIR}/src") # Include directory is the same as source dir.
set(ASMTK_CFLAGS "") # Public compiler flags.
set(ASMTK_PRIVATE_CFLAGS "") # Private compiler flags independent of build type.
set(ASMTK_PRIVATE_CFLAGS_DBG "") # Private compiler flags used by debug builds.
set(ASMTK_PRIVATE_CFLAGS_REL "") # Private compiler flags used by release builds.
if (NOT ASMTK_NO_CUSTOM_FLAGS)
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC" OR "x${CMAKE_CXX_COMPILER_FRONTEND_VARIANT}" STREQUAL "xMSVC")
list(APPEND ASMTK_PRIVATE_CFLAGS
-MP # [+] Multi-Process Compilation.
-GR- # [-] Runtime type information.
-GF # [+] Eliminate duplicate strings.
-Zc:inline # [+] Remove unreferenced COMDAT.
-Zc:strictStrings # [+] Strict const qualification of string literals.
-Zc:threadSafeInit- # [-] Thread-safe statics.
-W4) # [+] Warning level 4.
list(APPEND ASMTK_PRIVATE_CFLAGS_DBG
-GS) # [+] Buffer security-check.
list(APPEND ASMTK_PRIVATE_CFLAGS_REL
-GS- # [-] Buffer security-check.
-O2 # [+] Favor speed over size.
-Oi) # [+] Generate intrinsic functions.
elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "^(GNU|Clang|AppleClang)$")
list(APPEND ASMTK_PRIVATE_CFLAGS -Wall -Wextra -Wconversion)
list(APPEND ASMTK_PRIVATE_CFLAGS -fno-math-errno -fno-threadsafe-statics)
list(APPEND ASMTK_PRIVATE_CFLAGS_REL -O2)
endif()
endif()
if (ASMTK_EMBED)
set(ASMTK_TARGET_TYPE "EMBED")
elseif (ASMTK_STATIC)
set(ASMTK_TARGET_TYPE "STATIC")
else()
set(ASMTK_TARGET_TYPE "SHARED")
endif()
if (ASMTK_EMBED OR ASMTK_STATIC)
List(APPEND ASMTK_CFLAGS "-DASMTK_STATIC")
List(APPEND ASMTK_PRIVATE_CFLAGS "-DASMTK_STATIC")
endif()
if (ASMJIT_EXTERNAL)
find_package(asmjit CONFIG REQUIRED)
else()
add_subdirectory("${ASMJIT_DIR}" asmjit)
list(APPEND ASMTK_PRIVATE_CFLAGS ${ASMJIT_CFLAGS})
list(REMOVE_DUPLICATES ASMTK_PRIVATE_CFLAGS)
endif()
# =============================================================================
# [AsmTK - Source]
# =============================================================================
function(asmtk_add_source out base_dir)
set(src_array)
foreach(file ${ARGN})
set(src_file "${ASMTK_DIR}/${base_dir}/${file}")
list(APPEND src_array ${src_file})
endforeach()
source_group(TREE "${ASMTK_DIR}" FILES ${src_array})
set(out_tmp ${${out}})
list(APPEND out_tmp ${src_array})
set("${out}" "${out_tmp}" PARENT_SCOPE)
endfunction()
set(ASMTK_SRC "")
set(ASMTK_SRC_LIST
asmtk/asmtk.h
asmtk/asmparser.cpp
asmtk/asmparser.h
asmtk/asmtokenizer.cpp
asmtk/asmtokenizer.h
asmtk/elfdefs.h
asmtk/globals.h
asmtk/parserutils.h
asmtk/strtod.h
)
asmtk_add_source(ASMTK_SRC src ${ASMTK_SRC_LIST})
# =============================================================================
# [AsmTK - Summary]
# =============================================================================
message("** AsmTK Summary **")
message(" ASMTK_DIR=${ASMTK_DIR}")
message(" ASMJIT_EXTERNAL=${ASMJIT_EXTERNAL}")
message(" ASMTK_TEST=${ASMTK_TEST}")
message(" ASMTK_TARGET_TYPE=${ASMTK_TARGET_TYPE}")
message(" ASMTK_CFLAGS=${ASMTK_CFLAGS}")
message(" ASMTK_PRIVATE_CFLAGS=${ASMTK_PRIVATE_CFLAGS}")
message(" ASMTK_PRIVATE_CFLAGS_DBG=${ASMTK_PRIVATE_CFLAGS_DBG}")
message(" ASMTK_PRIVATE_CFLAGS_REL=${ASMTK_PRIVATE_CFLAGS_REL}")
# =============================================================================
# [AsmTK - Targets]
# =============================================================================
if (NOT ASMTK_EMBED)
add_library(asmtk ${ASMTK_TARGET_TYPE} ${ASMTK_SRC})
target_compile_features(asmtk PUBLIC cxx_std_17)
target_compile_options(asmtk PUBLIC ${ASMTK_CFLAGS})
target_compile_options(asmtk PRIVATE ${ASMTK_PRIVATE_CFLAGS}
$<$<CONFIG:Debug>:${ASMTK_PRIVATE_CFLAGS_DBG}>
$<$<NOT:$<CONFIG:Debug>>:${ASMTK_PRIVATE_CFLAGS_REL}>)
if(ASMJIT_EXTERNAL)
target_link_libraries(asmtk PUBLIC ${ASMJIT_LIBRARY})
find_path(ASMJIT_INCLUDE_DIR NAMES asmjit/core.h)
target_include_directories(asmtk PRIVATE ${ASMJIT_INCLUDE_DIR})
else()
target_link_libraries(asmtk PUBLIC asmjit::asmjit)
endif()
target_include_directories(asmtk BEFORE INTERFACE
$<BUILD_INTERFACE:${ASMTK_INCLUDE_DIRS}>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
set_property(TARGET asmtk PROPERTY CXX_VISIBILITY_PRESET hidden)
# Add asmjit::asmtk target (alias to asmtk).
add_library(asmjit::asmtk ALIAS asmtk)
# TODO: [CMAKE] Deprecated alias - we use projectname::libraryname convention now.
add_library(AsmTK::AsmTK ALIAS asmtk)
# Add AsmTK install instructions (library and public headers).
if (NOT ASMTK_NO_INSTALL)
install(TARGETS asmtk
EXPORT asmtk-config
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}")
install(EXPORT asmtk-config
NAMESPACE asmjit::
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/asmtk")
foreach(_src_file ${ASMTK_SRC_LIST})
if ("${_src_file}" MATCHES "\\.h$" AND NOT "${_src_file}" MATCHES "_p\\.h$")
get_filename_component(_src_dir ${_src_file} PATH)
install(FILES "${ASMTK_DIR}/src/${_src_file}" DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_src_dir}")
endif()
endforeach()
endif()
if (ASMTK_TEST AND NOT ASMJIT_EMBED)
set(ASMTK_SAMPLES_SRC
asmtk_test_x86cmd
asmtk_test_x86handler
asmtk_test_x86parser)
foreach(_target ${ASMTK_SAMPLES_SRC})
add_executable(${_target} "${ASMTK_DIR}/test/${_target}.cpp")
target_link_libraries(${_target} asmjit::asmjit asmjit::asmtk)
target_compile_features(${_target} PUBLIC cxx_std_17)
set_property(TARGET ${_target} PROPERTY CXX_VISIBILITY_PRESET hidden)
endforeach()
endif()
endif()