Improve dependencies superbuild for Windows (#736)

Closes #735
This commit is contained in:
Duncan Ogilvie
2025-12-01 14:04:02 -05:00
committed by GitHub
parent 9816ccca56
commit 06923f4ab9
6 changed files with 95 additions and 20 deletions
+5 -4
View File
@@ -44,6 +44,7 @@ jobs:
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
./llvm.sh ${{ matrix.llvm }}
apt update
apt install --no-install-recommends -y \
llvm-${{ matrix.llvm }}-dev
echo "LLVM_PREFIX=$$(llvm-config-${{ matrix.llvm }} --prefix)" >> $GITHUB_ENV
@@ -58,7 +59,7 @@ jobs:
- name: Build dependencies
run: |
cmake -G Ninja -S dependencies -B dependencies/build -DUSE_EXTERNAL_LLVM=ON "-DCMAKE_PREFIX_PATH=$LLVM_PREFIX"
cmake -G Ninja -S dependencies -B dependencies/build -DUSE_EXTERNAL_LLVM=ON "-DCMAKE_PREFIX_PATH:PATH=$LLVM_PREFIX"
cmake --build dependencies/build
- name: Python venv for tests
@@ -69,7 +70,7 @@ jobs:
- name: Build remill
run: |
. .venv/bin/activate
cmake -G Ninja -B build "-DCMAKE_PREFIX_PATH=$LLVM_PREFIX;$PWD/dependencies/install" "-DCMAKE_INSTALL_PREFIX=$PWD/install"
cmake -G Ninja -B build "-DCMAKE_PREFIX_PATH:PATH=$PWD/dependencies/install" "-DCMAKE_INSTALL_PREFIX=$PWD/install"
cmake --build build
- name: Install remill
@@ -116,7 +117,7 @@ jobs:
- name: Build dependencies
run: |
cmake -G Ninja -S dependencies -B dependencies/build -DUSE_EXTERNAL_LLVM=ON "-DCMAKE_PREFIX_PATH=$LLVM_PREFIX"
cmake -G Ninja -S dependencies -B dependencies/build -DUSE_EXTERNAL_LLVM=ON "-DCMAKE_PREFIX_PATH:PATH=$LLVM_PREFIX"
cmake --build dependencies/build
- name: Python venv for tests
@@ -127,7 +128,7 @@ jobs:
- name: Build remill
run: |
. .venv/bin/activate
cmake -G Ninja -B build "-DCMAKE_PREFIX_PATH=$LLVM_PREFIX;$PWD/dependencies/install" "-DCMAKE_INSTALL_PREFIX=$PWD/install"
cmake -G Ninja -B build "-DCMAKE_PREFIX_PATH:PATH=$PWD/dependencies/install" "-DCMAKE_INSTALL_PREFIX=$PWD/install"
cmake --build build
- name: Install remill
+7 -7
View File
@@ -68,21 +68,21 @@ cmake -G Ninja -S dependencies -B dependencies/build
cmake --build dependencies/build
# Step 2: Build remill
cmake -G Ninja -B build -DCMAKE_PREFIX_PATH=$(pwd)/dependencies/install -DCMAKE_BUILD_TYPE=Release
cmake -G Ninja -B build -DCMAKE_PREFIX_PATH:PATH=$(pwd)/dependencies/install -DCMAKE_BUILD_TYPE=Release
cmake --build build
```
### Windows (requires clang or clang-cl)
### Windows (requires clang-cl)
**Note**: This requires running from a Visual Studio developer prompt.
```bash
# Step 1: Build dependencies
cmake -G Ninja -S dependencies -B dependencies/build -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
cmake -G Ninja -S dependencies -B dependencies/build -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl
cmake --build dependencies/build
# Step 2: Build remill
cmake -G Ninja -B build -DCMAKE_PREFIX_PATH=%CD%/dependencies/install -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=Release
cmake -G Ninja -B build -DCMAKE_PREFIX_PATH:PATH=%CD%/dependencies/install -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_BUILD_TYPE=Release
cmake --build build
```
@@ -94,11 +94,11 @@ brew install llvm@17
LLVM_PREFIX=$(brew --prefix llvm@17)
# Build dependencies with external LLVM
cmake -G Ninja -S dependencies -B dependencies/build -DUSE_EXTERNAL_LLVM=ON "-DCMAKE_PREFIX_PATH=$LLVM_PREFIX"
cmake -G Ninja -S dependencies -B dependencies/build -DUSE_EXTERNAL_LLVM=ON "-DCMAKE_PREFIX_PATH:PATH=$LLVM_PREFIX"
cmake --build dependencies/build
# Build remill
cmake -G Ninja -B build "-DCMAKE_PREFIX_PATH=$LLVM_PREFIX;$(pwd)/dependencies/install" -DCMAKE_BUILD_TYPE=Release
cmake -G Ninja -B build "-DCMAKE_PREFIX_PATH:PATH=$(pwd)/dependencies/install" -DCMAKE_BUILD_TYPE=Release
cmake --build build
```
@@ -110,6 +110,6 @@ cmake -G Ninja -S dependencies -B dependencies/build -DUSE_EXTERNAL_LLVM=ON
cmake --build dependencies/build
# Build remill
cmake -G Ninja -B build "-DCMAKE_PREFIX_PATH=$LLVM_PREFIX;$(pwd)/dependencies/install" -DCMAKE_BUILD_TYPE=Release
cmake -G Ninja -B build "-DCMAKE_PREFIX_PATH:PATH=$(pwd)/dependencies/install" -DCMAKE_BUILD_TYPE=Release
cmake --build build
```
+17 -1
View File
@@ -51,6 +51,22 @@ simple_git(https://github.com/google/googletest v1.17.0
include(xed.cmake)
if(NOT USE_EXTERNAL_LLVM)
set(LLVM_CONFIG "${CMAKE_INSTALL_PREFIX}/lib/cmake/llvm/LLVMConfig.cmake")
if(USE_EXTERNAL_LLVM)
# Create a forwarding LLVMConfig.cmake file that adds the external LLVM to CMAKE_PREFIX_PATH
# and then includes the external LLVMConfig.cmake
if(NOT EXISTS "${LLVM_DIR}/LLVMConfig.cmake")
message(FATAL_ERROR "LLVMConfig.cmake not found in LLVM_DIR (${LLVM_DIR})")
endif()
file(WRITE "${CMAKE_INSTALL_PREFIX}/lib/cmake/llvm/LLVMConfig.cmake"
"if(NOT \"${LLVM_INSTALL_PREFIX}\" IN_LIST CMAKE_PREFIX_PATH)\n"
" list(PREPEND CMAKE_PREFIX_PATH \"${LLVM_INSTALL_PREFIX}\")\n"
" set(CMAKE_PREFIX_PATH \"\${CMAKE_PREFIX_PATH}\" CACHE PATH \"\" FORCE)\n"
" message(STATUS \"Updating CMAKE_PREFIX_PATH: \${CMAKE_PREFIX_PATH}\")\n"
"endif()\n"
"include(\"${LLVM_DIR}/LLVMConfig.cmake\")\n"
)
else()
file(REMOVE "${LLVM_CONFIG}")
include(llvm.cmake)
endif()
+1 -1
View File
@@ -9,4 +9,4 @@ cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
```
This will create a [CMake prefix](https://cmake.org/cmake/help/latest/command/find_package.html#search-procedure), which you pass to your project with `-DCMAKE_PREFIX_PATH=/path/to/dependencies/install`. See [presentation.md](https://github.com/LLVMParty/packages/blob/main/presentation.md) and [dependencies.md](https://github.com/LLVMParty/packages/blob/main/dependencies.md) for more information.
This will create a [CMake prefix](https://cmake.org/cmake/help/latest/command/find_package.html#search-procedure), which you pass to your project with `-DCMAKE_PREFIX_PATH:FILEPATH=/path/to/dependencies/install`. See [presentation.md](https://github.com/LLVMParty/packages/blob/main/presentation.md) and [dependencies.md](https://github.com/LLVMParty/packages/blob/main/dependencies.md) for more information.
+23
View File
@@ -21,6 +21,29 @@ set(LLVM_ARGS
"-DLLVM_LINK_LLVM_DYLIB:STRING=${BUILD_SHARED_LIBS}"
)
# LLVM has a bug on Windows where using clang.exe as the compiler fails to detect
# the host target triple, so we have to specify it manually.
# Reference: https://github.com/lifting-bits/remill/issues/735#issuecomment-3590986077
if(WIN32)
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT CMAKE_CXX_COMPILER_FRONTEND_VARIANT MATCHES "^MSVC$")
message(WARNING
"Using clang.exe as the compiler on Windows is not well supported.\n"
"If you run into issues, use clang-cl instead:\n"
" cmake -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl ...\n"
)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(ARM64|arm64|aarch64)$")
set(LLVM_ARCH "aarch64")
else()
set(LLVM_ARCH "x86_64")
endif()
else()
set(LLVM_ARCH "i686")
endif()
list(APPEND LLVM_ARGS "-DLLVM_HOST_TRIPLE:STRING=${LLVM_ARCH}-pc-windows-msvc")
endif()
endif()
if(USE_SANITIZERS)
list(APPEND LLVM_ARGS "-DLLVM_USE_SANITIZER:STRING=Address;Undefined")
endif()
+42 -7
View File
@@ -20,11 +20,37 @@ message(STATUS "Configuration: ${CMAKE_BUILD_TYPE}")
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/../install" CACHE PATH "Install prefix" FORCE)
endif()
cmake_path(ABSOLUTE_PATH CMAKE_INSTALL_PREFIX NORMALIZE)
set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE PATH "Install prefix" FORCE)
message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}")
# Save the host platform in the install prefix
make_directory(${CMAKE_INSTALL_PREFIX})
file(TOUCH ${CMAKE_INSTALL_PREFIX}/${CMAKE_SYSTEM}.build)
# Verify build configuration hasn't changed
set(BUILD_CONFIG_FILE "${CMAKE_INSTALL_PREFIX}/.build_config")
string(JOIN "\n" CURRENT_BUILD_CONFIG
"CMAKE_SYSTEM=${CMAKE_SYSTEM}"
"CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}"
"CMAKE_CXX_COMPILER_ID=${CMAKE_CXX_COMPILER_ID}"
"CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
"CMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
)
if(EXISTS "${BUILD_CONFIG_FILE}")
file(READ "${BUILD_CONFIG_FILE}" PREVIOUS_BUILD_CONFIG)
if(NOT PREVIOUS_BUILD_CONFIG STREQUAL CURRENT_BUILD_CONFIG)
message(FATAL_ERROR
"Build configuration changed!\n"
"[previous]\n${PREVIOUS_BUILD_CONFIG}\n"
"[current]\n${CURRENT_BUILD_CONFIG}\n"
"\n"
"Please delete the build and install directories, then reconfigure:\n"
" cmake -E rm -rf \"${CMAKE_BINARY_DIR}\"\n"
" cmake -E rm -rf \"${CMAKE_INSTALL_PREFIX}\"\n"
)
endif()
else()
file(MAKE_DIRECTORY "${CMAKE_INSTALL_PREFIX}")
file(WRITE "${BUILD_CONFIG_FILE}" "${CURRENT_BUILD_CONFIG}")
endif()
# Git is necessary for submodules
find_package(Git REQUIRED)
@@ -87,21 +113,30 @@ list(JOIN ADDITIONAL_FLAGS " " ADDITIONAL_FLAGS)
# Default cache variables for all projects
list(APPEND CMAKE_ARGS
"-DCMAKE_PREFIX_PATH:FILEPATH=${CMAKE_INSTALL_PREFIX};${CMAKE_PREFIX_PATH}"
"-DCMAKE_INSTALL_PREFIX:FILEPATH=${CMAKE_INSTALL_PREFIX}"
"-DCMAKE_PREFIX_PATH:PATH=${CMAKE_INSTALL_PREFIX};${CMAKE_PREFIX_PATH}"
"-DCMAKE_INSTALL_PREFIX:PATH=${CMAKE_INSTALL_PREFIX}"
"-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}"
"-DBUILD_SHARED_LIBS:STRING=${BUILD_SHARED_LIBS}"
"-DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}"
"-DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}"
"-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS} ${ADDITIONAL_FLAGS}"
"-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS} ${ADDITIONAL_FLAGS}"
"-DCMAKE_POSITION_INDEPENDENT_CODE:STRING=ON"
"-DCMAKE_ERROR_DEPRECATED:STRING=OFF"
"-DCMAKE_ERROR_DEVELOPER_WARNINGS:STRING=OFF"
)
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0")
list(APPEND CMAKE_ARGS
"-DCMAKE_POLICY_VERSION_MINIMUM:STRING=${CMAKE_MINIMUM_REQUIRED_VERSION}"
)
endif()
if(CMAKE_C_COMPILER_LAUNCHER)
list(APPEND CMAKE_ARGS "-DCMAKE_C_COMPILER_LAUNCHER:STRING=${CMAKE_C_COMPILER_LAUNCHER}")
list(APPEND CMAKE_ARGS "-DCMAKE_C_COMPILER_LAUNCHER:FILEPATH=${CMAKE_C_COMPILER_LAUNCHER}")
endif()
if(CMAKE_CXX_COMPILER_LAUNCHER)
list(APPEND CMAKE_ARGS "-DCMAKE_CXX_COMPILER_LAUNCHER:STRING=${CMAKE_CXX_COMPILER_LAUNCHER}")
list(APPEND CMAKE_ARGS "-DCMAKE_CXX_COMPILER_LAUNCHER:FILEPATH=${CMAKE_CXX_COMPILER_LAUNCHER}")
endif()
message(STATUS "Compiling all dependencies with the following CMake arguments:")