Я пытаюсь собрать приложение EFI с помощью CMake. По инструментам:
- Clang (LLVM) - компилятор
- LLD-link (Clang (LLVM)) - линкер
- CMake 3.25
- gnu-efi - заголовочные файлы
В данный момент CMakeLists.txt у меня выглядит следующим образом:
cmake_minimum_required(VERSION 3.25)
project(my_os)
set(CMAKE_CXX_STANDARD 17)
find_program(Clang_P clang++ REQUIRED True)
set(CMAKE_CXX_COMPILER ${Clang_P})
find_program(Clang_C clang REQUIRED True)
set(CMAKE_C_COMPILER ${Clang_C})
set(CMAKE_CXX_STANDARD_LIBRARIES "")
set(CMAKE_SYSTEM_NAME Generic)
include_directories("C:/gnu-efi/inc")
add_compile_options(-Wall -Wextra -pedantic)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
set(CMAKE_C_COMPILER_TARGET x86_64-unknown-windows)
set(CMAKE_CXX_COMPILER_TARGET x86_64-unknown-windows)
add_compile_options(-ffreestanding)
add_compile_options(-fshort-wchar)
add_compile_options(-mno-red-zone)
add_compile_options(-masm=intel)
add_compile_options(-Wno-unused-command-line-argument)
add_compile_options(-Wno-c11-extensions)
add_compile_options(-Wno-c99-extensions)
add_compile_options(-Wno-language-extension-token)
add_compile_options(-Wno-microsoft-enum-value)
add_compile_options(-Wno-writable-strings)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=lld-link")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -nostdlib")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-entry:efi_main")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-subsystem:efi_application")
add_executable(my_os src/bootloader/entry.cpp)
Но при попытке собрать программу происходит следующее - CMake падает на моменте линковки, ибо clang не может обработать его флаги.
Итоговая команда линкера от CMake выглядит так:
clang++.exe -O3 -DNDEBUG -fuse-ld=lld-link -nostdlib -Wl,-entry:efi_main -Wl,-subsystem:efi_application CMakeFiles/my_os.dir/src/bootloader/entry.cpp.obj -o my_os.exe -Wl,--out-implib,libmelon_os.dll.a -Wl,--major-image-version,0,--minor-image-version,0
Соответственно, флаги
-Wl,--out-implib,libmelon_os.dll.a -Wl,--major-image-version,0,--minor-image-version,0
Абсолютно не к месту, на что clang начинает ругаться:
lld-link: warning: ignoring unknown argument '--out-implib'
lld-link: warning: ignoring unknown argument '--major-image-version'
lld-link: warning: ignoring unknown argument '--minor-image-version'
lld-link: error: could not open 'libmy_os.dll.a': no such file or directory
lld-link: error: could not open '0': no such file or directory
lld-link: error: could not open '0': no such file or directory
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
Я не понимаю, как можно убрать их, и по какой причине CMake вообще ставит такие флаги