Skip to content
This repository was archived by the owner on Aug 23, 2022. It is now read-only.

Commit 36f2660

Browse files
authored
vcpkg: Support Windows and arm64 (#726)
* Fixes and updates for McSema to build on Windows * Enable C CXX ASM languages from beginning Workaround for issue after finding Clang using Clang's own CMake find-scripts * Support aarch64 and Windows release triplets * Conditional link to remill_settings for new vcpkg build
1 parent bc4d47f commit 36f2660

File tree

4 files changed

+38
-69
lines changed

4 files changed

+38
-69
lines changed

CMakeLists_vcpkg.txt

+3-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ find_package(remill COMPONENTS VCPKG_DEPS QUIET)
1919

2020
include(cmake/vcpkg_helper.cmake)
2121

22-
project(mcsema)
22+
project(mcsema C CXX ASM)
23+
2324
include(GNUInstallDirs)
2425
cmake_minimum_required(VERSION 3.14)
2526

@@ -65,7 +66,7 @@ endif()
6566
#
6667

6768
find_package(remill CONFIG REQUIRED)
68-
list(APPEND PROJECT_LIBRARIES remill)
69+
list(APPEND PROJECT_LIBRARIES remill_settings remill)
6970
get_target_property(REMILL_INCLUDE_LOCATION remill_settings INTERFACE_INCLUDE_DIRECTORIES)
7071

7172
# protobuf

cmake/BCCompiler.cmake

+16-65
Original file line numberDiff line numberDiff line change
@@ -17,79 +17,30 @@ set(DEFAULT_BC_COMPILER_FLAGS
1717
-ffreestanding -fno-common -fno-builtin -fno-exceptions -fno-rtti
1818
-fno-asynchronous-unwind-tables -Wno-unneeded-internal-declaration
1919
-Wno-unused-function -Wgnu-inline-cpp-without-extern -std=c++14
20+
-Wno-pass-failed=transform-warning
2021
${EXTRA_BC_SYSROOT}
2122
)
2223

23-
set(CLANG_CXX_EXECUTABLE_NAME "clang++")
24-
set(LLVMLINK_EXECUTABLE_NAME "llvm-link")
24+
find_package(Clang CONFIG REQUIRED)
25+
get_target_property(CLANG_PATH clang LOCATION)
26+
get_target_property(LLVMLINK_PATH llvm-link LOCATION)
2527

26-
if(DEFINED WIN32)
27-
set(CLANG_CXX_EXECUTABLE_NAME "${CLANG_CXX_EXECUTABLE_NAME}.exe")
28-
set(LLVMLINK_EXECUTABLE_NAME "${LLVMLINK_EXECUTABLE_NAME}.exe")
29-
endif()
30-
31-
if(DEFINED ENV{LLVM_INSTALL_PREFIX})
32-
message(STATUS "Setting LLVM_INSTALL_PREFIX from the environment variable...")
33-
set(LLVM_INSTALL_PREFIX $ENV{LLVM_INSTALL_PREFIX})
34-
endif()
35-
36-
if (DEFINED CXX_COMMON_REPOSITORY_ROOT)
37-
if (NOT DEFINED LLVM_INSTALL_PREFIX)
38-
set(LLVM_INSTALL_PREFIX "${CXX_COMMON_REPOSITORY_ROOT}/llvm" CACHE PATH "Path to LLVM install prefix")
39-
endif()
40-
endif()
28+
file(WRITE "${CMAKE_BINARY_DIR}/emitllvm.test.cpp" "int main(int argc, char* argv[]){return 0;}\n\n")
4129

42-
if (DEFINED LLVM_INSTALL_PREFIX)
43-
message(STATUS "LLVM bin dir: ${LLVM_INSTALL_PREFIX}/bin")
44-
# clang path
45-
find_program(CLANG_PATH
46-
NAMES "${CLANG_CXX_EXECUTABLE_NAME}"
47-
HINTS "${LLVM_INSTALL_PREFIX}/bin"
48-
NO_DEFAULT_PATH
49-
)
30+
execute_process(COMMAND "${CLANG_PATH}" "-emit-llvm" "-c" "emitllvm.test.cpp" "-o" "emitllvm.test.cpp.bc"
31+
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
32+
RESULT_VARIABLE AOUT_IS_NOT_BC
33+
OUTPUT_QUIET ERROR_QUIET
34+
)
5035

51-
# llvm-link path
52-
find_program(LLVMLINK_PATH
53-
NAMES "${LLVMLINK_EXECUTABLE_NAME}"
54-
HINTS "${LLVM_INSTALL_PREFIX}/bin"
55-
NO_DEFAULT_PATH
56-
)
36+
if(NOT "${AOUT_IS_NOT_BC}" STREQUAL "0")
37+
message(SEND_ERROR "The following compiler is not suitable to generate bitcode: ${CLANG_PATH}")
5738
else()
58-
# clang path
59-
if("${CMAKE_CXX_COMPILER}" STREQUAL "${CLANG_CXX_EXECUTABLE_NAME}")
60-
set(CLANG_PATH "${CMAKE_CXX_COMPILER}")
61-
62-
else()
63-
find_program(CLANG_PATH
64-
NAMES "${CLANG_CXX_EXECUTABLE_NAME}"
65-
PATHS "/usr/bin" "/usr/local/bin" "${LLVM_INSTALL_PREFIX}/bin" "${LLVM_TOOLS_BINARY_DIR}" "C:/Program Files/LLVM/bin" "C:/Program Files (x86)/LLVM/bin"
66-
)
67-
endif()
68-
69-
# llvm-link path
70-
find_program(LLVMLINK_PATH
71-
NAMES "${LLVMLINK_EXECUTABLE_NAME}"
72-
PATHS "/usr/bin" "/usr/local/bin" "${LLVM_INSTALL_PREFIX}/bin" "${LLVM_TOOLS_BINARY_DIR}" "C:/Program Files/LLVM/bin" "C:/Program Files (x86)/LLVM/bin"
73-
)
74-
endif()
75-
76-
if((NOT "${CLANG_PATH}" MATCHES "CLANG_PATH-NOTFOUND") AND (NOT "${LLVMLINK_PATH}" MATCHES "LLVMLINK_PATH-NOTFOUND"))
77-
file(WRITE "${CMAKE_BINARY_DIR}/emitllvm.test.cpp" "int main(int argc, char* argv[]){return 0;}\n\n")
39+
message(STATUS "The following compiler has been selected to compile the bitcode: ${CLANG_PATH}")
40+
message(STATUS "The following linker has been selected to link the bitcode: ${LLVMLINK_PATH}")
7841

79-
execute_process(COMMAND "${CLANG_PATH}" "-emit-llvm" "-c" "emitllvm.test.cpp" "-o" "emitllvm.test.cpp.bc"
80-
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
81-
RESULT_VARIABLE AOUT_IS_NOT_BC
82-
OUTPUT_QUIET ERROR_QUIET
83-
)
84-
85-
if(NOT "${AOUT_IS_NOT_BC}" STREQUAL "0")
86-
message(SEND_ERROR "The following compiler is not suitable to generate bitcode: ${CLANG_PATH}")
87-
else()
88-
message(STATUS "The following compiler has been selected to compile the bitcode: ${CLANG_PATH}")
89-
90-
set(CMAKE_BC_COMPILER "${CLANG_PATH}" CACHE PATH "Bitcode Compiler")
91-
set(CMAKE_BC_LINKER "${LLVMLINK_PATH}" CACHE PATH "Bitcode Linker")
92-
endif()
42+
set(CMAKE_BC_COMPILER "${CLANG_PATH}" CACHE PATH "Bitcode Compiler")
43+
set(CMAKE_BC_LINKER "${LLVMLINK_PATH}" CACHE PATH "Bitcode Linker")
9344
endif()
9445

9546
#

cmake/vcpkg_helper.cmake

+16-2
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,24 @@ if (NOT USE_SYSTEM_DEPENDENCIES)
1919

2020
# Set default triplet to Release VCPKG build unless we can't find it
2121
if (NOT DEFINED VCPKG_TARGET_TRIPLET)
22+
set(_project_arch "x64")
23+
if (UNIX)
24+
execute_process(COMMAND uname -m
25+
OUTPUT_VARIABLE _SYSTEM_ARCH
26+
OUTPUT_STRIP_TRAILING_WHITESPACE)
27+
else()
28+
message(WARNING "No detection of architecture for this platform. Assuming x64")
29+
endif()
30+
if (_SYSTEM_ARCH MATCHES "^[Aa][Aa][Rr][Cc][Hh]64$")
31+
set(_project_arch "arm64")
32+
endif()
33+
2234
if (APPLE)
23-
set(_project_vcpkg_triplet "x64-osx-rel")
35+
set(_project_vcpkg_triplet "${_project_arch}-osx-rel")
2436
elseif(UNIX)
25-
set(_project_vcpkg_triplet "x64-linux-rel")
37+
set(_project_vcpkg_triplet "${_project_arch}-linux-rel")
38+
elseif(WIN32)
39+
set(_project_vcpkg_triplet "${_project_arch}-windows-static-md-rel")
2640
else()
2741
message(FATAL_ERROR "Could not detect default release triplet")
2842
endif()

mcsema/Version/CMakeLists.txt

+3
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,8 @@ include("${MCSEMA_SOURCE_DIR}/cmake/git_watcher.cmake")
1212

1313
# Create a library out of the compiled post-configure file.
1414
add_library(McSemaVersion STATIC ${POST_CONFIGURE_FILE})
15+
if (NOT DEFINED ENV{TRAILOFBITS_LIBRARIES})
16+
target_link_libraries(McSemaVersion PRIVATE remill_settings)
17+
endif()
1518
target_include_directories(McSemaVersion PUBLIC ${MCSEMA_SOURCE_DIR})
1619
add_dependencies(McSemaVersion check_git_${PROJECT_NAME})

0 commit comments

Comments
 (0)