在Visual Studio中用CMake构建ARM64汇编语言

guicsvcw  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(314)

我正在从事一个跨平台项目,它有一些手写的汇编程序,可以优化各种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组装?

oknwwptz

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

1zmg4dgp

1zmg4dgp2#

CMake 3.26是目前的候选版本,支持它。
在CMake 3.26发行说明中:

  • 添加了ASM_MARMASM以支持Microsoft ARM汇编语言。

相关问题