Skip to content

Commit 1caf764

Browse files
authored
Workaround LLVM hardcoded include directory (#513)
These fixes are required for packaging a prebuilt remill that is relocatable/portable with respect to dependencies and their paths---in this case LLVM's include directory path.
1 parent 7311c6a commit 1caf764

File tree

5 files changed

+55
-364
lines changed

5 files changed

+55
-364
lines changed

CMakeLists.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ cmake_minimum_required(VERSION 3.14)
1919
include(GNUInstallDirs)
2020

2121
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/settings.cmake")
22-
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/utils_vcpkg.cmake")
22+
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/utils.cmake")
2323
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/ccache.cmake")
2424
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
2525
include(CTest)
@@ -51,7 +51,7 @@ list(GET LLVM_VERSION_LIST 1 LLVM_MINOR_VERSION)
5151

5252
add_library(thirdparty_llvm INTERFACE)
5353
target_include_directories(thirdparty_llvm SYSTEM INTERFACE
54-
${LLVM_INCLUDE_DIRS}
54+
$<BUILD_INTERFACE:${LLVM_INCLUDE_DIRS}>
5555
)
5656
target_compile_definitions(thirdparty_llvm INTERFACE
5757
${LLVM_DEFINITIONS}
@@ -293,7 +293,7 @@ list(REMOVE_DUPLICATES THIRDPARTY_LIBRARY_FILES)
293293

294294
# First do the basic substitutions.
295295
configure_file(
296-
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/remillConfig_vcpkg.cmake.in"
296+
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/remillConfig.cmake.in"
297297
"${CMAKE_CURRENT_BINARY_DIR}/remillConfig.cmake"
298298
@ONLY
299299
)

cmake/remillConfig.cmake.in

Lines changed: 48 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -12,79 +12,60 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
cmake_minimum_required(VERSION 3.2)
15+
@PACKAGE_INIT@
1616

17-
if(NOT TARGET remill)
18-
if(WIN32)
19-
set(REMILL_LIBRARY_LOCATION "@CMAKE_INSTALL_PREFIX@/remill/lib/remill.lib")
20-
set(REMILL_INCLUDE_LOCATION "@CMAKE_INSTALL_PREFIX@/remill/include")
21-
else()
22-
set(REMILL_LIBRARY_LOCATION "@CMAKE_INSTALL_PREFIX@/lib/libremill.a")
23-
set(REMILL_INCLUDE_LOCATION "@CMAKE_INSTALL_PREFIX@/include")
17+
foreach(_comp ${remill_FIND_COMPONENTS})
18+
if (NOT "VCPKG_DEPS" STREQUAL _comp)
19+
set(remill_FOUND False)
20+
set(remill_NOT_FOUND_MESSAGE "Unsupported component: ${_comp}. Only VCPKG_DEPS")
2421
endif()
25-
26-
# For Linux builds, group LLVM libraries into a single group
27-
# that avoids frustrating library ordering issues.
28-
if(UNIX AND NOT APPLE)
29-
set(LINKER_START_GROUP "-Wl,--start-group")
30-
set(LINKER_END_GROUP "-Wl,--end-group")
31-
else()
32-
set(LINKER_START_GROUP "")
33-
set(LINKER_END_GROUP "")
22+
23+
if ("VCPKG_DEPS" STREQUAL _comp)
24+
set(remill_setup_vcpkg True)
25+
if(NOT "x@VCPKG_ROOT@x" STREQUAL "xx" AND NOT USE_SYSTEM_DEPENDENCIES)
26+
if (EXISTS "@VCPKG_ROOT@")
27+
set(VCPKG_ROOT "@VCPKG_ROOT@"
28+
CACHE PATH "Location of dependency libraries"
29+
)
30+
include(${CMAKE_CURRENT_LIST_DIR}/vcpkg_helper.cmake)
31+
message(STATUS "Found VCPKG_ROOT: ${VCPKG_ROOT}")
32+
set(vcpkgdeps_FOUND)
33+
endif()
34+
endif()
3435
endif()
36+
endforeach()
3537

38+
if(NOT remill_setup_vcpkg AND NOT TARGET remill)
3639
set(LLVM_MAJOR_VERSION @LLVM_MAJOR_VERSION@)
3740
set(LLVM_MINOR_VERSION @LLVM_MINOR_VERSION@)
3841
set(REMILL_LLVM_VERSION "@LLVM_MAJOR_VERSION@.@LLVM_MINOR_VERSION@")
39-
40-
add_library(remill_bc STATIC IMPORTED)
41-
set_property(TARGET remill_bc PROPERTY IMPORTED_LOCATION "@REMILL_BC_LIBRARY_LOCATION@")
42-
43-
add_library(remill_os STATIC IMPORTED)
44-
set_property(TARGET remill_os PROPERTY IMPORTED_LOCATION "@REMILL_OS_LIBRARY_LOCATION@")
45-
46-
add_library(remill_arch STATIC IMPORTED)
47-
set_property(TARGET remill_arch PROPERTY IMPORTED_LOCATION "@REMILL_ARCH_LIBRARY_LOCATION@")
48-
49-
add_library(remill_arch_x86 STATIC IMPORTED)
50-
set_property(TARGET remill_arch_x86 PROPERTY IMPORTED_LOCATION "@REMILL_ARCH_X86_LIBRARY_LOCATION@")
51-
52-
add_library(remill_arch_aarch32 STATIC IMPORTED)
53-
set_property(TARGET remill_arch_aarch32 PROPERTY IMPORTED_LOCATION "@REMILL_ARCH_AARCH32_LIBRARY_LOCATION@")
54-
55-
add_library(remill_arch_aarch64 STATIC IMPORTED)
56-
set_property(TARGET remill_arch_aarch64 PROPERTY IMPORTED_LOCATION "@REMILL_ARCH_AARCH64_LIBRARY_LOCATION@")
57-
58-
add_library(remill_arch_sparc32 STATIC IMPORTED)
59-
set_property(TARGET remill_arch_sparc32 PROPERTY IMPORTED_LOCATION "@REMILL_ARCH_SPARC32_LIBRARY_LOCATION@")
60-
61-
add_library(remill_arch_sparc64 STATIC IMPORTED)
62-
set_property(TARGET remill_arch_sparc64 PROPERTY IMPORTED_LOCATION "@REMILL_ARCH_SPARC64_LIBRARY_LOCATION@")
63-
64-
add_library(remill_version STATIC IMPORTED)
65-
set_property(TARGET remill_version PROPERTY IMPORTED_LOCATION "@REMILL_VERSION_LIBRARY_LOCATION@")
66-
67-
add_library(remill INTERFACE)
68-
target_link_libraries(remill INTERFACE
69-
${LINKER_START_GROUP}
70-
remill_bc
71-
remill_os
72-
remill_arch
73-
remill_arch_x86
74-
remill_arch_aarch32
75-
remill_arch_aarch64
76-
remill_arch_sparc32
77-
remill_arch_sparc64
78-
remill_version
79-
@THIRDPARTY_LIBRARY_FILES@
80-
${LINKER_END_GROUP}
81-
)
82-
83-
target_include_directories(remill INTERFACE @THIRDPARTY_INCLUDE_DIRECTORIES@)
84-
target_include_directories(remill INTERFACE @REMILL_INCLUDE_LOCATION@)
85-
target_compile_options(remill INTERFACE @REMILL_COMPILE_OPTIONS@)
86-
target_compile_definitions(remill INTERFACE @REMILL_COMPILE_DEFINITIONS@)
8742

88-
# Add a dummy 'semantics' target to satisfy the protobuf generator
89-
add_custom_target(semantics)
43+
# External libs
44+
include(CMakeFindDependencyMacro)
45+
find_dependency(XED)
46+
find_dependency(glog)
47+
find_dependency(LLVM)
48+
# NOTE: If changing this, also replicate in CMakeLists.txt
49+
if (LLVM_WITH_Z3)
50+
find_dependency(Z3)
51+
get_target_property(LLVMSupport_LIBS LLVMSupport INTERFACE_LINK_LIBRARIES)
52+
list(REMOVE_ITEM LLVMSupport_LIBS Z3)
53+
list(APPEND LLVMSupport_LIBS z3::libz3)
54+
set_target_properties(LLVMSupport PROPERTIES
55+
INTERFACE_LINK_LIBRARIES "${LLVMSupport_LIBS}")
56+
endif()
57+
58+
# Exported Targets
59+
include("${CMAKE_CURRENT_LIST_DIR}/remillTargets.cmake")
60+
61+
if(TARGET thirdparty_llvm)
62+
# Need this so that LLVM doesn't hardcode it's include directories
63+
set_target_properties(thirdparty_llvm PROPERTIES
64+
INTERFACE_INCLUDE_DIRECTORIES "${LLVM_INCLUDE_DIRS}"
65+
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LLVM_INCLUDE_DIRS}"
66+
)
67+
endif()
68+
9069
endif()
70+
71+
set(remill_setup_vcpkg False)

cmake/remillConfig_vcpkg.cmake.in

Lines changed: 0 additions & 63 deletions
This file was deleted.

cmake/utils.cmake

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ function(GetPublicIncludeFolders output_variable)
158158
set("${output_variable}" ${collected_include_dirs} PARENT_SCOPE)
159159
endfunction()
160160

161-
function(InstallExternalTarget target_name target_path install_directory installed_file_name)
161+
function(InstallExternalTarget target_name target_path install_type installed_file_name)
162162
# Get the optional rpath parameter
163163
set(additional_arguments ${ARGN})
164164
list(LENGTH additional_arguments additional_argument_count)
@@ -195,8 +195,8 @@ function(InstallExternalTarget target_name target_path install_directory install
195195
message(FATAL_ERROR "InstallExternalTarget: The following target already exists: ${target_name}")
196196
endif()
197197

198-
if("${install_directory}" STREQUAL "")
199-
message(FATAL_ERROR "InstallExternalTarget: Invalid install directory specified")
198+
if("${install_type}" STREQUAL "")
199+
message(FATAL_ERROR "InstallExternalTarget: Invalid install type specified")
200200
endif()
201201

202202
# Generate the target
@@ -218,7 +218,7 @@ function(InstallExternalTarget target_name target_path install_directory install
218218
add_custom_target("${target_name}" ALL DEPENDS "${output_file_path}")
219219

220220
install(FILES "${output_file_path}"
221-
DESTINATION "${install_directory}"
221+
TYPE ${install_type}
222222
PERMISSIONS OWNER_READ OWNER_EXECUTE
223223
GROUP_READ GROUP_EXECUTE
224224
WORLD_READ WORLD_EXECUTE

0 commit comments

Comments
 (0)