我正在从事一个跨平台项目,它有一些手写的汇编程序,可以优化各种CPU架构的性能。我正在将这个项目从一个专有的构建系统转换为CMake,首先使用Windows上的Visual Studio进行编译。对于x86和AMD 64,我已经能够很好地汇编和链接所有内容,但我无法让它在ARM 64上工作(或者大概是ARM 32,尽管我还没有试过)。
我将ASM文件包括在源代码中,如下所示:
if(CMAKE_SYSTEM_PROCESSOR MATCHES "AMD64")
list(APPEND SOURCES
amd64/aesasm.asm
...)
set_source_files_properties(
amd64/aesasm.asm
...
PROPERTY LANGUAGE ASM_MASM)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "X86")
# ...
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ARM64")
list(APPEND SOURCES
arm64/fdef_asm.asm
...)
set_source_files_properties(
arm64/fdef_asm.asm
...
PROPERTY LANGUAGE ASM_MASM)
然后在我的顶层CMakeLists.txt中,我使用enable_language(ASM_MASM)
启用MASM。对于x86和AMD 64,CMake自动查找ml/ml64.exe,正确配置Visual Studio项目,一切正常。
但是对于ARM 64,如果我尝试同样的事情,我会在尝试构建时从Visual Studio得到这个错误:MSB3721: The command "echo MASM not supported on this platform
.据我所知,这是因为Visual Studio认为ARM汇编是一种不同的方言,“MARMASM”,汇编程序有不同的可执行名称(armasm/armasm 64. exe)。
我尝试在ARM 64工具链文件中设置enable_language(ASM_MARMASM)
,但CMake无法将其识别为ASM方言,并显示以下错误:
CMake Error: Could not find cmake module file: CMakeDetermineASM_MARMASMCompiler.cmake
CMake Error: Could not find cmake module file: F:/os/src/symcrypt/bin/CMakeFiles/3.15.3/CMakeASM_MARMASMCompiler.cmake
CMake Error at CMakeLists.txt:49 (enable_language):
No CMAKE_ASM_MARMASM_COMPILER could be found.
我还尝试手动设置汇编程序:
get_filename_component(VS_TOOLS_DIRECTORY ${CMAKE_LINKER} DIRECTORY)
find_file(ARM64_COMPILER "armasm64.exe" HINTS ${VS_TOOLS_DIRECTORY})
set(CMAKE_ASM_MARMASM_COMPILER ${ARM64_COMPILER})
enable_language(ASM_MARMASM)
message(STATUS "Manually set assembler to ${CMAKE_ASM_MARMASM_COMPILER}")
但这也不起作用;我仍然收到No CMAKE_ASM_MARMASM_COMPILER could be found.
错误
如何在项目中包含ARM/ARM 64组装?
2条答案
按热度按时间oknwwptz1#
看起来CMake(仍然)不支持这个。我在.NET源代码中找到了一些可以解决这个问题的地方:
https://github.com/dotnet/runtime/blob/f8f63b1fde85119c925313caa475d9936297b463/eng/native/functions.cmake#L173-L207
以及
https://github.com/dotnet/runtime/blob/f8f63b1fde85119c925313caa475d9936297b463/eng/native/configurecompiler.cmake#L611-L626
edit:作为参考,下面是我有此需求的项目的提交:https://dyncall.org/pub/dyncall/dyncall/rev/451299d50c1a
1zmg4dgp2#
CMake 3.26是目前的候选版本,支持它。
在CMake 3.26发行说明中:
ASM_MARMASM
以支持Microsoft ARM汇编语言。