From 3013442c9d651f37df076caac884b315f5ae064a Mon Sep 17 00:00:00 2001 From: Enrico Fraccaroli Date: Sat, 18 Dec 2021 17:32:03 +0100 Subject: [PATCH] Update readme, update the cmake files. --- CMakeLists.txt | 172 +++++++++--------- README.md | 86 +++++++-- libc/CMakeLists.txt | 19 +- mentos/CMakeLists.txt | 316 +++++++++++++--------------------- programs/CMakeLists.txt | 93 +++++----- programs/tests/CMakeLists.txt | 93 +++++----- 6 files changed, 350 insertions(+), 429 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0bf318c..7954c4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,10 +7,8 @@ project(MentOs) # ============================================================================= # Set the default build type to Debug. if(NOT CMAKE_BUILD_TYPE) - message(STATUS "Setting build type to 'Debug' as none was specified.") - set(CMAKE_BUILD_TYPE - "Debug" - CACHE STRING "Choose the type of build." FORCE) + message(STATUS "Setting build type to 'Debug' as none was specified.") + set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build." FORCE) endif() # ============================================================================= @@ -19,56 +17,52 @@ message(STATUS "Crosscompiling : ${CMAKE_CROSSCOMPILING}") message(STATUS "System name : ${CMAKE_HOST_SYSTEM_NAME}") message(STATUS "Kernel version : ${CMAKE_SYSTEM_VERSION}") if((${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Darwin") OR APPLE) - # Set the Apple MacOSx compilers. - if(CMAKE_VERSION VERSION_LESS "3.6.0") - include(CMakeForceCompiler) - cmake_force_c_compiler(i386-elf-gcc Clang) - cmake_force_cxx_compiler(i386-elf-g++ Clang) - else() - set(CMAKE_C_COMPILER i386-elf-gcc) - set(CMAKE_CXX_COMPILER i386-elf-g++) - set(CMAKE_AR i386-elf-ar) - endif() - # Speicfy the linker. - set(CMAKE_LINKER i386-elf-ld) - # Specify the linker flags. - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -nostdlib") - + # Set the Apple MacOSx compilers. + if(CMAKE_VERSION VERSION_LESS "3.6.0") + include(CMakeForceCompiler) + cmake_force_c_compiler(i386-elf-gcc Clang) + cmake_force_cxx_compiler(i386-elf-g++ Clang) + else() + set(CMAKE_C_COMPILER i386-elf-gcc) + set(CMAKE_CXX_COMPILER i386-elf-g++) + set(CMAKE_AR i386-elf-ar) + endif() + # Speicfy the linker. + set(CMAKE_LINKER i386-elf-ld) + # Specify the linker flags. + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -nostdlib") elseif((${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows") OR WIN32) # Windows set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -sdl) - else() - # Generic Unix System - find_program(LSB_RELEASE_EXEC lsb_release) - execute_process( + # Generic Unix System + find_program(LSB_RELEASE_EXEC lsb_release) + execute_process( COMMAND "${LSB_RELEASE_EXEC}" --short --release OUTPUT_VARIABLE LSB_RELEASE_VERSION_SHORT OUTPUT_STRIP_TRAILING_WHITESPACE) - message(STATUS "LSB version : ${LSB_RELEASE_VERSION_SHORT}") - if(${LSB_RELEASE_VERSION_SHORT} MATCHES "^18") - # Ubuntu 18 set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -sdl) - elseif(${LSB_RELEASE_VERSION_SHORT} MATCHES "^19") - # Ubuntu 19 - set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -display gtk) - elseif(${LSB_RELEASE_VERSION_SHORT} MATCHES "^20") - # Ubuntu 20 - set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -display gtk) - else() - # set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -sdl) - endif() + message(STATUS "LSB version : ${LSB_RELEASE_VERSION_SHORT}") + if(${LSB_RELEASE_VERSION_SHORT} MATCHES "^18") + # Ubuntu 18 set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -sdl) + elseif(${LSB_RELEASE_VERSION_SHORT} MATCHES "^19") + # Ubuntu 19 + set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -display gtk) + elseif(${LSB_RELEASE_VERSION_SHORT} MATCHES "^20") + # Ubuntu 20 + set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -display gtk) + else() + # set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -sdl) + endif() endif() # ============================================================================= # Add the debugging option. -set(DEBUGGING_TYPE - "DEBUG_STDIO" - CACHE STRING "Chose the type of debugging: DEBUG_STDIO DEBUG_LOG") +set(DEBUGGING_TYPE "DEBUG_STDIO" CACHE STRING "Chose the type of debugging: DEBUG_STDIO DEBUG_LOG") set_property(CACHE DEBUGGING_TYPE PROPERTY STRINGS DEBUG_STDIO DEBUG_LOG) if("${DEBUGGING_TYPE}" STREQUAL "DEBUG_STDIO" OR "${DEBUGGING_TYPE}" STREQUAL "DEBUG_LOG") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D${DEBUGGING_TYPE}") - message(STATUS "Setting debugging type to ${DEBUGGING_TYPE}.") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D${DEBUGGING_TYPE}") + message(STATUS "Setting debugging type to ${DEBUGGING_TYPE}.") else() - message(FATAL_ERROR "Debugging type ${DEBUGGING_TYPE} is not valid.") + message(FATAL_ERROR "Debugging type ${DEBUGGING_TYPE} is not valid.") endif() # ============================================================================= @@ -81,12 +75,12 @@ add_subdirectory(doc/doxygen) # ============================================================================= # Target to generate the EXT2 filesystem. -add_custom_target( - rootfs.img +add_custom_target(filesystem + BYPRODUCTS ${CMAKE_BINARY_DIR}/rootfs.img COMMAND echo "---------------------------------------------" COMMAND echo "Creating EXT2 filesystem..." COMMAND echo "---------------------------------------------" - COMMAND mke2fs -L 'rootfs' -N 0 -d ${CMAKE_SOURCE_DIR}/files -m 5 -r 1 -t ext2 -v -F rootfs.img 32M + COMMAND mke2fs -L 'rootfs' -N 0 -d ${CMAKE_SOURCE_DIR}/files -m 5 -r 1 -t ext2 -v -F ${CMAKE_BINARY_DIR}/rootfs.img 32M COMMAND echo "---------------------------------------------" COMMAND echo "Done!" COMMAND echo "---------------------------------------------" @@ -96,66 +90,62 @@ add_custom_target( # ============================================================================= # Update GDB symbol file. add_custom_target( - gdb_file - COMMAND echo "symbol-file ${CMAKE_BINARY_DIR}/mentos/kernel-bootloader.bin" >> ${CMAKE_BINARY_DIR}/.gdbinit - COMMAND echo "exec-file ${CMAKE_BINARY_DIR}/mentos/kernel-bootloader.bin" >> ${CMAKE_BINARY_DIR}/.gdbinit - COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/get_text_address.sh ${CMAKE_BINARY_DIR}/mentos/kernel.bin > ${CMAKE_BINARY_DIR}/.gdbinit - COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/get_text_address.sh ${CMAKE_BINARY_DIR}/mentos/kernel-bootloader.bin >> ${CMAKE_BINARY_DIR}/.gdbinit - COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/get_text_address.sh ${CMAKE_BINARY_DIR}/programs/tests/test_* >> ${CMAKE_BINARY_DIR}/.gdbinit - COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/get_text_address.sh ${CMAKE_BINARY_DIR}/programs/prog_* >> ${CMAKE_BINARY_DIR}/.gdbinit - COMMAND echo "break boot.c: boot_main" >> ${CMAKE_BINARY_DIR}/.gdbinit - COMMAND echo "break kernel.c: kmain" >> ${CMAKE_BINARY_DIR}/.gdbinit - COMMAND echo "target remote localhost:1234" >> ${CMAKE_BINARY_DIR}/.gdbinit - DEPENDS kernel-bootloader.bin - DEPENDS all_programs all_tests - DEPENDS libc) - -# ============================================================================= -# Update GDB symbol file. -add_custom_target( - gdb_file_clion_embedded - COMMAND echo "symbol-file ${CMAKE_BINARY_DIR}/mentos/kernel-bootloader.bin" >> ${CMAKE_BINARY_DIR}/.gdbinit - COMMAND echo "exec-file ${CMAKE_BINARY_DIR}/mentos/kernel-bootloader.bin" >> ${CMAKE_BINARY_DIR}/.gdbinit - COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/get_text_address.sh ${CMAKE_BINARY_DIR}/mentos/kernel.bin > ${CMAKE_BINARY_DIR}/.gdbinit - COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/get_text_address.sh ${CMAKE_BINARY_DIR}/mentos/kernel-bootloader.bin >> ${CMAKE_BINARY_DIR}/.gdbinit - COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/get_text_address.sh ${CMAKE_BINARY_DIR}/programs/prog_* >> ${CMAKE_BINARY_DIR}/.gdbinit - DEPENDS kernel-bootloader.bin - DEPENDS all_programs all_tests - DEPENDS libc) - -# ============================================================================= -# Set memory size. -set(MEMORY_SIZE 1096M) + gdb_file + BYPRODUCTS ${CMAKE_BINARY_DIR}/.gdbinit + COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/get_text_address.sh ${CMAKE_BINARY_DIR}/mentos/kernel.bin > ${CMAKE_BINARY_DIR}/.gdbinit + COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/get_text_address.sh ${CMAKE_BINARY_DIR}/mentos/kernel-bootloader.bin >> ${CMAKE_BINARY_DIR}/.gdbinit + COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/get_text_address.sh ${CMAKE_BINARY_DIR}/programs/tests/test_* >> ${CMAKE_BINARY_DIR}/.gdbinit + COMMAND bash ${CMAKE_SOURCE_DIR}/scripts/get_text_address.sh ${CMAKE_BINARY_DIR}/programs/prog_* >> ${CMAKE_BINARY_DIR}/.gdbinit + COMMAND echo "break boot.c: boot_main" >> ${CMAKE_BINARY_DIR}/.gdbinit + COMMAND echo "break kernel.c: kmain" >> ${CMAKE_BINARY_DIR}/.gdbinit + COMMAND echo "target remote localhost:1234" >> ${CMAKE_BINARY_DIR}/.gdbinit + DEPENDS kernel-bootloader.bin + DEPENDS all_programs + DEPENDS all_tests + DEPENDS libc +) # ============================================================================= # Builds the code and runs qemu with the built Os. set(EMULATOR qemu-system-i386) +# Set the debug type. if(${DEBUGGING_TYPE} STREQUAL DEBUG_LOG) - set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -serial file:serial.log) + set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -serial file:serial.log) elseif(${DEBUGGING_TYPE} STREQUAL DEBUG_STDIO) - set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -serial stdio) + set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -serial stdio) endif(${DEBUGGING_TYPE} STREQUAL DEBUG_LOG) +# Set the type of video. set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -vga std) -set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -m ${MEMORY_SIZE}) +# Set the amount of memory. +set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -m 1096M) +# Set the EXT2 drive. set(EMULATOR_FLAGS ${EMULATOR_FLAGS} -drive file=rootfs.img,format=raw) +# Set the kernel. set(EMULATOR_KERNEL -kernel mentos/kernel-bootloader.bin) add_custom_target( - qemu - COMMAND ${EMULATOR} ${EMULATOR_FLAGS} ${EMULATOR_KERNEL} ${EMULATOR_FS} - DEPENDS kernel-bootloader.bin rootfs.img all_programs all_tests libc) + qemu + COMMAND ${EMULATOR} ${EMULATOR_FLAGS} ${EMULATOR_KERNEL} ${EMULATOR_FS} + DEPENDS kernel-bootloader.bin + DEPENDS all_programs + DEPENDS all_tests + DEPENDS libc +) # ============================================================================= # Builds the code and runs qemu with the built Os. -set(EMULATOR_FLAGS_GDB ${EMULATOR_FLAGS} -s -S) - add_custom_target( - qemu-gdb - COMMAND ${EMULATOR} ${EMULATOR_FLAGS_GDB} ${EMULATOR_KERNEL} ${EMULATOR_FS} - COMMAND echo "\n\n" - COMMAND echo "Now, QEMU has loaded the kernel, and it is waiting that you remotely connect to it." - COMMAND echo "To start debugging, open a new shell in THIS same folder, and just type \"gdb\"!" - COMMAND echo "\n\n" - DEPENDS gdb_file kernel-bootloader.bin rootfs.img) - -add_custom_target(all-execs-clion-embedded DEPENDS gdb_file_clion_embedded kernel-bootloader.bin rootfs.img) + qemu-gdb + COMMAND echo "\n\n" + COMMAND echo "Now, QEMU has loaded the kernel, and it is waiting that you\n" + COMMAND echo "remotely connect to it. To start debugging, open a new shell\n" + COMMAND echo "in THIS same folder, and just type :\n" + COMMAND printf " cgdb -q -iex %q" "add-auto-load-safe-path ." + COMMAND echo "\n\n" + COMMAND ${EMULATOR} ${EMULATOR_KERNEL} ${EMULATOR_FS} -s -S + DEPENDS kernel-bootloader.bin + DEPENDS all_programs + DEPENDS all_tests + DEPENDS libc + DEPENDS gdb_file +) diff --git a/README.md b/README.md index 1b9b584..2992f4d 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ For compiling the system: - cmake - git - ccmake (suggested) + - e2fsprogs (should be already installed) Under **MacOS**, for compiling, you have additional dependencies: @@ -59,8 +60,7 @@ To execute the operating system, you need to install: For debugging we suggest using: - - cgdb - - xterm + - gdb or cgdb ### 2.2. installation Prerequisites @@ -68,8 +68,8 @@ Under **Ubuntu**, you can type the following commands: ```bash sudo apt-get update && sudo apt-get upgrade -y -sudo apt-get install -y build-essential git cmake qemu-system-i386 -sudo apt-get install -y cgdb xterm +sudo apt-get install -y build-essential git cmake qemu-system-i386 e2fsprogs +sudo apt-get install -y gdb cgdb ``` Under **MacOS** you also need to install the i386-elf cross-compiler. The @@ -79,13 +79,13 @@ then type the following commands: ```bash brew update && brew upgrade -brew install i386-elf-binutils i386-elf-gcc git cmake qemu nasm -brew install cgdb xterm #<- for debug only +brew install i386-elf-binutils i386-elf-gcc git cmake qemu nasm e2fsprogs +brew install gdb cgdb #<- for debug only ``` -## 3. Compiling MentOS +## 3. Compiling MentOS and generating the EXT2 filesystem -Compile and boot MentOS with qemu: +Compile MentOS with: ```bash cd @@ -93,12 +93,26 @@ mkdir build cd build cmake .. make +``` + +Then, generate the EXT2 filesystem with: + +```bash +make filesystem +``` +you just need to generate the filesystem once. If you change a `program` you need to re-generate the entire filesystem with `make filesystem`, but this will override any changes you made to the files inside the `rootfs.img`. In the future I will find a way to update just the `/usr/bin` directory and the programs. + +## 4. Running MentOS + +Boot MentOS with qemu: + +```bash make qemu ``` To login, use one of the usernames listed in `files/etc/passwd`. -## 4. Change the scheduling algorithm +## 5. Change the scheduling algorithm MentOS provides three different scheduling algorithms: @@ -152,29 +166,63 @@ make make qemu ``` -## 5. Use Debugger +## 6. Use Debugger -If you want to use GDB to debug MentOS: +If you want to use GDB to debug MentOS, first you need to compile everything: ```bash cd build cmake .. make -make qemu-gdb ``` -If you did everything correctly, you should have 3 windows with: +Then, you need to generate a file called `.gdbinit` placed inside the `build` directory, which will tell **gdb** which *object* file he needs to read in order to allow proper debugging. +```bash +make gdb_file +``` -1. Kernel Booting on qemu -2. Shell with video printing of statistics previously discussed -3. Debugger cgdb with code screening +Finally, you run qemu in debugging mode with: +```bash +make qemu-gdb +``` +If you did everything correctly, you should see an empty QEMU window. Basically, QEMU is waiting for you to connect *remotely* with gdb. Anyway, running `make qemu-gdb` will make your current shell busy, you cannot call `gdb` in it. You need to open a new shell inside the `build` folder and do a: +```bash +cgdb -q -iex 'add-auto-load-safe-path .' +``` -## Developers +Now you will have: +1. the QEMU window waiting for you, +2. the shell where you ran `make qemu-gdb` also waiting for you, +3. the debugger that loaded a series of symbol files and the location of their `.text` section. -Main Developers: +By default I placed a breakpoint at the begginning of 1) the bootloader, 2) the `kmain` function of the kernel. + +So, when gdb starts you need to first give a continue: +```bash +(gdb) continue +``` + +This will make the kernel run, and stop at the first breakpoint which is inside the *bootloader*: +```bash +Breakpoint 1, boot_main (...) at .../mentos/src/boot.c:220 +220 { +``` + +giving a second `continue` will get you to the start of the operating system: + +This will make the kernel run, and stop at the first breakpoint which is inside the *bootloader*: +```bash +Breakpoint 2, kmain (...) at .../mentos/src/kernel.c:95 +95 { +``` + +## Contributors + +Project Manager: * [Enrico Fraccaroli](https://github.com/Galfurian) - - Mr. Wolf + +Developers: * [Alessandro Danese](https://github.com/alessandroDanese88), [Luigi Capogrosso](https://github.com/luigicapogrosso), [Mirco De Marchi](https://github.com/mircodemarchi) - Protection ring - libc diff --git a/libc/CMakeLists.txt b/libc/CMakeLists.txt index 22e668c..8b66e9c 100644 --- a/libc/CMakeLists.txt +++ b/libc/CMakeLists.txt @@ -6,23 +6,11 @@ cmake_minimum_required(VERSION 2.8) # Initialize the project. project(libc C ASM) -# ============================================================================= -# Set the default build type to Debug. -if(NOT CMAKE_BUILD_TYPE) - message(STATUS "Setting build type to 'Debug' as none was specified.") - set(CMAKE_BUILD_TYPE - "Debug" - CACHE STRING "Choose the type of build." FORCE) -endif() - # ============================================================================= # Enable the assembly language. enable_language(ASM) # Find the NASM compiler. -find_program(ASM_COMPILER - NAMES nasm - HINTS /usr/bin/ ${CMAKE_SOURCE_DIR}/third_party/nasm/bin -) +find_program(ASM_COMPILER NAMES nasm HINTS /usr/bin/ ${CMAKE_SOURCE_DIR}/third_party/nasm/bin) # Check that we have found the compiler. if(NOT ASM_COMPILER) message(FATAL_ERROR "ASM compiler not found!") @@ -89,17 +77,13 @@ add_library( ${PROJECT_SOURCE_DIR}/src/setenv.c ${PROJECT_SOURCE_DIR}/src/assert.c ${PROJECT_SOURCE_DIR}/src/abort.c - ${PROJECT_SOURCE_DIR}/src/io/mm_io.c ${PROJECT_SOURCE_DIR}/src/io/port_io.c - ${PROJECT_SOURCE_DIR}/src/ipc/ipc.c - ${PROJECT_SOURCE_DIR}/src/sys/unistd.c ${PROJECT_SOURCE_DIR}/src/sys/errno.c ${PROJECT_SOURCE_DIR}/src/sys/utsname.c ${PROJECT_SOURCE_DIR}/src/sys/ioctl.c - ${PROJECT_SOURCE_DIR}/src/unistd/getppid.c ${PROJECT_SOURCE_DIR}/src/unistd/getpid.c ${PROJECT_SOURCE_DIR}/src/unistd/exit.c @@ -129,7 +113,6 @@ add_library( ${PROJECT_SOURCE_DIR}/src/unistd/interval.c ${PROJECT_SOURCE_DIR}/src/libc_start.c ${PROJECT_SOURCE_DIR}/src/debug.c - ${PROJECT_SOURCE_DIR}/src/crt0.S ) diff --git a/mentos/CMakeLists.txt b/mentos/CMakeLists.txt index cda7f1f..3ff7235 100644 --- a/mentos/CMakeLists.txt +++ b/mentos/CMakeLists.txt @@ -73,13 +73,14 @@ endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpedantic") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic-errors") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-function") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-variable") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unknown-pragmas") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") + # Set the compiler options. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -nostdlib") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -nostdinc") @@ -88,23 +89,19 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-builtin") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-pic") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-stack-protector") if(CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 10) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcommon") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fcommon") endif() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=i686") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") if(CMAKE_BUILD_TYPE STREQUAL "Debug") - - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0") - add_definitions(-DDEBUG) - + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0") + add_definitions(-DDEBUG) elseif(CMAKE_BUILD_TYPE STREQUAL "Release") - - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") - add_definitions(-DRELEASE) - + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3") + add_definitions(-DRELEASE) endif(CMAKE_BUILD_TYPE STREQUAL "Debug") # ============================================================================= @@ -112,12 +109,13 @@ endif(CMAKE_BUILD_TYPE STREQUAL "Debug") enable_language(ASM) # Find the NASM compiler. find_program( - ASM_COMPILER - NAMES nasm - HINTS /usr/bin/ ${CMAKE_SOURCE_DIR}/third_party/nasm/bin) + ASM_COMPILER + NAMES nasm + HINTS /usr/bin/ ${CMAKE_SOURCE_DIR}/third_party/nasm/bin +) # Check that we have found the compiler. if(NOT ASM_COMPILER) - message(FATAL_ERROR "ASM compiler not found!") + message(FATAL_ERROR "ASM compiler not found!") endif(NOT ASM_COMPILER) # Set the asm compiler. set(CMAKE_ASM_COMPILER ${ASM_COMPILER}) @@ -125,189 +123,113 @@ set(CMAKE_ASM_COMPILER ${ASM_COMPILER}) set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -f elf") set(CMAKE_ASM_COMPILE_OBJECT " -o ") if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -g") - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -O0") - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -F dwarf") + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -g") + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -O0") + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -F dwarf") elseif(CMAKE_BUILD_TYPE STREQUAL "Release") - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -g") - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -O3") + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -g") + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -O3") endif(CMAKE_BUILD_TYPE STREQUAL "Debug") # ============================================================================= # Add the includes. include_directories(inc ../libc/inc) +# ============================================================================= +# Define the list of files. +set(KERNEL_SOURCES + src/kernel.c + src/multiboot.c + src/devices/pci.c + src/devices/fpu.c + src/drivers/ata.c + src/drivers/rtc.c + src/drivers/fdc.c + src/drivers/mouse.c + src/drivers/keyboard/keyboard.c + src/drivers/keyboard/keymap.c + src/fs/initrd.c + src/fs/vfs.c + src/fs/read_write.c + src/fs/open.c + src/fs/stat.c + src/fs/readdir.c + src/fs/procfs.c + src/fs/ioctl.c + src/fs/namei.c + src/fs/ext2.c + src/hardware/timer.c + src/hardware/cpuid.c + src/hardware/pic8259.c + src/io/port_io.c + src/io/mm_io.c + src/io/video.c + src/io/stdio.c + src/io/debug.c + src/io/proc_video.c + src/io/proc_running.c + src/io/proc_system.c + src/io/vga/vga.c + src/ipc/msg.c + src/ipc/sem.c + src/ipc/shm.c + src/kernel/sys.c + src/klib/assert.c + src/klib/ctype.c + src/klib/mutex.c + src/klib/string.c + src/klib/vsprintf.c + src/klib/vscanf.c + src/klib/time.c + src/klib/libgen.c + src/klib/strerror.c + src/klib/math.c + src/klib/fcvt.c + src/klib/spinlock.c + src/klib/rbtree.c + src/klib/ndtree.c + src/klib/hashmap.c + src/klib/list.c + src/mem/kheap.c + src/mem/paging.c + src/mem/slab.c + src/mem/vmem_map.c + src/mem/zone_allocator.c + src/elf/elf.c + src/descriptor_tables/gdt.c + src/descriptor_tables/gdt.S + src/descriptor_tables/interrupt.c + src/descriptor_tables/exception.c + src/descriptor_tables/interrupt.S + src/descriptor_tables/exception.S + src/descriptor_tables/idt.c + src/descriptor_tables/idt.S + src/descriptor_tables/tss.c + src/descriptor_tables/tss.S + src/process/scheduler_algorithm.c + src/process/scheduler.c + src/process/process.c + src/process/wait.c + src/process/user.S + src/sys/utsname.c + src/sys/module.c + src/system/errno.c + src/system/panic.c + src/system/printk.c + src/system/signal.c + src/system/syscall.c +) + # ============================================================================= # Add kernel library. if(USE_BUDDY_SYSTEM) - add_library( - ${KERNEL_NAME} - src/kernel.c - src/multiboot.c - src/devices/pci.c - src/devices/fpu.c - src/drivers/ata.c - src/drivers/rtc.c - src/drivers/fdc.c - src/drivers/mouse.c - src/drivers/keyboard/keyboard.c - src/drivers/keyboard/keymap.c - src/fs/initrd.c - src/fs/vfs.c - src/fs/read_write.c - src/fs/open.c - src/fs/stat.c - src/fs/readdir.c - src/fs/procfs.c - src/fs/ioctl.c - src/fs/namei.c - src/fs/ext2.c - src/hardware/timer.c - src/hardware/cpuid.c - src/hardware/pic8259.c - src/io/port_io.c - src/io/mm_io.c - src/io/video.c - src/io/stdio.c - src/io/debug.c - src/io/proc_video.c - src/io/proc_running.c - src/io/proc_system.c - src/io/vga/vga.c - src/ipc/msg.c - src/ipc/sem.c - src/ipc/shm.c - src/kernel/sys.c - src/klib/assert.c - src/klib/ctype.c - src/klib/mutex.c - src/klib/string.c - src/klib/vsprintf.c - src/klib/vscanf.c - src/klib/time.c - src/klib/libgen.c - src/klib/strerror.c - src/klib/math.c - src/klib/fcvt.c - src/klib/spinlock.c - src/klib/rbtree.c - src/klib/ndtree.c - src/klib/hashmap.c - src/klib/list.c - src/mem/kheap.c - src/mem/paging.c - src/mem/slab.c - src/mem/vmem_map.c - src/mem/zone_allocator.c - src/mem/buddysystem.c - src/elf/elf.c - src/descriptor_tables/gdt.c - src/descriptor_tables/gdt.S - src/descriptor_tables/interrupt.c - src/descriptor_tables/exception.c - src/descriptor_tables/interrupt.S - src/descriptor_tables/exception.S - src/descriptor_tables/idt.c - src/descriptor_tables/idt.S - src/descriptor_tables/tss.c - src/descriptor_tables/tss.S - src/process/scheduler_algorithm.c - src/process/scheduler.c - src/process/process.c - src/process/wait.c - src/process/user.S - src/sys/utsname.c - src/sys/module.c - src/system/errno.c - src/system/panic.c - src/system/printk.c - src/system/signal.c - src/system/syscall.c) + # Add the library with `buddysystem.c`. + add_library(${KERNEL_NAME} ${KERNEL_SOURCES} src/mem/buddysystem.c) else(USE_BUDDY_SYSTEM) - add_library( - ${KERNEL_NAME} - src/kernel.c - src/multiboot.c - src/devices/pci.c - src/devices/fpu.c - src/drivers/ata.c - src/drivers/rtc.c - src/drivers/fdc.c - src/drivers/mouse.c - src/drivers/keyboard/keyboard.c - src/drivers/keyboard/keymap.c - src/fs/initrd.c - src/fs/vfs.c - src/fs/read_write.c - src/fs/open.c - src/fs/stat.c - src/fs/readdir.c - src/fs/procfs.c - src/fs/ioctl.c - src/fs/namei.c - src/fs/ext2.c - src/hardware/timer.c - src/hardware/cpuid.c - src/hardware/pic8259.c - src/io/port_io.c - src/io/mm_io.c - src/io/video.c - src/io/stdio.c - src/io/debug.c - src/io/proc_video.c - src/io/proc_running.c - src/io/proc_system.c - src/io/vga/vga.c - src/ipc/msg.c - src/ipc/sem.c - src/ipc/shm.c - src/kernel/sys.c - src/klib/assert.c - src/klib/ctype.c - src/klib/mutex.c - src/klib/string.c - src/klib/vsprintf.c - src/klib/vscanf.c - src/klib/time.c - src/klib/libgen.c - src/klib/strerror.c - src/klib/math.c - src/klib/fcvt.c - src/klib/spinlock.c - src/klib/rbtree.c - src/klib/ndtree.c - src/klib/hashmap.c - src/klib/list.c - src/mem/kheap.c - src/mem/paging.c - src/mem/slab.c - src/mem/vmem_map.c - src/mem/zone_allocator.c - src/elf/elf.c - src/descriptor_tables/gdt.c - src/descriptor_tables/gdt.S - src/descriptor_tables/interrupt.c - src/descriptor_tables/exception.c - src/descriptor_tables/interrupt.S - src/descriptor_tables/exception.S - src/descriptor_tables/idt.c - src/descriptor_tables/idt.S - src/descriptor_tables/tss.c - src/descriptor_tables/tss.S - src/process/scheduler_algorithm.c - src/process/scheduler.c - src/process/process.c - src/process/wait.c - src/process/user.S - src/sys/utsname.c - src/sys/module.c - src/system/errno.c - src/system/panic.c - src/system/printk.c - src/system/signal.c - src/system/syscall.c) - # Link the exercise libraries. - target_link_libraries(${KERNEL_NAME} ${BUDDY_SYSTEM_FILE}) + # Add the library without `buddysystem.c`. + add_library(${KERNEL_NAME} ${KERNEL_SOURCES}) + # Link the exercise libraries. + target_link_libraries(${KERNEL_NAME} ${BUDDY_SYSTEM_FILE}) endif(USE_BUDDY_SYSTEM) # ============================================================================= @@ -317,12 +239,12 @@ add_library(${BOOTLOADER_NAME} src/boot.c src/boot.S) # ============================================================================= # Build the kernel. add_custom_target( - kernel-bootloader.bin ALL - COMMAND mkdir -p ${PROJECT_BINARY_DIR}/../debug_sym - COMMAND ${CMAKE_LINKER} -melf_i386 -static --oformat elf32-i386 --output kernel.bin --script ${CMAKE_CURRENT_SOURCE_DIR}/kernel.lds -Map kernel.map -u kmain - $ ${BUDDY_SYSTEM_FILE} - COMMAND objcopy -I binary -O elf32-i386 -B i386 kernel.bin kernel.bin.o - COMMAND ${CMAKE_LINKER} -melf_i386 -static --oformat elf32-i386 --output kernel-bootloader.bin --script ${CMAKE_CURRENT_SOURCE_DIR}/boot.lds -Map kernel-bootloader.map - kernel.bin.o $ - DEPENDS ${KERNEL_NAME} - DEPENDS ${BOOTLOADER_NAME}) + kernel-bootloader.bin ALL + COMMAND ${CMAKE_LINKER} -melf_i386 -static --oformat elf32-i386 --output kernel.bin --script ${CMAKE_CURRENT_SOURCE_DIR}/kernel.lds -Map kernel.map -u kmain + $ ${BUDDY_SYSTEM_FILE} + COMMAND objcopy -I binary -O elf32-i386 -B i386 kernel.bin kernel.bin.o + COMMAND ${CMAKE_LINKER} -melf_i386 -static --oformat elf32-i386 --output kernel-bootloader.bin --script ${CMAKE_CURRENT_SOURCE_DIR}/boot.lds -Map kernel-bootloader.map + kernel.bin.o $ + DEPENDS ${KERNEL_NAME} + DEPENDS ${BOOTLOADER_NAME} +) diff --git a/programs/CMakeLists.txt b/programs/CMakeLists.txt index 4058baa..7726e86 100644 --- a/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt @@ -6,15 +6,6 @@ cmake_minimum_required(VERSION 2.8) # Initialize the project. project(programs C) -# ============================================================================= -# Set the default build type to Debug. -if(NOT CMAKE_BUILD_TYPE) - message(STATUS "Setting build type to 'Debug' as none was specified.") - set(CMAKE_BUILD_TYPE - "Debug" - CACHE STRING "Choose the type of build." FORCE) -endif() - # ============================================================================= # Set the directory where the compiled binaries will be placed. set(MENTOS_BIN_DIR ${CMAKE_SOURCE_DIR}/files/bin) @@ -22,14 +13,16 @@ set(MENTOS_BIN_DIR ${CMAKE_SOURCE_DIR}/files/bin) # ============================================================================= # Warning flags. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") -#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpedantic") -#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic-errors") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic-errors") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-function") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-variable") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unknown-pragmas") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") + # Set the compiler options. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -u_start") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static") @@ -38,13 +31,12 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -nostdinc") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-builtin") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ggdb") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ggdb") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0") elseif(CMAKE_BUILD_TYPE STREQUAL "Release") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3") endif(CMAKE_BUILD_TYPE STREQUAL "Debug") -# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -no-pie -Wl,-z,norelro") # ============================================================================= # Add the executables (manually). @@ -75,54 +67,49 @@ set(PROGRAMS ipcs.c sleep.c man.c - ) +) foreach(PROGRAM ${PROGRAMS}) - # Prepare the program name. - string(REPLACE ".c" "" PROGRAM_NAME ${PROGRAM}) + # Prepare the program name. + string(REPLACE ".c" "" PROGRAM_NAME ${PROGRAM}) - # Set the name of the target. - set(TARGET_NAME prog_${PROGRAM_NAME}) + # Set the name of the target. + set(TARGET_NAME prog_${PROGRAM_NAME}) - # Log the entry. - message(VERBOSE "Program ${PROGRAM_NAME} (source: ${PROGRAM}, make target: ${TARGET_NAME})") + # Randomize .text section address so when debugging symbols don't clash. + # The allowed range is from 256MB to 2.75GB + # Minimum allowed address: 0x10000000 + # Max allowed address: 0xB0000000 + string(MD5 RAND_HASH ${PROGRAM}) + string(SUBSTRING ${RAND_HASH} 1 3 TEXADDR_INFIX) + string(RANDOM LENGTH 1 ALPHABET 0123456789AB RANDOM_SEED ${RAND_HASH} TEXADDR_FIRST) - # Randomize .text section address so when debugging symbols don't clash The allowed range is from 256MB to 2.75GB Minimum allowed address: 0x10000000 Max allowed address: - # 0xB0000000 - string(MD5 RAND_HASH ${PROGRAM}) - string(SUBSTRING ${RAND_HASH} 1 3 TEXADDR_INFIX) - string( - RANDOM - LENGTH 1 - ALPHABET 0123456789AB - RANDOM_SEED ${RAND_HASH} TEXADDR_FIRST) + # Create the target. + add_executable(${TARGET_NAME} ${PROGRAM}) - # Create the target. - add_executable(${TARGET_NAME} ${PROGRAM}) + # Add the includes. + target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/libc/inc) - # Add the includes. - target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/libc/inc) + # Link the libc library. + target_link_libraries(${TARGET_NAME} ${CMAKE_BINARY_DIR}/libc/libc.a) - # Link the libc library. - target_link_libraries(${TARGET_NAME} ${CMAKE_BINARY_DIR}/libc/libc.a) + # Add the dependency to libc. + add_dependencies(${TARGET_NAME} libc) - # Add the dependency to libc. - add_dependencies(${TARGET_NAME} libc) + # Add the linking properties. + set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS "-Wl,-Ttext=0x${TEXADDR_FIRST}${TEXADDR_INFIX}0000") - # Add the linking properties. - set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS "-Wl,-Ttext=0x${TEXADDR_FIRST}${TEXADDR_INFIX}0000") + # Add the final target that strips the debugging symbols from the program. + add_custom_command(TARGET ${TARGET_NAME} + BYPRODUCTS ${MENTOS_BIN_DIR}/${PROGRAM_NAME} + COMMAND strip --strip-debug ${PROJECT_BINARY_DIR}/${TARGET_NAME} -o ${MENTOS_BIN_DIR}/${PROGRAM_NAME} + DEPENDS ${TARGET_NAME} + ) - # Add the final target that strips the debugging symbols from the program. - add_custom_target( - ${PROGRAM_NAME} - BYPRODUCTS ${MENTOS_BIN_DIR}/${PROGRAM_NAME} - COMMAND mkdir -p ${MENTOS_BIN_DIR} - # COMMAND cp ${PROJECT_BINARY_DIR}/${TARGET_NAME} - # ${MENTOS_BIN_DIR}/${PROGRAM_NAME} - COMMAND strip --strip-debug ${PROJECT_BINARY_DIR}/${TARGET_NAME} -o ${MENTOS_BIN_DIR}/${PROGRAM_NAME} - DEPENDS ${TARGET_NAME}) + # Log the entry. + message(VERBOSE "Program ${PROGRAM_NAME}, `.text` at 0x${TEXADDR_FIRST}${TEXADDR_INFIX}0000") - # Append the program name to the list of all the executables. - list(APPEND ALL_EXECUTABLES ${PROGRAM_NAME}) + # Append the program name to the list of all the executables. + list(APPEND ALL_EXECUTABLES ${PROGRAM_NAME}) endforeach() # Add the overall target that builds all the programs. diff --git a/programs/tests/CMakeLists.txt b/programs/tests/CMakeLists.txt index 16f00fb..643099a 100644 --- a/programs/tests/CMakeLists.txt +++ b/programs/tests/CMakeLists.txt @@ -6,15 +6,6 @@ cmake_minimum_required(VERSION 2.8) # Initialize the project. project(tests C) -# ============================================================================= -# Set the default build type to Debug. -if(NOT CMAKE_BUILD_TYPE) - message(STATUS "Setting build type to 'Debug' as none was specified.") - set(CMAKE_BUILD_TYPE - "Debug" - CACHE STRING "Choose the type of build." FORCE) -endif() - # ============================================================================= # Set the directory where the compiled binaries will be placed. set(MENTOS_TESTS_DIR ${CMAKE_SOURCE_DIR}/files/bin/tests) @@ -22,14 +13,16 @@ set(MENTOS_TESTS_DIR ${CMAKE_SOURCE_DIR}/files/bin/tests) # ============================================================================= # Warning flags. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") -#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wpedantic") -#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic-errors") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pedantic-errors") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wshadow") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-function") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-variable") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unknown-pragmas") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99") + # Set the compiler options. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -u_start") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static") @@ -38,13 +31,12 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -nostdinc") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-builtin") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32") if(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ggdb") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ggdb") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0") elseif(CMAKE_BUILD_TYPE STREQUAL "Release") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3") endif(CMAKE_BUILD_TYPE STREQUAL "Debug") -# set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -no-pie -Wl,-z,norelro") # ============================================================================= # Add the executables (manually). @@ -74,52 +66,51 @@ set(TESTS t_alarm.c t_kill.c t_itimer.c - t_gid.c) + t_gid.c +) foreach(TEST ${TESTS}) - # Prepare the program name. - string(REPLACE ".c" "" TEST_NAME ${TEST}) - # Set the name of the target. - set(TARGET_NAME test_${TEST_NAME}) + # Prepare the program name. + string(REPLACE ".c" "" TEST_NAME ${TEST}) - # Log the entry. - message(VERBOSE "Test ${TEST_NAME} (source: ${TEST}, make target: ${TARGET_NAME})") + # Set the name of the target. + set(TARGET_NAME test_${TEST_NAME}) - # Randomize .text section address so when debugging symbols don't clash The allowed range is from 256MB to 2.75GB Minimum allowed address: 0x10000000 Max allowed address: - # 0xB0000000 - string(MD5 RAND_HASH ${TEST}) - string(SUBSTRING ${RAND_HASH} 1 3 TEXADDR_INFIX) - string( - RANDOM - LENGTH 1 - ALPHABET 0123456789AB - RANDOM_SEED ${RAND_HASH} TEXADDR_FIRST) + # Randomize .text section address so when debugging symbols don't clash. + # The allowed range is from 256MB to 2.75GB + # Minimum allowed address: 0x10000000 + # Max allowed address: 0xB0000000 + string(MD5 RAND_HASH ${TEST}) + string(SUBSTRING ${RAND_HASH} 1 3 TEXADDR_INFIX) + string(RANDOM LENGTH 1 ALPHABET 0123456789AB RANDOM_SEED ${RAND_HASH} TEXADDR_FIRST) - # Create the target. - add_executable(${TARGET_NAME} ${TEST}) + # Create the target. + add_executable(${TARGET_NAME} ${TEST}) - # Add the includes. - target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/libc/inc) + # Add the includes. + target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/libc/inc) - # Link the libc library. - target_link_libraries(${TARGET_NAME} ${CMAKE_BINARY_DIR}/libc/libc.a) + # Link the libc library. + target_link_libraries(${TARGET_NAME} ${CMAKE_BINARY_DIR}/libc/libc.a) - # Add the dependency to libc. - add_dependencies(${TARGET_NAME} libc) + # Add the dependency to libc. + add_dependencies(${TARGET_NAME} libc) - # Add the linking properties. - set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS "-Wl,-Ttext=0x${TEXADDR_FIRST}${TEXADDR_INFIX}0000,-e_start") + # Add the linking properties. + set_target_properties(${TARGET_NAME} PROPERTIES LINK_FLAGS "-Wl,-Ttext=0x${TEXADDR_FIRST}${TEXADDR_INFIX}0000,-e_start") - # Add the final target that strips the debugging symbols from the program. - add_custom_target( - ${TEST_NAME} - BYPRODUCTS ${MENTOS_TESTS_DIR}/${TEST_NAME} - COMMAND mkdir -p ${MENTOS_TESTS_DIR} - COMMAND strip --strip-debug ${PROJECT_BINARY_DIR}/${TARGET_NAME} -o ${MENTOS_TESTS_DIR}/${TEST_NAME} - DEPENDS ${TARGET_NAME}) + # Add the final target that strips the debugging symbols from the program. + add_custom_command(TARGET ${TARGET_NAME} + BYPRODUCTS ${MENTOS_TESTS_DIR}/${TEST_NAME} + COMMAND strip --strip-debug ${PROJECT_BINARY_DIR}/${TARGET_NAME} -o ${MENTOS_TESTS_DIR}/${TEST_NAME} + DEPENDS ${TARGET_NAME} + ) - # Append the program name to the list of all the executables. - list(APPEND ALL_TESTS ${TEST_NAME}) + # Log the entry. + message(VERBOSE "Test ${TEST_NAME}, `.text` at 0x${TEXADDR_FIRST}${TEXADDR_INFIX}0000") + + # Append the program name to the list of all the executables. + list(APPEND ALL_TESTS ${TEST_NAME}) endforeach() # Add the overall target that builds all the programs.