Сборка ядра своей ОС при помощи cmake
Хочу начать писать свою операционную систему и для этого настраиваю инструменты сборки. Для сборки взял cmake. Простейшая ОС состоит всего из двух файлов: загрузчика на ассемблере и ядра:
Загрузчик на NASM:
[bits 32]
global start
extern KernelMain
MODULE_ALIGN equ 1 << 0
MEM_INFO equ 1 << 1
FLAGS equ MODULE_ALIGN | MEM_INFO
MAGIC equ 0x1BADB002
CHECKSUM equ -(MAGIC + FLAGS)
section .multiboot
align 4
dd MAGIC
dd FLAGS
dd CHECKSUM
start:
push ebx
call KernelMain
Ядро на C++:
void printf(const char *source)
{
static unsigned short *video = (unsigned short *)0xB8000;
for (int i = 0; source[i] != '\0'; i++)
{
video[i] = (video[i] & 0xFF00) | source[i];
}
}
extern "C" void KernelMain()
{
printf("Hello World");
while (true);
}
Скрипт сборки:
cmake_minimum_required(VERSION 3.5)
project(operating-systems)
enable_language(ASM_NASM)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_ASM_NASM_FLAGS "-f elf32")
set(CMAKE_CXX_FLAGS "-c -ffreestanding -fno-exceptions -fno-rtti")
add_executable(kernel boot.asm kernel.cpp)
target_link_options(kernel PRIVATE -T${CMAKE_SOURCE_DIR}/linker.ld)
Руками ядро собирается (вызываю вручную компилеры, а потом линкер). Однако симейк собрать ядро не может, я получаю ошибки:
:-1: warning: CMakeFiles/kernel.dir/boot.asm.o: linker input file unused because linking not done
:-1: warning: CMakeFiles/kernel.dir/kernel.cpp.o: linker input file unused because linking not done
Почему проект не собирается? Как его собрать?
И еще вопрос: как в современном симейке правильно задавать флаги компиляции и линковки для каждого таргета? Есть лучшие практики?
Файл linker.ld
ENTRY(start)
OUTPUT_FORMAT(elf64-x86-64)
OUTPUT_ARCH(i386:x86-64)
SECTIONS
{
. = 0x0100000;
.text :
{
*(.multiboot)
*(.text*)
*(.rodata)
}
.data :
{
start_ctors = .;
KEEP(*(.init_array));
KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* )));
end_ctors = .;
*(.data)
}
.bss :
{
*(.bss)
}
/DISCARD/ :
{
*(.fini_array*)
*(.comment)
}
}
Руками я собираю так:
gcc -c -m32 kernel.cpp -ffreestanding -fno-exceptions -fno-rtti
nasm -f elf32 boot.asm -o boot.o
ld boot.o kernel.o -T linker.ld -o kernel