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
This commit is contained in:
Eric Kilmer
2021-02-02 15:49:39 -05:00
committed by GitHub
parent bc4d47fe94
commit 36f2660c8f
4 changed files with 38 additions and 69 deletions
+3 -2
View File
@@ -19,7 +19,8 @@ find_package(remill COMPONENTS VCPKG_DEPS QUIET)
include(cmake/vcpkg_helper.cmake)
project(mcsema)
project(mcsema C CXX ASM)
include(GNUInstallDirs)
cmake_minimum_required(VERSION 3.14)
@@ -65,7 +66,7 @@ endif()
#
find_package(remill CONFIG REQUIRED)
list(APPEND PROJECT_LIBRARIES remill)
list(APPEND PROJECT_LIBRARIES remill_settings remill)
get_target_property(REMILL_INCLUDE_LOCATION remill_settings INTERFACE_INCLUDE_DIRECTORIES)
# protobuf
+16 -65
View File
@@ -17,79 +17,30 @@ set(DEFAULT_BC_COMPILER_FLAGS
-ffreestanding -fno-common -fno-builtin -fno-exceptions -fno-rtti
-fno-asynchronous-unwind-tables -Wno-unneeded-internal-declaration
-Wno-unused-function -Wgnu-inline-cpp-without-extern -std=c++14
-Wno-pass-failed=transform-warning
${EXTRA_BC_SYSROOT}
)
set(CLANG_CXX_EXECUTABLE_NAME "clang++")
set(LLVMLINK_EXECUTABLE_NAME "llvm-link")
find_package(Clang CONFIG REQUIRED)
get_target_property(CLANG_PATH clang LOCATION)
get_target_property(LLVMLINK_PATH llvm-link LOCATION)
if(DEFINED WIN32)
set(CLANG_CXX_EXECUTABLE_NAME "${CLANG_CXX_EXECUTABLE_NAME}.exe")
set(LLVMLINK_EXECUTABLE_NAME "${LLVMLINK_EXECUTABLE_NAME}.exe")
endif()
file(WRITE "${CMAKE_BINARY_DIR}/emitllvm.test.cpp" "int main(int argc, char* argv[]){return 0;}\n\n")
if(DEFINED ENV{LLVM_INSTALL_PREFIX})
message(STATUS "Setting LLVM_INSTALL_PREFIX from the environment variable...")
set(LLVM_INSTALL_PREFIX $ENV{LLVM_INSTALL_PREFIX})
endif()
execute_process(COMMAND "${CLANG_PATH}" "-emit-llvm" "-c" "emitllvm.test.cpp" "-o" "emitllvm.test.cpp.bc"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
RESULT_VARIABLE AOUT_IS_NOT_BC
OUTPUT_QUIET ERROR_QUIET
)
if (DEFINED CXX_COMMON_REPOSITORY_ROOT)
if (NOT DEFINED LLVM_INSTALL_PREFIX)
set(LLVM_INSTALL_PREFIX "${CXX_COMMON_REPOSITORY_ROOT}/llvm" CACHE PATH "Path to LLVM install prefix")
endif()
endif()
if (DEFINED LLVM_INSTALL_PREFIX)
message(STATUS "LLVM bin dir: ${LLVM_INSTALL_PREFIX}/bin")
# clang path
find_program(CLANG_PATH
NAMES "${CLANG_CXX_EXECUTABLE_NAME}"
HINTS "${LLVM_INSTALL_PREFIX}/bin"
NO_DEFAULT_PATH
)
# llvm-link path
find_program(LLVMLINK_PATH
NAMES "${LLVMLINK_EXECUTABLE_NAME}"
HINTS "${LLVM_INSTALL_PREFIX}/bin"
NO_DEFAULT_PATH
)
if(NOT "${AOUT_IS_NOT_BC}" STREQUAL "0")
message(SEND_ERROR "The following compiler is not suitable to generate bitcode: ${CLANG_PATH}")
else()
# clang path
if("${CMAKE_CXX_COMPILER}" STREQUAL "${CLANG_CXX_EXECUTABLE_NAME}")
set(CLANG_PATH "${CMAKE_CXX_COMPILER}")
message(STATUS "The following compiler has been selected to compile the bitcode: ${CLANG_PATH}")
message(STATUS "The following linker has been selected to link the bitcode: ${LLVMLINK_PATH}")
else()
find_program(CLANG_PATH
NAMES "${CLANG_CXX_EXECUTABLE_NAME}"
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"
)
endif()
# llvm-link path
find_program(LLVMLINK_PATH
NAMES "${LLVMLINK_EXECUTABLE_NAME}"
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"
)
endif()
if((NOT "${CLANG_PATH}" MATCHES "CLANG_PATH-NOTFOUND") AND (NOT "${LLVMLINK_PATH}" MATCHES "LLVMLINK_PATH-NOTFOUND"))
file(WRITE "${CMAKE_BINARY_DIR}/emitllvm.test.cpp" "int main(int argc, char* argv[]){return 0;}\n\n")
execute_process(COMMAND "${CLANG_PATH}" "-emit-llvm" "-c" "emitllvm.test.cpp" "-o" "emitllvm.test.cpp.bc"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
RESULT_VARIABLE AOUT_IS_NOT_BC
OUTPUT_QUIET ERROR_QUIET
)
if(NOT "${AOUT_IS_NOT_BC}" STREQUAL "0")
message(SEND_ERROR "The following compiler is not suitable to generate bitcode: ${CLANG_PATH}")
else()
message(STATUS "The following compiler has been selected to compile the bitcode: ${CLANG_PATH}")
set(CMAKE_BC_COMPILER "${CLANG_PATH}" CACHE PATH "Bitcode Compiler")
set(CMAKE_BC_LINKER "${LLVMLINK_PATH}" CACHE PATH "Bitcode Linker")
endif()
set(CMAKE_BC_COMPILER "${CLANG_PATH}" CACHE PATH "Bitcode Compiler")
set(CMAKE_BC_LINKER "${LLVMLINK_PATH}" CACHE PATH "Bitcode Linker")
endif()
#
+16 -2
View File
@@ -19,10 +19,24 @@ if (NOT USE_SYSTEM_DEPENDENCIES)
# Set default triplet to Release VCPKG build unless we can't find it
if (NOT DEFINED VCPKG_TARGET_TRIPLET)
set(_project_arch "x64")
if (UNIX)
execute_process(COMMAND uname -m
OUTPUT_VARIABLE _SYSTEM_ARCH
OUTPUT_STRIP_TRAILING_WHITESPACE)
else()
message(WARNING "No detection of architecture for this platform. Assuming x64")
endif()
if (_SYSTEM_ARCH MATCHES "^[Aa][Aa][Rr][Cc][Hh]64$")
set(_project_arch "arm64")
endif()
if (APPLE)
set(_project_vcpkg_triplet "x64-osx-rel")
set(_project_vcpkg_triplet "${_project_arch}-osx-rel")
elseif(UNIX)
set(_project_vcpkg_triplet "x64-linux-rel")
set(_project_vcpkg_triplet "${_project_arch}-linux-rel")
elseif(WIN32)
set(_project_vcpkg_triplet "${_project_arch}-windows-static-md-rel")
else()
message(FATAL_ERROR "Could not detect default release triplet")
endif()
+3
View File
@@ -12,5 +12,8 @@ include("${MCSEMA_SOURCE_DIR}/cmake/git_watcher.cmake")
# Create a library out of the compiled post-configure file.
add_library(McSemaVersion STATIC ${POST_CONFIGURE_FILE})
if (NOT DEFINED ENV{TRAILOFBITS_LIBRARIES})
target_link_libraries(McSemaVersion PRIVATE remill_settings)
endif()
target_include_directories(McSemaVersion PUBLIC ${MCSEMA_SOURCE_DIR})
add_dependencies(McSemaVersion check_git_${PROJECT_NAME})