1212# See the License for the specific language governing permissions and
1313# limitations under the License.
1414
15- if (NOT DEFINED ENV{TRAILOFBITS_LIBRARIES})
16- message (STATUS "Using new vcpkg build system" )
17- include (CMakeLists_vcpkg.txt)
18- return ()
19- endif ()
15+ include (cmake/vcpkg_helper.cmake)
2016
2117project (remill)
2218cmake_minimum_required (VERSION 3.14)
23-
2419include (GNUInstallDirs)
2520
2621include ("${CMAKE_CURRENT_SOURCE_DIR} /cmake/settings.cmake" )
27- include ("${CMAKE_CURRENT_SOURCE_DIR} /cmake/utils.cmake" )
28- include ("${CMAKE_CURRENT_SOURCE_DIR} /cmake/BCCompiler.cmake" )
22+ include ("${CMAKE_CURRENT_SOURCE_DIR} /cmake/utils_vcpkg.cmake" )
2923include ("${CMAKE_CURRENT_SOURCE_DIR} /cmake/ccache.cmake" )
3024list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR} /cmake/modules" )
3125include (CTest)
3226
33- if (LLVM_Z3_INSTALL_DIR)
34- find_package (Z3 4.7.1)
35- set (need_z3 TRUE )
36- elseif (DEFINED CXX_COMMON_REPOSITORY_ROOT)
37- set (LLVM_Z3_INSTALL_DIR "${CXX_COMMON_REPOSITORY_ROOT} /z3" CACHE PATH "Path to the z3 installation" )
38- set (need_z3 TRUE )
39- else ()
40- set (need_z3 FALSE )
41- endif ()
42-
43- if (need_z3)
44- find_package (Z3 4.7.1)
45- if (NOT Z3_FOUND)
46- message (WARNING "Z3 >= 4.7.1 has not been found in LLVM_Z3_INSTALL_DIR: ${LLVM_Z3_INSTALL_DIR} ." )
47- endif ()
48- endif ()
49-
5027configureCcache()
5128FindAndSelectClangCompiler()
5229
5330enable_language (C CXX ASM)
5431
5532set (REMILL_SOURCE_DIR "${PROJECT_SOURCE_DIR} " )
5633
57- if (DEFINED WIN32 )
58- set (dynamic_lib_prefix "" )
59- set (dynamic_lib_extension "dll" )
60- set (static_lib_prefix "" )
61- set (static_lib_extension "lib" )
62- set (executable_extension ".exe" )
63- set (install_folder "${CMAKE_INSTALL_PREFIX} /remill" )
64- else ()
65- set (dynamic_lib_prefix "lib" )
66- set (dynamic_lib_extension "so" )
67- set (static_lib_prefix "lib" )
68- set (static_lib_extension "a" )
69- set (executable_extension "" )
70- set (install_folder "${CMAKE_INSTALL_PREFIX} " )
71- endif ()
72-
73- set (REMILL_INSTALL_LIB_DIR "${install_folder} /lib" CACHE PATH "Directory in which remill libraries will be installed" )
74- set (REMILL_INSTALL_BIN_DIR "${install_folder} /bin" CACHE PATH "Directory in which remill binaries will be installed" )
75- set (REMILL_INSTALL_INCLUDE_DIR "${install_folder} /include" CACHE PATH "Directory in which remill headers will be installed" )
76- set (REMILL_INSTALL_SHARE_DIR "${install_folder} /share" CACHE PATH "Directory in which remill cmake files will be installed" )
34+ set (REMILL_INSTALL_LIB_DIR "${CMAKE_INSTALL_LIBDIR} " CACHE PATH "Directory in which remill libraries will be installed" )
35+ set (REMILL_INSTALL_BIN_DIR "${CMAKE_INSTALL_BINDIR} " CACHE PATH "Directory in which remill binaries will be installed" )
36+ set (REMILL_INSTALL_INCLUDE_DIR "${CMAKE_INSTALL_INCLUDEDIR} /remill" CACHE PATH "Directory in which remill headers will be installed" )
37+ set (REMILL_INSTALL_SHARE_DIR "${CMAKE_INSTALL_DATADIR} " CACHE PATH "Directory in which remill cmake files will be installed" )
7738
7839#
7940# libraries
8041#
8142
8243# LLVM
83- find_package (LLVM REQUIRED CONFIG HINTS ${FINDPACKAGE_LLVM_HINTS} )
44+ find_package (LLVM CONFIG REQUIRED)
45+ message (STATUS "Found LLVM ${LLVM_PACKAGE_VERSION} " )
46+ message (STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR} " )
8447
8548string (REPLACE "." ";" LLVM_VERSION_LIST ${LLVM_PACKAGE_VERSION} )
8649list (GET LLVM_VERSION_LIST 0 LLVM_MAJOR_VERSION)
@@ -93,6 +56,7 @@ target_include_directories(thirdparty_llvm SYSTEM INTERFACE
9356target_compile_definitions (thirdparty_llvm INTERFACE
9457 ${LLVM_DEFINITIONS}
9558)
59+ include ("${CMAKE_CURRENT_SOURCE_DIR} /cmake/BCCompiler.cmake" )
9660
9761# Go find only the static libraries of LLVM, and link against those.
9862foreach (LLVM_LIB IN LISTS LLVM_AVAILABLE_LIBS)
@@ -105,40 +69,41 @@ endforeach()
10569# These are out-of-order in `LLVM_AVAILABLE_LIBS` and should always be last.
10670list (REMOVE_ITEM LLVM_LIBRARIES LLVMMC LLVMCore LLVMSupport)
10771list (APPEND LLVM_LIBRARIES LLVMMC LLVMCore LLVMSupport)
72+
10873target_link_libraries (thirdparty_llvm INTERFACE
10974 ${LLVM_LIBRARIES}
11075)
11176
112- # Microsoft Z3
113- add_library (thirdparty_z3 INTERFACE )
114- if (Z3_FOUND)
115- target_include_directories (thirdparty_z3 SYSTEM INTERFACE
116- ${Z3_INCLUDE_DIR}
117- )
118- target_link_libraries (thirdparty_z3 INTERFACE
119- ${Z3_LIBRARIES}
120- )
77+ # Microsoft Z3 with LLVM. Not exactly used in remill, but LLVM doesn't link
78+ # against it correctly
79+ # NOTE: If changing this, also replicate in remillConfig file
80+ if (LLVM_WITH_Z3)
81+ find_package (Z3 CONFIG REQUIRED 4.7.1)
82+ get_target_property (LLVMSupport_LIBS LLVMSupport INTERFACE_LINK_LIBRARIES)
83+ list (REMOVE_ITEM LLVMSupport_LIBS Z3)
84+ list (APPEND LLVMSupport_LIBS z3::libz3)
85+ set_target_properties (LLVMSupport PROPERTIES
86+ INTERFACE_LINK_LIBRARIES "${LLVMSupport_LIBS} " )
12187endif ()
12288
89+ message (STATUS "LLVM Libraries: ${LLVM_LIBRARIES} " )
90+
12391# Intel XED
124- find_package (XED REQUIRED)
92+ find_package (XED CONFIG REQUIRED)
12593add_library (thirdparty_xed INTERFACE )
126- target_include_directories (thirdparty_xed SYSTEM INTERFACE
127- ${XED_INCLUDE_DIRS}
128- )
12994target_link_libraries (thirdparty_xed INTERFACE
130- ${XED_LIBRARIES}
95+ XED::XED
13196)
13297
13398# Google glog module
134- find_package (glog REQUIRED)
99+ find_package (glog CONFIG REQUIRED)
135100add_library (thirdparty_glog INTERFACE )
136101target_link_libraries (thirdparty_glog INTERFACE
137102 glog::glog
138103)
139104
140105# Google gflags
141- find_package (gflags REQUIRED)
106+ find_package (gflags CONFIG REQUIRED)
142107add_library (thirdparty_gflags INTERFACE )
143108target_link_libraries (thirdparty_gflags INTERFACE
144109 gflags
@@ -173,32 +138,33 @@ option(REMILL_BUILD_SPARC32_RUNTIME "Build the Runtime for SPARC32. Turn this of
173138# target settings
174139#
175140
176- set (REMILL_LLVM_VERSION "${LLVM_MAJOR_VERSION} .${LLVM_MINOR_VERSION} " )
141+ set (REMILL_LLVM_VERSION "${LLVM_MAJOR_VERSION} " )
142+ message ("Remill llvm version: ${REMILL_LLVM_VERSION} " )
177143math (EXPR REMILL_LLVM_VERSION_NUMBER "${LLVM_MAJOR_VERSION} * 100 + ${LLVM_MINOR_VERSION} " )
178144
179- if (DEFINED WIN32 )
180- set (REMILL_INSTALL_SEMANTICS_DIR "${install_folder} /${REMILL_LLVM_VERSION} /semantics" CACHE PATH "Directory into which semantics are installed" )
181- else ()
182- set (REMILL_INSTALL_SEMANTICS_DIR "${REMILL_INSTALL_SHARE_DIR} /remill/${REMILL_LLVM_VERSION} /semantics" CACHE PATH "Directory into which semantics are installed" )
183- endif ()
145+ set (REMILL_INSTALL_SEMANTICS_DIR "${CMAKE_INSTALL_PREFIX} /${REMILL_INSTALL_SHARE_DIR} /remill/${REMILL_LLVM_VERSION} /semantics" CACHE PATH "Directory into which semantics are installed" )
184146
185147set (REMILL_BUILD_SEMANTICS_DIR_X86 "${CMAKE_CURRENT_BINARY_DIR} /lib/Arch/X86/Runtime" )
186148set (REMILL_BUILD_SEMANTICS_DIR_AARCH32 "${CMAKE_CURRENT_BINARY_DIR} /lib/Arch/AArch32/Runtime" )
187149set (REMILL_BUILD_SEMANTICS_DIR_AARCH64 "${CMAKE_CURRENT_BINARY_DIR} /lib/Arch/AArch64/Runtime" )
188150set (REMILL_BUILD_SEMANTICS_DIR_SPARC32 "${CMAKE_CURRENT_BINARY_DIR} /lib/Arch/SPARC32/Runtime" )
189151set (REMILL_BUILD_SEMANTICS_DIR_SPARC64 "${CMAKE_CURRENT_BINARY_DIR} /lib/Arch/SPARC64/Runtime" )
190152
153+ # add everything as public.
191154set (REMILL_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR} /include" )
192155set (REMILL_LIB_DIR "${CMAKE_CURRENT_SOURCE_DIR} /lib" )
193156
194157add_library (remill_settings INTERFACE )
195158
196- target_include_directories (remill_settings INTERFACE "${REMILL_INCLUDE_DIR} " )
159+ target_include_directories (remill_settings INTERFACE
160+ $<BUILD_INTERFACE:${REMILL_INCLUDE_DIR} >
161+ $<INSTALL_INTERFACE:include >)
197162
198163if (WIN32 )
199164 # warnings and compiler settings
200165 target_compile_options (remill_settings INTERFACE
201- /MD /nologo /W3 /EHsc /wd4141 /wd4146 /wd4180 /wd4244
166+ "$<$<CONFIG:Debug>:/MDd>$<$<CONFIG:Release>:/MD>"
167+ /nologo /W3 /EHsc /wd4141 /wd4146 /wd4180 /wd4244
202168 /wd4258 /wd4267 /wd4291 /wd4345 /wd4351 /wd4355 /wd4456
203169 /wd4457 /wd4458 /wd4459 /wd4503 /wd4624 /wd4722 /wd4800
204170 /wd4100 /wd4127 /wd4512 /wd4505 /wd4610 /wd4510 /wd4702
@@ -264,23 +230,20 @@ else()
264230endif ()
265231
266232target_compile_definitions (remill_settings INTERFACE
267- "REMILL_INSTALL_SEMANTICS_DIR=\" ${REMILL_INSTALL_SEMANTICS_DIR} / \" "
233+ "REMILL_INSTALL_SEMANTICS_DIR=\" ${REMILL_INSTALL_SEMANTICS_DIR} \" "
268234 "REMILL_BUILD_SEMANTICS_DIR_X86=\" ${REMILL_BUILD_SEMANTICS_DIR_X86} \" "
269235 "REMILL_BUILD_SEMANTICS_DIR_AARCH32=\" ${REMILL_BUILD_SEMANTICS_DIR_AARCH32} \" "
270236 "REMILL_BUILD_SEMANTICS_DIR_AARCH64=\" ${REMILL_BUILD_SEMANTICS_DIR_AARCH64} \" "
271237 "REMILL_BUILD_SEMANTICS_DIR_SPARC32=\" ${REMILL_BUILD_SEMANTICS_DIR_SPARC32} \" "
272238 "REMILL_BUILD_SEMANTICS_DIR_SPARC64=\" ${REMILL_BUILD_SEMANTICS_DIR_SPARC64} \" "
273239)
274240
275- set (THIRDPARTY_LIBRARY_LIST thirdparty_z3
276- thirdparty_llvm
277- thirdparty_xed
278- thirdparty_glog
279- thirdparty_gflags)
280-
241+ set (THIRDPARTY_LIBRARY_LIST thirdparty_llvm thirdparty_xed thirdparty_glog thirdparty_gflags)
281242target_link_libraries (remill_settings INTERFACE
282243 ${THIRDPARTY_LIBRARY_LIST}
283244)
245+ install (TARGETS remill_settings ${THIRDPARTY_LIBRARY_LIST}
246+ EXPORT remillTargets)
284247
285248add_subdirectory (lib/Arch)
286249add_subdirectory (lib/BC)
@@ -297,69 +260,18 @@ target_link_libraries(remill INTERFACE
297260 remill_version
298261 ${LINKER_END_GROUP}
299262)
263+ install (TARGETS remill EXPORT remillTargets)
300264
301265#
302266# Also install clang, libllvm and llvm-link
303267#
304268
305- set (INSTALLED_CLANG_NAME "remill-clang-${REMILL_LLVM_VERSION}${executable_extension} " )
306- set (INSTALLED_LLVMLINK_NAME "remill-llvm-link-${REMILL_LLVM_VERSION}${executable_extension} " )
307-
308- if ("${CXX_COMMON_REPOSITORY_ROOT} " STREQUAL "" OR NOT EXISTS "${CXX_COMMON_REPOSITORY_ROOT} /llvm" )
309- set (INSTALLED_LIBLLVM_NAME "${dynamic_lib_prefix} LLVM-${REMILL_LLVM_VERSION} .${dynamic_lib_extension} " )
310-
311- # system binaries are not built statically, so we need to fix the rpath
312- find_program ("clang_location" "clang-${REMILL_LLVM_VERSION}${executable_extension} " )
313- if ("${clang_location} " STREQUAL "clang_location-NOTFOUND" )
314- message (FATAL_ERROR "InstallExternalTarget: Failed to locate the clang executable" )
315- endif ()
316-
317- message ("InstallExternalTarget: Found clang executable: ${clang_location} " )
318-
319- find_program ("llvmlink_location" "llvm-link${executable_extension} " )
320- if ("${llvmlink_location} " STREQUAL "llvmlink_location-NOTFOUND" )
321- message (FATAL_ERROR "InstallExternalTarget: Failed to locate the llvm-link executable" )
322- endif ()
323-
324- message ("InstallExternalTarget: Found llvm-link executable: ${llvmlink_location} " )
325-
326- find_library ("libllvm_location" "${dynamic_lib_prefix} LLVM-${REMILL_LLVM_VERSION} .${dynamic_lib_extension} " )
327- if ("${libllvm_location} " STREQUAL "libllvm_location-NOTFOUND" )
328- message (FATAL_ERROR "InstallExternalTarget: Failed to locate the libLLVM dynamic library" )
329- endif ()
330-
331- message ("InstallExternalTarget: Found libLLVM location: ${libllvm_location} " )
269+ set (INSTALLED_CLANG_NAME "remill-clang-${REMILL_LLVM_VERSION}${CMAKE_EXECUTABLE_SUFFIX} " )
270+ set (INSTALLED_LLVMLINK_NAME "remill-llvm-link-${REMILL_LLVM_VERSION}${CMAKE_EXECUTABLE_SUFFIX} " )
332271
333- InstallExternalTarget("ext_clang" "${clang_location} " "${REMILL_INSTALL_BIN_DIR} "
334- "${INSTALLED_CLANG_NAME} " "${REMILL_INSTALL_LIB_DIR} " )
272+ InstallExternalTarget("ext_clang" "${CLANG_PATH} " "BIN" "${INSTALLED_CLANG_NAME} " )
335273
336- InstallExternalTarget("ext_llvmlink" "${llvmlink_location} " "${REMILL_INSTALL_BIN_DIR} "
337- "${INSTALLED_LLVMLINK_NAME} " "${REMILL_INSTALL_LIB_DIR} " )
338-
339- else ()
340- # The executable in our binary repository are statically built, meaning that we don't need
341- # to change the rpath
342- InstallExternalTarget("ext_clang" "${CXX_COMMON_REPOSITORY_ROOT} /llvm/bin/clang${executable_extension} "
343- "${REMILL_INSTALL_BIN_DIR} " "${INSTALLED_CLANG_NAME} " )
344-
345- InstallExternalTarget("ext_llvmlink" "${CXX_COMMON_REPOSITORY_ROOT} /llvm/bin/llvm-link${executable_extension} "
346- "${REMILL_INSTALL_BIN_DIR} " "${INSTALLED_LLVMLINK_NAME} " )
347- endif ()
348-
349- set (REMILL_BC_LIBRARY_LOCATION "${REMILL_INSTALL_LIB_DIR} /${static_lib_prefix} remill_bc.${static_lib_extension} " )
350- set (REMILL_ARCH_LIBRARY_LOCATION "${REMILL_INSTALL_LIB_DIR} /${static_lib_prefix} remill_arch.${static_lib_extension} " )
351- set (REMILL_ARCH_X86_LIBRARY_LOCATION "${REMILL_INSTALL_LIB_DIR} /${static_lib_prefix} remill_arch_x86.${static_lib_extension} " )
352- set (REMILL_ARCH_AARCH32_LIBRARY_LOCATION "${REMILL_INSTALL_LIB_DIR} /${static_lib_prefix} remill_arch_aarch32.${static_lib_extension} " )
353- set (REMILL_ARCH_AARCH64_LIBRARY_LOCATION "${REMILL_INSTALL_LIB_DIR} /${static_lib_prefix} remill_arch_aarch64.${static_lib_extension} " )
354- set (REMILL_ARCH_SPARC32_LIBRARY_LOCATION "${REMILL_INSTALL_LIB_DIR} /${static_lib_prefix} remill_arch_sparc32.${static_lib_extension} " )
355- set (REMILL_ARCH_SPARC64_LIBRARY_LOCATION "${REMILL_INSTALL_LIB_DIR} /${static_lib_prefix} remill_arch_sparc64.${static_lib_extension} " )
356- set (REMILL_OS_LIBRARY_LOCATION "${REMILL_INSTALL_LIB_DIR} /${static_lib_prefix} remill_os.${static_lib_extension} " )
357- set (REMILL_VERSION_LIBRARY_LOCATION "${REMILL_INSTALL_LIB_DIR} /${static_lib_prefix} remill_version.${static_lib_extension} " )
358-
359-
360- set (REMILL_INCLUDE_LOCATION "${REMILL_INSTALL_INCLUDE_DIR} " )
361- get_target_property (REMILL_COMPILE_OPTIONS remill_settings INTERFACE_COMPILE_OPTIONS)
362- get_target_property (REMILL_COMPILE_DEFINITIONS remill_settings INTERFACE_COMPILE_DEFINITIONS )
274+ InstallExternalTarget("ext_llvmlink" "${LLVMLINK_PATH} " "BIN" "${INSTALLED_LLVMLINK_NAME} " )
363275
364276GetTargetTree(THIRDPARTY_LIBRARIES ${THIRDPARTY_LIBRARY_LIST} )
365277GetPublicIncludeFolders(THIRDPARTY_INCLUDE_DIRECTORIES ${THIRDPARTY_LIBRARIES} )
@@ -381,22 +293,17 @@ list(REMOVE_DUPLICATES THIRDPARTY_LIBRARY_FILES)
381293
382294# First do the basic substitutions.
383295configure_file (
384- "${CMAKE_CURRENT_SOURCE_DIR} /cmake/remillConfig .cmake.in"
385- "${CMAKE_CURRENT_BINARY_DIR} /remillConfig.cmake.pregen "
296+ "${CMAKE_CURRENT_SOURCE_DIR} /cmake/remillConfig_vcpkg .cmake.in"
297+ "${CMAKE_CURRENT_BINARY_DIR} /remillConfig.cmake"
386298 @ONLY
387299)
388300
389- # Then expand the generator expressions added to `THIRDPARTY_LIBRARY_FILES`.
390- file (GENERATE
391- OUTPUT "${CMAKE_CURRENT_BINARY_DIR} /remillConfig.cmake"
392- INPUT "${CMAKE_CURRENT_BINARY_DIR} /remillConfig.cmake.pregen"
393- )
394-
395301install (FILES "${CMAKE_CURRENT_BINARY_DIR} /remillConfig.cmake"
302+ "${CMAKE_CURRENT_LIST_DIR} /cmake/vcpkg_helper.cmake"
396303 DESTINATION "${REMILL_INSTALL_LIB_DIR} /cmake/remill"
397304)
398305
399- install (DIRECTORY "${REMILL_INCLUDE_DIR} /remill"
306+ install (DIRECTORY "${REMILL_INCLUDE_DIR} /remill/ "
400307 DESTINATION "${REMILL_INSTALL_INCLUDE_DIR} "
401308)
402309
@@ -409,8 +316,13 @@ add_custom_target(semantics)
409316# tools
410317add_subdirectory (bin)
411318
319+ install (EXPORT remillTargets
320+ DESTINATION "${CMAKE_INSTALL_LIBDIR} /cmake/remill" )
321+
412322# tests
323+ message ("compiler ID ${CMAKE_C_COMPILER_ID} " )
413324if ("${CMAKE_C_COMPILER_ID} " STREQUAL "Clang" OR "${CMAKE_C_COMPILER_ID} " STREQUAL "AppleClang" )
325+ find_package (Threads REQUIRED)
414326 add_custom_target (test_dependencies)
415327
416328 if (NOT "${PLATFORM_NAME} " STREQUAL "windows" )
0 commit comments