Skip to content

Commit 8ba5938

Browse files
committed
fix: Windows cmake build
1 parent a5b8ad4 commit 8ba5938

13 files changed

+285
-467
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
function(ensureNinjaPath PROGRAMFILES_PATHS)
2+
if ((NOT DEFINED CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}" OR NOT CMAKE_MAKE_PROGRAM) AND (CMAKE_GENERATOR STREQUAL "Ninja" OR CMAKE_GENERATOR STREQUAL "Ninja Multi-Config"))
3+
find_program(NINJA_EXECUTABLE ninja)
4+
5+
set(CMAKE_MAKE_PROGRAM "")
6+
7+
if(NINJA_EXECUTABLE AND EXISTS "${NINJA_EXECUTABLE}")
8+
set(CMAKE_MAKE_PROGRAM "${NINJA_EXECUTABLE}")
9+
endif()
10+
11+
if (NOT CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}")
12+
set(PROGRAMDATA_PATH "$ENV{ProgramData}")
13+
file(TO_CMAKE_PATH "${PROGRAMDATA_PATH}" PROGRAMDATA_PATH)
14+
15+
if (PROGRAMDATA_PATH AND EXISTS "${PROGRAMDATA_PATH}")
16+
file(GLOB_RECURSE FOUND_NINJA_EXE "${PROGRAMDATA_PATH}/chocolatey/bin/ninja.exe")
17+
18+
if(FOUND_NINJA_EXE)
19+
list(GET FOUND_NINJA_EXE 0 CMAKE_MAKE_PROGRAM)
20+
endif()
21+
else()
22+
endif()
23+
24+
if (NOT CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}")
25+
set(LOCALAPPDATA_PATH "$ENV{LOCALAPPDATA}")
26+
file(TO_CMAKE_PATH "${LOCALAPPDATA_PATH}" LOCALAPPDATA_PATH)
27+
28+
if (LOCALAPPDATA_PATH AND EXISTS "${LOCALAPPDATA_PATH}")
29+
file(GLOB_RECURSE FOUND_NINJA_EXE "${LOCALAPPDATA_PATH}/Microsoft/WinGet/Packages/Ninja-build.Ninja_Microsoft.Winget.*/ninja.exe")
30+
31+
if(FOUND_NINJA_EXE)
32+
list(GET FOUND_NINJA_EXE 0 CMAKE_MAKE_PROGRAM)
33+
endif()
34+
else()
35+
endif()
36+
37+
if (NOT CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}")
38+
foreach(PATH IN LISTS PROGRAMFILES_PATHS)
39+
file(GLOB_RECURSE FOUND_NINJA_EXE
40+
"${PATH}/Microsoft Visual Studio/*/CMake/Ninja/ninja.exe"
41+
"${PATH}/Microsoft Visual Studio/**/*/CMake/Ninja/ninja.exe")
42+
43+
if(FOUND_NINJA_EXE)
44+
list(GET FOUND_NINJA_EXE 0 CMAKE_MAKE_PROGRAM)
45+
break()
46+
endif()
47+
endforeach()
48+
endif()
49+
50+
if (NOT CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}")
51+
message(FATAL_ERROR "Ninja build system not found. Please install Ninja or Visual Studio Build Tools.")
52+
endif()
53+
endif()
54+
endfunction()
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
function(ensureNodeLib PROGRAMFILES_PATHS HOST_ARCH TARGET_ARCH)
2+
if (CMAKE_JS_NODELIB_DEF AND CMAKE_JS_NODELIB_TARGET)
3+
if (NOT DEFINED NODE_LIB_CMAKE_AR)
4+
foreach(PATH IN LISTS PROGRAMFILES_PATHS)
5+
if(NODE_LIB_CMAKE_AR)
6+
break()
7+
endif()
8+
9+
file(GLOB_RECURSE FOUND_LIB_EXE
10+
"${PATH}/Microsoft Visual Studio/*/VC/Tools/MSVC/*/bin/Host${HOST_ARCH}/${TARGET_ARCH}/lib.exe"
11+
"${PATH}/Microsoft Visual Studio/**/*/VC/Tools/MSVC/*/bin/Host${HOST_ARCH}/${TARGET_ARCH}/lib.exe")
12+
13+
if(FOUND_LIB_EXE)
14+
list(GET FOUND_LIB_EXE 0 NODE_LIB_CMAKE_AR)
15+
break()
16+
endif()
17+
endforeach()
18+
endif()
19+
20+
set(NODE_LIB_CMAKE_AR_MACHINE_FLAG "")
21+
if (TARGET_ARCH STREQUAL "x64")
22+
set(NODE_LIB_CMAKE_AR_MACHINE_FLAG "/MACHINE:X64")
23+
elseif (TARGET_ARCH STREQUAL "arm64")
24+
set(NODE_LIB_CMAKE_AR_MACHINE_FLAG "/MACHINE:ARM64")
25+
endif()
26+
27+
if (EXISTS "${NODE_LIB_CMAKE_AR}")
28+
# Generate node.lib
29+
execute_process(COMMAND ${NODE_LIB_CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF} /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS} ${NODE_LIB_CMAKE_AR_MACHINE_FLAG} /nologo)
30+
else()
31+
message(FATAL_ERROR "Windows Resource Compiler (lib.exe) not found. Please install Visual Studio Build Tools.")
32+
endif()
33+
endif()
34+
endfunction()
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
function(llvmApplyGnuModeAdaptations)
2+
# adapt cmake-js to work with llvm in GNU mode
3+
if (NOT CMAKE_SHARED_LINKER_FLAGS MATCHES "-Xlinker /DELAYLOAD:NODE.EXE")
4+
string(REPLACE "/DELAYLOAD:NODE.EXE" "-Xlinker /DELAYLOAD:NODE.EXE -Xlinker /defaultlib:delayimp"
5+
CMAKE_SHARED_LINKER_FLAGS
6+
"${CMAKE_SHARED_LINKER_FLAGS}")
7+
endif()
8+
9+
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
10+
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Xclang --dependent-lib=msvcrt")
11+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Xclang --dependent-lib=msvcrt")
12+
endfunction()
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
function(llvmEnsureCmakeAr PROGRAMFILES_PATHS CURRENT_ARCH)
2+
set (LLVM_DIR_ARCH_NAME "")
3+
if (CURRENT_ARCH STREQUAL "x64")
4+
set (LLVM_DIR_ARCH_NAME "x64")
5+
elseif (CURRENT_ARCH STREQUAL "arm64")
6+
set (LLVM_DIR_ARCH_NAME "ARM64")
7+
endif()
8+
9+
if (NOT DEFINED CMAKE_AR OR NOT EXISTS "${CMAKE_AR}")
10+
set(LLVM_INSTALL_PATHS "")
11+
foreach(PATH IN LISTS PROGRAMFILES_PATHS)
12+
list(APPEND LLVM_INSTALL_PATHS "${PATH}/LLVM")
13+
14+
file(GLOB_RECURSE FOUND_LLVM_ROOT
15+
"${PATH}/Microsoft Visual Studio/*/VC/Tools/Llvm/${CURRENT_ARCH}"
16+
"${PATH}/Microsoft Visual Studio/**/*/VC/Tools/Llvm/${CURRENT_ARCH}")
17+
18+
if(FOUND_LLVM_ROOT)
19+
list(APPEND LLVM_INSTALL_PATHS ${FOUND_LLVM_ROOT})
20+
endif()
21+
endforeach()
22+
23+
if(DEFINED LLVM_ROOT AND EXISTS "${LLVM_ROOT}")
24+
list(INSERT LLVM_INSTALL_PATHS 0 "${LLVM_ROOT}")
25+
endif()
26+
27+
foreach(PATH IN LISTS LLVM_INSTALL_PATHS)
28+
if(EXISTS "${PATH}/bin/llvm-ar.exe" AND EXISTS "${PATH}/bin/llvm-ar.exe")
29+
set(CMAKE_AR "${PATH}/bin/llvm-ar.exe")
30+
break()
31+
endif()
32+
endforeach()
33+
endif()
34+
endfunction()
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
function(llvmUseGnuModeCompilers CURRENT_ARCH PROGRAMFILES_PATHS)
2+
set(LLVM_INSTALLATION_URL "https://github.com/llvm/llvm-project/releases/tag/llvmorg-19.1.5")
3+
4+
set(CMAKE_C_COMPILER clang)
5+
set(CMAKE_CXX_COMPILER clang++)
6+
set(CMAKE_RC_COMPILER llvm-rc)
7+
8+
9+
set (LLVM_DIR_ARCH_NAME "")
10+
if (CURRENT_ARCH STREQUAL "x64")
11+
set (LLVM_DIR_ARCH_NAME "x64")
12+
elseif (CURRENT_ARCH STREQUAL "arm64")
13+
set (LLVM_DIR_ARCH_NAME "ARM64")
14+
endif()
15+
16+
set(LLVM_INSTALL_PATHS "")
17+
foreach(PATH IN LISTS PROGRAMFILES_PATHS)
18+
list(APPEND LLVM_INSTALL_PATHS "${PATH}/LLVM")
19+
20+
file(GLOB_RECURSE FOUND_LLVM_ROOT
21+
"${PATH}/Microsoft Visual Studio/*/VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}"
22+
"${PATH}/Microsoft Visual Studio/**/*/VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}")
23+
24+
if(FOUND_LLVM_ROOT)
25+
list(APPEND LLVM_INSTALL_PATHS ${FOUND_LLVM_ROOT})
26+
endif()
27+
endforeach()
28+
29+
if(DEFINED LLVM_ROOT AND EXISTS "${LLVM_ROOT}")
30+
list(INSERT LLVM_INSTALL_PATHS 0 "${LLVM_ROOT}")
31+
endif()
32+
33+
set(LLVM_ROOT "")
34+
foreach(PATH IN LISTS LLVM_INSTALL_PATHS)
35+
if(EXISTS "${PATH}/bin/clang.exe" AND EXISTS "${PATH}/bin/clang++.exe" AND EXISTS "${PATH}/bin/llvm-rc.exe")
36+
set(LLVM_ROOT "${PATH}")
37+
break()
38+
endif()
39+
endforeach()
40+
41+
if(LLVM_ROOT STREQUAL "")
42+
if (CURRENT_ARCH STREQUAL "arm64")
43+
message(FATAL_ERROR "LLVM installation was not found. Please install LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}")
44+
else()
45+
message(FATAL_ERROR "LLVM installation was not found. Please install LLVM: ${LLVM_INSTALLATION_URL}")
46+
endif()
47+
endif()
48+
49+
if (NOT EXISTS "${CMAKE_C_COMPILER}" OR NOT EXISTS "${CMAKE_CXX_COMPILER}" OR NOT EXISTS "${CMAKE_RC_COMPILER}")
50+
set(CMAKE_C_COMPILER "${LLVM_ROOT}/bin/clang.exe")
51+
set(CMAKE_CXX_COMPILER "${LLVM_ROOT}/bin/clang++.exe")
52+
set(CMAKE_RC_COMPILER "${LLVM_ROOT}/bin/llvm-rc.exe")
53+
endif()
54+
55+
if (NOT EXISTS "${CMAKE_C_COMPILER}")
56+
if (CURRENT_ARCH STREQUAL "arm64")
57+
message(FATAL_ERROR "Clang compiler not found at ${CMAKE_C_COMPILER}. Please reinstall LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}")
58+
else()
59+
message(FATAL_ERROR "Clang compiler not found at ${CMAKE_C_COMPILER}. Please reinstall LLVM: ${LLVM_INSTALLATION_URL}")
60+
endif()
61+
endif()
62+
if (NOT EXISTS "${CMAKE_CXX_COMPILER}")
63+
if (CURRENT_ARCH STREQUAL "arm64")
64+
message(FATAL_ERROR "Clang++ compiler not found at ${CMAKE_CXX_COMPILER}. Please reinstall LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}")
65+
else()
66+
message(FATAL_ERROR "Clang++ compiler not found at ${CMAKE_CXX_COMPILER}. Please reinstall LLVM: ${LLVM_INSTALLATION_URL}")
67+
endif()
68+
endif()
69+
if (NOT EXISTS "${CMAKE_RC_COMPILER}")
70+
if (CURRENT_ARCH STREQUAL "arm64")
71+
message(FATAL_ERROR "LLVM Resource Compiler not found at ${CMAKE_RC_COMPILER}. Please reinstall LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}")
72+
else()
73+
message(FATAL_ERROR "LLVM Resource Compiler not found at ${CMAKE_RC_COMPILER}. Please reinstall LLVM: ${LLVM_INSTALLATION_URL}")
74+
endif()
75+
endif()
76+
endfunction()
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
function(setProgramFilesPaths CURRENT_ARCH PROGRAMFILES_PATHS)
2+
set(PROGRAMFILES "$ENV{ProgramFiles}")
3+
set(PROGRAMFILES_X86 "$ENV{ProgramFiles\(x86\)}")
4+
file(TO_CMAKE_PATH "${PROGRAMFILES}" PROGRAMFILES)
5+
file(TO_CMAKE_PATH "${PROGRAMFILES_X86}" PROGRAMFILES_X86)
6+
7+
if(CURRENT_ARCH STREQUAL "arm64")
8+
set(PROGRAMFILES_ARM64 "$ENV{ProgramFiles\(Arm\)}")
9+
file(TO_CMAKE_PATH "${PROGRAMFILES_ARM64}" PROGRAMFILES_ARM64)
10+
11+
set(PROGRAMFILES_PATHS
12+
"${PROGRAMFILES_ARM64}"
13+
"${PROGRAMFILES}"
14+
"${PROGRAMFILES_X86}"
15+
"C:/Program Files (Arm)"
16+
"C:/Program Files"
17+
"C:/Program Files (x86)"
18+
PARENT_SCOPE
19+
)
20+
else()
21+
set(PROGRAMFILES_PATHS
22+
"${PROGRAMFILES}"
23+
"${PROGRAMFILES_X86}"
24+
"C:/Program Files"
25+
"C:/Program Files (x86)"
26+
PARENT_SCOPE
27+
)
28+
endif()
29+
endfunction()
Lines changed: 8 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,11 @@
1-
set(PROGRAMFILES_ARM64 "$ENV{ProgramFiles\(Arm\)}")
2-
set(PROGRAMFILES "$ENV{ProgramFiles}")
3-
set(PROGRAMFILES_X86 "$ENV{ProgramFiles\(x86\)}")
4-
file(TO_CMAKE_PATH "${PROGRAMFILES_ARM64}" PROGRAMFILES_ARM64)
5-
file(TO_CMAKE_PATH "${PROGRAMFILES}" PROGRAMFILES)
6-
file(TO_CMAKE_PATH "${PROGRAMFILES_X86}" PROGRAMFILES_X86)
7-
set(PROGRAMFILES_PATHS
8-
"${PROGRAMFILES_ARM64}"
9-
"${PROGRAMFILES}"
10-
"${PROGRAMFILES_X86}"
11-
"C:/Program Files (Arm)"
12-
"C:/Program Files"
13-
"C:/Program Files (x86)"
14-
)
1+
include(../cmake/win32.programFilesPaths.cmake)
2+
setProgramFilesPaths("arm64" PROGRAMFILES_PATHS)
153

