diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e5bf035 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,48 @@ +cmake_minimum_required(VERSION 3.13) +project(magenta C ASM) + +set(CMAKE_C_STANDARD 17) + +set(kernel_name "Magenta") +set(kernel_exe_name "magenta_kernel") + +set(generic_src_dirs ds init kernel libc obj sched util vm) +set(kernel_sources "") +set(kernel_headers "") + +foreach (dir ${generic_src_dirs}) + message(STATUS ${dir}) + file(GLOB_RECURSE dir_sources ${dir}/*.c) + file(GLOB_RECURSE dir_headers ${dir}/*.h) + + set(kernel_sources ${kernel_sources} ${dir_sources}) + set(kernel_headers ${kernel_headers} ${dir_headers}) +endforeach (dir) + +set(kernel_arch x86_64) +file(GLOB_RECURSE arch_sources_c arch/${kernel_arch}/*.c) +file(GLOB_RECURSE arch_sources_asm arch/${kernel_arch}/*.S) +file(GLOB_RECURSE arch_headers arch/${kernel_arch}/*.h) + +set_property(SOURCE ${arch_sources_asm} PROPERTY LANGUAGE C) + +add_executable(${kernel_exe_name} + ${kernel_sources} + ${kernel_headers} + ${arch_sources_c} + ${arch_sources_asm} + ${arch_headers}) + +target_include_directories(${kernel_exe_name} PRIVATE + include + libc/include + arch/${kernel_arch}/include) +target_compile_options(${kernel_exe_name} PRIVATE + -nostdlib -ffreestanding + -Wall -Werror -pedantic -Wno-language-extension-token -Wno-unused-function -Wno-gnu-statement-expression + -O2 -g -fPIC -Iinclude -Iarch/${kernel_arch}/include -Ilibc/include) +target_link_libraries(${kernel_exe_name} -nostdlib -ffreestanding -lgcc) +target_compile_definitions(${kernel_exe_name} PRIVATE BUILD_ID="0") + +include(arch/${kernel_arch}/config.cmake) +include(arch/${kernel_arch}/targets.cmake) diff --git a/Makefile b/Makefile index 2885468..d542772 100644 --- a/Makefile +++ b/Makefile @@ -41,6 +41,13 @@ LIBC_SRC_DIRS := stdio string ctype LIBC_C_FILES := $(foreach dir,$(LIBC_SRC_DIRS),$(shell find libc/$(dir) -type f -name *.c)) LIBC_OBJ := $(addprefix $(BUILD_DIR)/,$(LIBC_C_FILES:.c=.o)) +#################################### +# Userboot source files +#################################### + +USERBOOT_C_FILES := $(shell find userboot -type f -name *.c) +USERBOOT_OBJ := $(addprefix $(BUILD_DIR)/,$(USERBOOT_C_FILES:.c=.o)) + BUILD_ID := $(shell tools/socks.buildid --arch $(SOCKS_ARCH)) CWARNINGS := -Wall -Werror -pedantic -Wno-language-extension-token -Wno-unused-function -Wno-gnu-statement-expression diff --git a/arch/x86_64/config.cmake b/arch/x86_64/config.cmake new file mode 100644 index 0000000..d167236 --- /dev/null +++ b/arch/x86_64/config.cmake @@ -0,0 +1,5 @@ +target_compile_options(${kernel_exe_name} PRIVATE + -z max-page-size=0x1000 -m64 -mcmodel=large -mno-red-zone -mno-mmx + -mno-sse -mno-sse2 -D_64BIT -DBYTE_ORDER=1234) +target_link_libraries(${kernel_exe_name} "-z max-page-size=0x1000" "-T ${CMAKE_CURRENT_SOURCE_DIR}/arch/x86_64/layout.ld") + diff --git a/arch/x86_64/targets.cmake b/arch/x86_64/targets.cmake new file mode 100644 index 0000000..9bf8810 --- /dev/null +++ b/arch/x86_64/targets.cmake @@ -0,0 +1,7 @@ +find_program(QEMU qemu-system-x86_64) + +add_custom_target(run + USES_TERMINAL + COMMAND ${QEMU} + -kernel $ + -serial stdio) diff --git a/arch/x86_64/toolchain.cmake b/arch/x86_64/toolchain.cmake new file mode 100644 index 0000000..33e0c39 --- /dev/null +++ b/arch/x86_64/toolchain.cmake @@ -0,0 +1,18 @@ +# the name of the target operating system +set(CMAKE_SYSTEM_NAME Magenta) + +# which compilers to use for C and C++ +set(CMAKE_C_COMPILER x86_64-elf-gcc) +set(CMAKE_ASM_COMPILER x86_64-elf-gcc) +set(CMAKE_CXX_COMPILER x86_64-elf-g++) + +set(CMAKE_C_COMPILER_WORKS TRUE) +set(CMAKE_CXX_COMPILER_WORKS TRUE) + +# adjust the default behavior of the FIND_XXX() commands: +# search programs in the host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + +# search headers and libraries in the target environment +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt new file mode 100644 index 0000000..a473217 --- /dev/null +++ b/tools/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.13) +project(magenta-tools C) + +set(tool_dirs e64patch) + +foreach (dir ${tool_dirs}) + add_subdirectory(${dir}) +endforeach (dir) diff --git a/tools/e64patch/CMakeLists.txt b/tools/e64patch/CMakeLists.txt new file mode 100644 index 0000000..c8776a5 --- /dev/null +++ b/tools/e64patch/CMakeLists.txt @@ -0,0 +1,3 @@ +file(GLOB sources *.c *.h) + +add_executable(e64patch ${sources})