为什么 nasm 找不到来自 cmake 的包含语句

Luk*_*ith 5 cmake nasm

我有一个正在使用的模块化引导加载程序。我觉得设置它使用 gas 比将 nasm 移植到 cmake 会更痛苦。似乎不是这样。NAsm 无法找到包含文件。我错过了什么?

整个代码可以在这个 Github Repo 中找到

这是项目布局:

.
??? CMakeLists.txt
??? Failing_module
    ??? CMakeLists.txt
    ??? Print.inc
    ??? Stage1
        ??? Stage1.asm
Run Code Online (Sandbox Code Playgroud)

./CMakeLists.txt:

cmake_minimum_required(VERSION 3.6)
project(fails C ASM_NASM)
add_subdirectory(Failing_module)
Run Code Online (Sandbox Code Playgroud)

Failing_module/CMakeLists.txt:

enable_language(ASM_NASM)
set(CMAKE_ASM_NASM_OBJECT_FORMAT bin)

set(module_SRCS Stage1/Stage1.asm)

set(CMAKE_NASM_LINK_EXECUTABLE nasm)
add_executable(Stage1.bin ${module_SRCS})
set_target_properties(Stage1.bin PROPERTIES LINKER_LANGUAGE NASM)
install(TARGETS Stage1.bin DESTINATION bin)
Run Code Online (Sandbox Code Playgroud)

Failing_module/Stage1/Stage1.asm:

bits 16

jmp main

%include "Print.inc"
msgHello db "Hello World", 0x00

main:
    mov s, msgHello
    call Print
Run Code Online (Sandbox Code Playgroud)

Failing_module/Print.inc

Print:
    lodsb
    or  al, al
    jz  PrintDone
    mov ah, 0x0E
    int 0x10
    jmp Print
PrintDone:
    ret
Run Code Online (Sandbox Code Playgroud)

cmake的输出如下:

Failing_module/Stage1/Stage1.asm:6: fatal: unable to open include file `Print.inc'
make[2]: *** [Failing_module/CMakeFiles/Stage1.bin.dir/build.make:63:  Failing_module/CMakeFiles/Stage1.bin.dir/Stage1/Stage1.asm.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:86: Failing_module/CMakeFiles/Stage1.bin.dir/all] Error 2
make: *** [Makefile:128: all] Error 2
Run Code Online (Sandbox Code Playgroud)

编辑现在应该通过手动方式编译。这使它成为 SSCCE

Rae*_*ald 2

我认为这里的问题是 CMake 中的某些严格性与 NASM 中的缺陷相互作用不佳。CMake 坚持搜索路径(例如%include路径)没有尾部斜杠。nasm坚持搜索路径(给定一个-I选项)确实有一个尾部斜杠。CMake 不会改变;它的开发人员并不认为这是一个 CMake 错误。他们是对的:nasm不应该坚持包含路径有一个尾部斜杠。nasm故障多年来一直为人所知。

我设法通过将搜索路径隐藏为正常编译选项来解决此问题:

 add_compile_options(-I ${CMAKE_CURRENT_SOURCE_DIR}/ )
 add_library( my_lib STATIC "my_source.asm" )
Run Code Online (Sandbox Code Playgroud)