|
| 1 | +set(CMAKE_SYSTEM_NAME Windows) |
| 2 | +set(CMAKE_SYSTEM_PROCESSOR arm64) |
| 3 | + |
| 4 | +set(target arm64-pc-windows-msvc) |
| 5 | +set(CMAKE_C_COMPILER_TARGET ${target}) |
| 6 | +set(CMAKE_CXX_COMPILER_TARGET ${target}) |
| 7 | + |
| 8 | +set(CMAKE_C_COMPILER clang) |
| 9 | +set(CMAKE_CXX_COMPILER clang++) |
| 10 | +set(CMAKE_RC_COMPILER llvm-rc) |
| 11 | + |
| 12 | +set(LLVM_INSTALLATION_URL "https://github.com/llvm/llvm-project/releases/tag/llvmorg-19.1.5") |
| 13 | + |
| 14 | +set(PROGRAMFILES_ARM64 "$ENV{ProgramFiles\(Arm\)}") |
| 15 | +set(PROGRAMFILES "$ENV{ProgramFiles}") |
| 16 | +set(PROGRAMFILES_X86 "$ENV{ProgramFiles\(x86\)}") |
| 17 | +set(PROGRAMFILES_PATHS |
| 18 | + "${PROGRAMFILES_ARM64}" |
| 19 | + "${PROGRAMFILES}" |
| 20 | + "${PROGRAMFILES_X86}" |
| 21 | + "C:/Program Files (Arm)" |
| 22 | + "C:/Program Files" |
| 23 | + "C:/Program Files (x86)" |
| 24 | +) |
| 25 | + |
| 26 | +set(LLVM_INSTALL_PATHS "") |
| 27 | +foreach(PATH IN LISTS PROGRAMFILES_PATHS) |
| 28 | + list(APPEND LLVM_INSTALL_PATHS "${PATH}/LLVM") |
| 29 | + |
| 30 | + file(GLOB_RECURSE FOUND_LLVM_ROOT |
| 31 | + "${PATH}/Microsoft Visual Studio/*/VC/Tools/Llvm/ARM64" |
| 32 | + "${PATH}/Microsoft Visual Studio/**/*/VC/Tools/Llvm/ARM64") |
| 33 | + |
| 34 | + if(FOUND_LLVM_ROOT) |
| 35 | + list(APPEND LLVM_INSTALL_PATHS ${FOUND_LLVM_ROOT}) |
| 36 | + endif() |
| 37 | +endforeach() |
| 38 | + |
| 39 | +if(DEFINED LLVM_ROOT AND EXISTS "${LLVM_ROOT}") |
| 40 | + list(INSERT LLVM_INSTALL_PATHS 0 "${LLVM_ROOT}") |
| 41 | +endif() |
| 42 | + |
| 43 | +set(LLVM_ROOT "") |
| 44 | +foreach(PATH IN LISTS LLVM_INSTALL_PATHS) |
| 45 | + if(EXISTS "${PATH}/bin/clang.exe" AND EXISTS "${PATH}/bin/clang++.exe" AND EXISTS "${PATH}/bin/llvm-rc.exe") |
| 46 | + set(LLVM_ROOT "${PATH}") |
| 47 | + break() |
| 48 | + endif() |
| 49 | +endforeach() |
| 50 | + |
| 51 | +if(LLVM_ROOT STREQUAL "") |
| 52 | + message(FATAL_ERROR "LLVM installation was not found. Please install LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}") |
| 53 | +endif() |
| 54 | + |
| 55 | +if (NOT EXISTS "${CMAKE_C_COMPILER}" OR NOT EXISTS "${CMAKE_CXX_COMPILER}" OR NOT EXISTS "${CMAKE_RC_COMPILER}") |
| 56 | + set(CMAKE_C_COMPILER "${LLVM_ROOT}/bin/clang.exe") |
| 57 | + set(CMAKE_CXX_COMPILER "${LLVM_ROOT}/bin/clang++.exe") |
| 58 | + set(CMAKE_RC_COMPILER "${LLVM_ROOT}/bin/llvm-rc.exe") |
| 59 | +endif() |
| 60 | + |
| 61 | +if (NOT EXISTS "${CMAKE_C_COMPILER}") |
| 62 | + message(FATAL_ERROR "Clang compiler not found at ${CMAKE_C_COMPILER}. Please reinstall LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}") |
| 63 | +endif() |
| 64 | +if (NOT EXISTS "${CMAKE_CXX_COMPILER}") |
| 65 | + message(FATAL_ERROR "Clang++ compiler not found at ${CMAKE_CXX_COMPILER}. Please reinstall LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}") |
| 66 | +endif() |
| 67 | +if (NOT EXISTS "${CMAKE_RC_COMPILER}") |
| 68 | + message(FATAL_ERROR "LLVM Resource Compiler not found at ${CMAKE_RC_COMPILER}. Please reinstall LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}") |
| 69 | +endif() |
| 70 | + |
| 71 | +set(arch_c_flags "-march=armv8.7-a -fvectorize -ffp-model=fast -fno-finite-math-only") |
| 72 | +set(warn_c_flags "-Wno-format -Wno-unused-variable -Wno-unused-function -Wno-gnu-zero-variadic-macro-arguments") |
| 73 | + |
| 74 | +set(CMAKE_C_FLAGS_INIT "${arch_c_flags} ${warn_c_flags}") |
| 75 | +set(CMAKE_CXX_FLAGS_INIT "${arch_c_flags} ${warn_c_flags}") |
| 76 | + |
| 77 | +if ((NOT DEFINED CMAKE_MAKE_PROGRAM OR NOT EXISTS CMAKE_MAKE_PROGRAM) AND (CMAKE_GENERATOR STREQUAL "Ninja" OR CMAKE_GENERATOR STREQUAL "Ninja Multi-Config")) |
| 78 | + find_program(NINJA_EXECUTABLE ninja) |
| 79 | + |
| 80 | + if(NINJA_EXECUTABLE AND EXISTS "${NINJA_EXECUTABLE}") |
| 81 | + set(CMAKE_MAKE_PROGRAM "${NINJA_EXECUTABLE}") |
| 82 | + else() |
| 83 | + foreach(PATH IN LISTS PROGRAMFILES_PATHS) |
| 84 | + file(GLOB_RECURSE FOUND_NINJA_EXE |
| 85 | + "${PATH}/Microsoft Visual Studio/*/CMake/Ninja/ninja.exe" |
| 86 | + "${PATH}/Microsoft Visual Studio/**/*/CMake/Ninja/ninja.exe") |
| 87 | + |
| 88 | + if(FOUND_NINJA_EXE) |
| 89 | + list(GET FOUND_NINJA_EXE 0 CMAKE_MAKE_PROGRAM) |
| 90 | + break() |
| 91 | + endif() |
| 92 | + endforeach() |
| 93 | + endif() |
| 94 | + |
| 95 | + if (NOT CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}") |
| 96 | + message(FATAL_ERROR "Ninja build system not found. Please install Ninja or Visual Studio Build Tools.") |
| 97 | + endif() |
| 98 | +endif() |
0 commit comments