16-
if (CMAKE_JS_NODELIB_DEF AND CMAKE_JS_NODELIB_TARGET)
17-
if (NOT DEFINED NODE_LIB_CMAKE_AR)
18-
foreach(PATH IN LISTS PROGRAMFILES_PATHS)
19-
if(NODE_LIB_CMAKE_AR)
20-
break()
21-
endif()
4+
include(../cmake/win32.ensureNodeLib.cmake)
5+
ensureNodeLib(PROGRAMFILES_PATHS "arm64" "arm64")
226

23-
file(GLOB_RECURSE FOUND_LIB_EXE
24-
"${PATH}/Microsoft Visual Studio/*/VC/Tools/MSVC/*/bin/Hostarm64/arm64/lib.exe"
25-
"${PATH}/Microsoft Visual Studio/**/*/VC/Tools/MSVC/*/bin/Hostarm64/arm64/lib.exe")
7+
include(../cmake/win32.llvmApplyGnuModeAdaptations.cmake)
8+
llvmApplyGnuModeAdaptations()
269

27-
if(FOUND_LIB_EXE)
28-
list(GET FOUND_LIB_EXE 0 NODE_LIB_CMAKE_AR)
29-
break()
30-
endif()
31-
endforeach()
32-
endif()
33-
34-
if (EXISTS "${NODE_LIB_CMAKE_AR}")
35-
# Generate node.lib
36-
execute_process(COMMAND ${NODE_LIB_CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF} /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS} /MACHINE:ARM64 /nologo)
37-
else()
38-
message(FATAL_ERROR "Windows Resource Compiler (lib.exe) not found. Please install Visual Studio Build Tools.")
39-
endif()
40-
endif()
41-
42-
# adapt cmake-js to work with llvm in GNU mode
43-
if (NOT CMAKE_SHARED_LINKER_FLAGS MATCHES "-Xlinker /DELAYLOAD:NODE.EXE")
44-
string(REPLACE "/DELAYLOAD:NODE.EXE" "-Xlinker /DELAYLOAD:NODE.EXE -Xlinker /defaultlib:delayimp"
45-
CMAKE_SHARED_LINKER_FLAGS
46-
"${CMAKE_SHARED_LINKER_FLAGS}")
47-
endif()
48-
49-
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
50-
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Xclang --dependent-lib=msvcrt")
51-
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Xclang --dependent-lib=msvcrt")
52-
53-
# ensure CMAKE_AR is configured
54-
if (NOT DEFINED CMAKE_AR OR NOT EXISTS "${CMAKE_AR}")
55-
set(LLVM_INSTALL_PATHS "")
56-
foreach(PATH IN LISTS PROGRAMFILES_PATHS)
57-
list(APPEND LLVM_INSTALL_PATHS "${PATH}/LLVM")
58-
59-
file(GLOB_RECURSE FOUND_LLVM_ROOT
60-
"${PATH}/Microsoft Visual Studio/*/VC/Tools/Llvm/ARM64"
61-
"${PATH}/Microsoft Visual Studio/**/*/VC/Tools/Llvm/ARM64")
62-
63-
if(FOUND_LLVM_ROOT)
64-
list(APPEND LLVM_INSTALL_PATHS ${FOUND_LLVM_ROOT})
65-
endif()
66-
endforeach()
67-
68-
if(DEFINED LLVM_ROOT AND EXISTS "${LLVM_ROOT}")
69-
list(INSERT LLVM_INSTALL_PATHS 0 "${LLVM_ROOT}")
70-
endif()
71-
72-
foreach(PATH IN LISTS LLVM_INSTALL_PATHS)
73-
if(EXISTS "${PATH}/bin/llvm-ar.exe" AND EXISTS "${PATH}/bin/llvm-ar.exe")
74-
set(CMAKE_AR "${PATH}/bin/llvm-ar.exe")
75-
break()
76-
endif()
77-
endforeach()
78-
endif()
10+
include(../cmake/win32.llvmEnsureCmakeAr.cmake)
11+
llvmEnsureCmakeAr(PROGRAMFILES_PATHS "arm64")

0 commit comments

Comments
 (0)