44set (IWASM_COMMON_DIR ${CMAKE_CURRENT_LIST_DIR} )
55
66include_directories (${IWASM_COMMON_DIR} )
7- if (MSVC AND WAMR_BUILD_PLATFORM STREQUAL "windows" AND WAMR_BUILD_TARGET MATCHES "AARCH64.*" )
8- if (DEFINED ENV{VCToolsInstallDir})
7+ if (MSVC AND WAMR_BUILD_PLATFORM STREQUAL "windows" AND WAMR_BUILD_TARGET MATCHES "AARCH64.*" AND NOT WAMR_BUILD_WAMR_COMPILER)
8+ if (CMAKE_ASM_MARMASM_COMPILER)
9+ # Use the already detected assembler
10+ set (_ARMASM64_EXE "${CMAKE_ASM_MARMASM_COMPILER} " )
11+ elseif (DEFINED ENV{VCToolsInstallDir} OR VCToolsInstallDir)
12+ if (NOT VCToolsInstallDir)
13+ set (VCToolsInstallDir "$ENV{VCToolsInstallDir} " )
14+ endif ()
915 # Detect host tool dir
1016 set (_ARMASM64_CANDIDATES
11- "$ENV {VCToolsInstallDir} / bin/HostX64/ARM64 /armasm64.exe"
12- "$ENV {VCToolsInstallDir} / bin/HostARM64 /arm64/armasm64.exe" )
17+ "${VCToolsInstallDir} bin/Hostx64/arm64 /armasm64.exe"
18+ "${VCToolsInstallDir} bin/Hostarm64 /arm64/armasm64.exe" )
1319 set (_ARMASM64_EXE "" )
1420 foreach (_p IN LISTS _ARMASM64_CANDIDATES)
1521 if (EXISTS "${_p} " )
@@ -18,27 +24,42 @@ if (MSVC AND WAMR_BUILD_PLATFORM STREQUAL "windows" AND WAMR_BUILD_TARGET MATCHE
1824 endif ()
1925 endforeach ()
2026 if (_ARMASM64_EXE STREQUAL "" )
21- message (FATAL_ERROR "armasm64.exe not found under VCToolsInstallDir" )
27+ message (FATAL_ERROR "armasm64.exe not found under VCToolsInstallDir: ${VCToolsInstallDir} " )
2228 endif ()
29+ else ()
30+ message (FATAL_ERROR "VCToolsInstallDir is not defined. Please run from a Developer Command Prompt or specify armasm64.exe manually." )
31+ endif ()
2332
24- # Wrapper without spaces to avoid quoting hell on NMake/cmd.exe
25- set (_WRAP "${CMAKE_BINARY_DIR} /armasm64_wrapper.bat" )
26- file (WRITE "${_WRAP} "
27- "@echo off\r\n\" ${_ARMASM64_EXE} \" %*\r\n " )
33+ # Wrapper without spaces to avoid quoting hell on NMake/cmd.exe
34+ set (_WRAP "${CMAKE_BINARY_DIR} /armasm64_wrapper.bat" )
35+ file (WRITE "${_WRAP} "
36+ "@echo off\r\n "
37+ "setlocal enabledelayedexpansion\r\n "
38+ "set ARGS=\r\n "
39+ "for %%A in (%*) do (\r\n "
40+ " if /I not \" %%~A\" ==\" /experimental:c11atomics\" (\r\n "
41+ " set ARGS=!ARGS! %%A\r\n "
42+ " )\r\n "
43+ ")\r\n "
44+ "\" ${_ARMASM64_EXE} \" !ARGS!\r\n " )
2845
29- # Use wrapper as compiler (no spaces in path)
30- set (CMAKE_ASM_MASM_COMPILER
31- "${_WRAP} "
32- CACHE FILEPATH "" FORCE )
46+ # Use wrapper as compiler (no spaces in path)
47+ set (CMAKE_ASM_MASM_COMPILER
48+ "${_WRAP} "
49+ CACHE FILEPATH "" FORCE )
3350
34- # Quote ONLY object and source (compiler path has no spaces now)
35- set (CMAKE_ASM_MASM_COMPILE_OBJECT
36- "<CMAKE_ASM_MASM_COMPILER> /nologo -o \" <OBJECT>\" \" <SOURCE>\" "
37- CACHE STRING "" FORCE )
51+ set (CMAKE_ASM_MARMASM_COMPILER
52+ "${_WRAP} "
53+ CACHE FILEPATH "" FORCE )
3854
39- else ()
40- message (FATAL_ERROR "VCToolsInstallDir is not defined. Please run from a Developer Command Prompt or specify armasm64.exe manually." )
41- endif ()
55+ # Quote ONLY object and source (compiler path has no spaces now)
56+ set (CMAKE_ASM_MASM_COMPILE_OBJECT
57+ "<CMAKE_ASM_MASM_COMPILER> /nologo -o \" <OBJECT>\" \" <SOURCE>\" "
58+ CACHE STRING "" FORCE )
59+
60+ set (CMAKE_ASM_MARMASM_COMPILE_OBJECT
61+ "<CMAKE_ASM_MARMASM_COMPILER> /nologo -o \" <OBJECT>\" \" <SOURCE>\" "
62+ CACHE STRING "" FORCE )
4263endif ()
4364
4465add_definitions (-DBH_MALLOC=wasm_runtime_malloc )
@@ -61,7 +82,7 @@ if (CMAKE_OSX_ARCHITECTURES)
6182 endif ()
6283endif ()
6384
64- if (WAMR_BUILD_INVOKE_NATIVE_GENERAL EQUAL 1)
85+ if (WAMR_BUILD_INVOKE_NATIVE_GENERAL EQUAL 1 AND NOT ( MSVC AND WAMR_BUILD_PLATFORM STREQUAL "windows" AND WAMR_BUILD_TARGET MATCHES "AARCH64.*" ) )
6586 # Use invokeNative C version instead of asm code version
6687 # if WAMR_BUILD_INVOKE_NATIVE_GENERAL is explicitly set.
6788 # Note:
@@ -117,31 +138,43 @@ elseif (WAMR_BUILD_TARGET MATCHES "AARCH64.*")
117138 if (NOT WAMR_BUILD_SIMD EQUAL 1)
118139 if (WAMR_BUILD_PLATFORM STREQUAL "windows" )
119140 if (MSVC )
120- set (source_all ${c_source_all} ${IWASM_COMMON_DIR} /arch/invokeNative_armasm64.asm)
121- set (_WAMR_ARM64_MASM_SOURCES ${IWASM_COMMON_DIR} /arch/invokeNative_armasm64.asm)
122- set_source_files_properties (${_WAMR_ARM64_MASM_SOURCES}
123- PROPERTIES
124- LANGUAGE ASM_MASM
125- COMPILE_DEFINITIONS ""
126- INCLUDE_DIRECTORIES ""
127- COMPILE_OPTIONS "/nologo"
141+ set (_WAMR_ARM64_MASM_SOURCE ${IWASM_COMMON_DIR} /arch/invokeNative_armasm64.asm)
142+ set (_WAMR_ARM64_MASM_OBJ ${CMAKE_CURRENT_BINARY_DIR} /invokeNative_armasm64.obj)
143+ add_custom_command (
144+ OUTPUT ${_WAMR_ARM64_MASM_OBJ}
145+ COMMAND ${CMAKE_ASM_MASM_COMPILER} /nologo -o "${_WAMR_ARM64_MASM_OBJ} " "${_WAMR_ARM64_MASM_SOURCE} "
146+ DEPENDS ${_WAMR_ARM64_MASM_SOURCE}
147+ COMMENT "Assembling invokeNative_armasm64.asm"
148+ VERBATIM
149+ )
150+ set_source_files_properties (${_WAMR_ARM64_MASM_OBJ}
151+ PROPERTIES GENERATED TRUE EXTERNAL_OBJECT TRUE
128152 )
153+ set (source_all ${c_source_all} ${_WAMR_ARM64_MASM_OBJ} )
154+ else ()
155+ set (source_all ${c_source_all} ${IWASM_COMMON_DIR} /arch/invokeNative_aarch64.s)
129156 endif ()
130157 else ()
131158 set (source_all ${c_source_all} ${IWASM_COMMON_DIR} /arch/invokeNative_aarch64.s)
132159 endif ()
133160 else ()
134161 if (WAMR_BUILD_PLATFORM STREQUAL "windows" )
135162 if (MSVC )
136- set (source_all ${c_source_all} ${IWASM_COMMON_DIR} /arch/invokeNative_armasm64_simd.asm)
137- set (_WAMR_ARM64_MASM_SOURCES_SIMD ${IWASM_COMMON_DIR} /arch/invokeNative_armasm64_simd.asm)
138- set_source_files_properties (${_WAMR_ARM64_MASM_SOURCES_SIMD}
139- PROPERTIES
140- LANGUAGE ASM_MASM
141- COMPILE_DEFINITIONS ""
142- INCLUDE_DIRECTORIES ""
143- COMPILE_OPTIONS "/nologo"
163+ set (_WAMR_ARM64_MASM_SIMD_SOURCE ${IWASM_COMMON_DIR} /arch/invokeNative_armasm64_simd.asm)
164+ set (_WAMR_ARM64_MASM_SIMD_OBJ ${CMAKE_CURRENT_BINARY_DIR} /invokeNative_armasm64_simd.obj)
165+ add_custom_command (
166+ OUTPUT ${_WAMR_ARM64_MASM_SIMD_OBJ}
167+ COMMAND ${CMAKE_ASM_MASM_COMPILER} /nologo -o "${_WAMR_ARM64_MASM_SIMD_OBJ} " "${_WAMR_ARM64_MASM_SIMD_SOURCE} "
168+ DEPENDS ${_WAMR_ARM64_MASM_SIMD_SOURCE}
169+ COMMENT "Assembling invokeNative_armasm64_simd.asm"
170+ VERBATIM
171+ )
172+ set_source_files_properties (${_WAMR_ARM64_MASM_SIMD_OBJ}
173+ PROPERTIES GENERATED TRUE EXTERNAL_OBJECT TRUE
144174 )
175+ set (source_all ${c_source_all} ${_WAMR_ARM64_MASM_SIMD_OBJ} )
176+ else ()
177+ set (source_all ${c_source_all} ${IWASM_COMMON_DIR} /arch/invokeNative_aarch64_simd.s)
145178 endif ()
146179 else ()
147180 set (source_all ${c_source_all} ${IWASM_COMMON_DIR} /arch/invokeNative_aarch64_simd.s)
0 commit comments