-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
238 lines (195 loc) · 8.59 KB
/
CMakeLists.txt
File metadata and controls
238 lines (195 loc) · 8.59 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
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
# Copyright (C) 2021 Philippe Gras CEA/Irfu <philippe.gras@cern.ch>
cmake_minimum_required (VERSION 3.12)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project (CxxWrapGen)
include(FetchContent)
find_package(Git REQUIRED)
find_package(OpenSSL REQUIRED)
# Package to parse command line options
FetchContent_Declare(
cxxopts
GIT_REPOSITORY https://github.com/jarro2783/cxxopts.git
GIT_TAG v3.0.0
)
if(BUILD_LLVM) #in this mode llvm and clang codes are downloaded
FetchContent_Declare(llvm
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/llvm
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
URL https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.1/llvm-13.0.1.src.tar.xz
)
FetchContent_GetProperties(llvm)
if(NOT llvm_POPULATED)
FetchContent_Populate(llvm)
endif()
FetchContent_Declare(clang
SOURCE_DIR ${CMAKE_CURRENT_BINARY_DIR}/llvm/tools/clang
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
URL https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.1/clang-13.0.1.src.tar.xz
)
FetchContent_GetProperties(clang)
if(NOT clang_POPULATED)
FetchContent_Populate(clang)
endif()
endif()
FetchContent_MakeAvailable(cxxopts)
project(MyProject)
# Option to enable LLVM/Clang download and build
option(BUILD_LLVM "Download and build LLVM/Clang" OFF)
if(BUILD_LLVM)
function(add_llvm)
set(CMAKE_BUILD_TYPE Release) #applies only for LLVM as defined in the function
set(LLVM_BUILD_LLVM_DYLIB ON)
set(LLVM_BUILD_TOOLS OFF)
set(LLVM_TARGETS_TO_BUILD host)
# Define a couple of LLVM cache variables of LLVM before adding the subdirectory
# in order to choose the default values.
set(LLVM_TARGETS_TO_BUILD ${LLVM_TARGETS_TO_BUILD_} CACHE STRING "Semicolon-separated list of experimental targets to build.")
set(CLANG_RESOURCE_DIR ${CMAKE_INSTALL_PREFIX}/lib/clang/13.0.1 CACHE STRING
"Clang resource directory as returned by clang -print-resource-dir")
add_subdirectory(${llvm_SOURCE_DIR} ${llvm_BINARY_DIR})
endfunction()
add_llvm()
# include_directories(${llvm_SOURCE_DIR}/include
# ${clang_SOURCE_DIR}/include
# ${llvm_BINARY_DIR}/tools/clang/include
# ${llvm_BINARY_DIR}/include)
elseif (NOT CLANG_JLL)
find_package(Clang REQUIRED CONFIG)
find_package(LLVM REQUIRED CONFIG)
include_directories(${CLANG_INCLUDE_DIRS})
execute_process(COMMAND "${LLVM_TOOLS_BINARY_DIR}/clang" -print-resource-dir
OUTPUT_VARIABLE CLANG_RESOURCE_DIR_DISCOVERED_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(CLANG_RESOURCE_DIR "${CLANG_RESOURCE_DIR_DISCOVERED_PATH}" CACHE
FILEPATH "Clang resource directory as returned by clang -print-resource-dir")
if("${CLANG_RESOURCE_DIR}" STREQUAL "")
message(FATAL_ERROR "CLANG_RESOURCE_DIR needs to be set to the Clang resource directory (see clang -print-resource-directory). This path is used at runtime by the wrapit executable.")
else()
if(NOT IS_DIRECTORY "${CLANG_RESOURCE_DIR}")
message(WARNING "CLANG_RESOURCE_DIR value, " "${CLANG_RESOURCE_DIR}" ", does not point to an existing directory.")
endif()
endif()
else() # Using Clang_jll
# find_package(Clang) leads to errors with Clang_jll
# due to inconsitency in the lists of expected and installed files
set(CLANG_PREFIX "" CACHE FILEPATH "Root path of libclang that contains lib/libclang.so.")
if("${CLANG_PREFIX}" STREQUAL "")
find_library(LIBCLANG_PATH_ clang REQUIRED NOCACHE)
get_filename_component(CLANG_PREFIX "${LIBCLANG_PATH_}" DIRECTORY)
get_filename_component(CLANG_PREFIX "${CLANG_PREFIX}" DIRECTORY)
unset(LIBCLANG_PATH_)
message(STATUS "CLANG_PREFIX: ${CLANG_PREFIX}")
endif()
include_directories("${CLANG_PREFIX}/include")
set(CLANG_RESOURCE_DIR "" CACHE STRING
"Clang resource directory as returned by clang -print-resource-dir")
if("${CLANG_RESOURCE_DIR}" STREQUAL "")
message("Searching clang resource directory in " "${CLANG_PREFIX}/lib/clang")
file(GLOB CLANG_RESOURCE_DIR_ "${CLANG_PREFIX}/lib/clang/*/include/stddef.h")
if("${CLANG_RESOURCE_DIR_}" STREQUAL "")
message(FATAL_ERROR "Failed to find Clang resource directory")
else()
list(GET CLANG_RESOURCE_DIR_ 0 CLANG_RESOURCE_DIR)
unset(CLANG_RESOURCE_DIR_)
get_filename_component(CLANG_RESOURCE_DIR "${CLANG_RESOURCE_DIR}" DIRECTORY)
get_filename_component(CLANG_RESOURCE_DIR "${CLANG_RESOURCE_DIR}" DIRECTORY)
message(STATUS "CLANG_RESOURCE_DIR: ${CLANG_RESOURCE_DIR}")
endif()
endif()
set(SHARED_LIBS libclang clang-cpp LLVM)
foreach(shared_lib IN LISTS SHARED_LIBS)
set(lib_path "${CLANG_PREFIX}/lib/lib${shared_lib}${CMAKE_SHARED_LIBRARY_SUFFIX}")
string(REPLACE liblib lib lib_path ${lib_path})
if(EXISTS "${lib_path}")
add_library(${shared_lib} SHARED IMPORTED)
else()
set(lib_path "${CLANG_PREFIX}/lib/lib${shared_lib}${CMAKE_STATIC_LIBRARY_SUFFIX}")
string(REPLACE liblib lib lib_path ${lib_path})
if(EXISTS "${lib_path}")
add_library(${shared_lib} STATIC IMPORTED)
else()
message(FATAL_ERROR "${shared_lib} library was not found in ${CLANG_PREFIX}/lib")
endif()
endif()
set_property(TARGET ${shared_lib} PROPERTY
IMPORTED_LOCATION ${lib_path})
endforeach()
#To prevent 'undefined symbol: _ZN4llvm23EnableABIBreakingChecksE' error:
add_compile_definitions(LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING)
if(NOT ($ENV{target} MATCHES "darwin"))
execute_process(COMMAND /bin/sh -c "nm -D -C ${CLANG_PREFIX}/lib/libclang.so | grep -q abi:cxx11" RESULT_VARIABLE rc)
if(NOT (rc EQUAL 0)) #libclang.so compiled with cxx03 ABI
add_compile_options(-D_GLIBCXX_USE_CXX11_ABI=0)
endif()
endif()
endif()
add_custom_target(version
${CMAKE_COMMAND}
-D SRC=${CMAKE_SOURCE_DIR}/src/version.cpp.in
-D DST=${CMAKE_BINARY_DIR}/version.cpp
-D GIT_EXECUTABLE=${GIT_EXECUTABLE}
-P ${CMAKE_SOURCE_DIR}/version.cmake
DEPENDS src/version.cpp.in
)
# The target 'versions' is used to produce version.cpp
# This dummy custom command is defined to allow
# inclusion of version.cpp dependency to the
# wrapit executable.
add_custom_command(OUTPUT version.cpp
COMMAND true
)
add_executable(wrapit
src/TypeRcd.cpp
src/TypeMapper.cpp
src/utils.cpp
src/cxxwrap_version.cpp
src/uuid_utils.cpp
src/libclang-ext.cpp
src/FunctionWrapper.cpp
src/CodeTree.cpp
src/main.cpp
src/toml.hpp
src/md5sum.cpp
src/FileTimeRestorer.cpp
src/Graph.cpp
version.cpp
)
add_dependencies(wrapit version)
if(BUILD_LLVM)
if(APPLE)
set_target_properties(wrapit PROPERTIES INSTALL_RPATH @loader_path/../lib)
else()
set_target_properties(wrapit PROPERTIES INSTALL_RPATH $ORIGIN/../lib)
endif()
target_include_directories(wrapit PRIVATE
${llvm_SOURCE_DIR}/include
${clang_SOURCE_DIR}/include
${llvm_BINARY_DIR}/tools/clang/include
${llvm_BINARY_DIR}/include)
endif()
target_link_libraries(wrapit PRIVATE libclang clang-cpp LLVM cxxopts dl
OpenSSL::Crypto
#- gcc < 9.0 needs std++fs for the std::filesystem support
$<$<AND:$<CXX_COMPILER_ID:GNU>,$<VERSION_LESS:$<CXX_COMPILER_VERSION>,9.0>>:stdc++fs>
)
set_target_properties(wrapit PROPERTIES
CXX_STANDARD 17
OUTPUT_NAME wrapit
POSITION_INDEPENDENT_CODE ON #required for dladdrr on Linux (*)
)
configure_file(src/config.h.in config.h @ONLY)
include_directories(${CMAKE_CURRENT_BINARY_DIR}) #contains the generated config.h header file
target_compile_definitions(wrapit PRIVATE)
install(TARGETS wrapit DESTINATION bin)
#(*) dladdr man page says "On some architectures (notably i386 and x86-64),
# dli_fname and dli_fbase may end up pointing back at the object from
# which you called dladdr(), even if the function used as an argument
# should come from a dynamically linked library." and prescribe to
# compile the code as position independent to work around this bug.
# See also https://github.com/grasph/wrapit/issues/30
# Enable unit testing capabilities
include(CTest)
add_test(NAME unittests WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/test COMMAND julia --project=. runtests.jl)
add_subdirectory(test)
add_subdirectory(examples)