summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Gavrilov <alexey.gavrilov@mail.com>2026-03-30 17:50:25 +0700
committerAlexey Gavrilov <alexey.gavrilov@mail.com>2026-03-30 17:50:25 +0700
commite5eb32a5123920d18a55819bcea8a23b3a3e0f4d (patch)
treedfd7935ba4e911ba4354b5f611d841769c264c62
parent256b2c871a0f3ac0175de298b78c6ea527f42f60 (diff)
Cmake status information output
Reinforce of compiler, C runtime, architecture checks at cmake configuration. Compiler check means continue building at the cmake configure stage only for supported compilers. Use unsupported compiler involves immediate build process stopping. C runtime check means finding of runtime objects. Especially for *crtbegin.o* and *crtend.o* files. Architecture means *ObjectiveProject_ARCHITECTURE* variable is set. That variable configure at toolchain file by default and cannot override if toolchain file is passed. TODO - Image creation - Build under window platform (optional) Signed-off-by: Alexey Gavrilov <alexey.gavrilov@mail.com>
-rw-r--r--CMakeLists.txt53
-rw-r--r--arch/CMakeLists.txt2
-rw-r--r--cmake/toolchain/x86_generic_clang.cmake1
-rw-r--r--cmake/toolchain/x86_generic_gcc.cmake1
-rw-r--r--libgcc/CMakeLists.txt7
5 files changed, 51 insertions, 13 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c6d9912..d9e5643 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,12 +2,20 @@
# which include farther subprojects source codes
# Expected input variables:
-# ARCH: type of architecture
+# ObjectiveProject_ARCHITECTURE: type of architecture
cmake_minimum_required(VERSION 3.25)
+list(APPEND CMAKE_MESSAGE_CONTEXT ObjectiveProject)
project(ObjectiveProject LANGUAGES CXX ASM_NASM)
+# Check on supported compiler
+if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
+ message(STATUS "${CMAKE_CXX_COMPILER_ID} compiler is supported")
+else()
+ message(FATAL_ERROR "${CMAKE_CXX_COMPILER_ID} compiler isn't supported")
+endif()
+
set(ObjectiveProject_CXX_FLAGS
$<$<CONFIG:Debug>:-Wall -Wextra -ggdb -g3 -O0>
$<$<CONFIG:Release>:-Wall -Werror>
@@ -36,11 +44,19 @@ set(CMAKE_CXX_EXTENSIONS OFF)
add_executable(Objective)
# Set architecture by default if not present
-if(NOT ARCH IN_LIST OBJECTIVE_SUPPORTED_PROCESSORS)
- list(GET OBJECTIVE_SUPPORTED_PROCESSORS 0 ARCH)
+if(NOT ObjectiveProject_ARCHITECTURE IN_LIST OBJECTIVE_SUPPORTED_PROCESSORS)
+ if(ObjectiveProject_ARCHITECTURE STREQUAL "" OR NOT DEFINED ObjectiveProject_ARCHITECTURE)
+ message(FATAL_ERROR "Architecture isn't set")
+ else()
+ message(FATAL_ERROR "${ObjectiveProject_ARCHITECTURE} - unknown architecture")
+ endif()
+ list(GET OBJECTIVE_SUPPORTED_PROCESSORS 0 ObjectiveProject_ARCHITECTURE)
+ message(STATUS "Set up architecture by default - ${ObjectiveProject_ARCHITECTURE}")
+else()
+ message(STATUS "${ObjectiveProject_ARCHITECTURE} - choosed architecture")
endif()
-# Create target with compiler requirements (include directories, flags and etc)
+# Create targets with compilers requirements (include directories, flags and etc)
add_library(CXX_COMPILER_REQUIREMENTS INTERFACE)
add_library(ASM_NASM_COMPILER_REQUIREMENTS INTERFACE)
@@ -53,13 +69,12 @@ target_link_libraries(CXX_LINKER_REQUIREMENTS INTERFACE
gcc
)
-# Set compiler flags
-if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
- target_compile_options(CXX_COMPILER_REQUIREMENTS INTERFACE
- ${ObjectiveProject_CXX_FLAGS}
- )
-endif()
+# Set cxx compiler flags
+target_compile_options(CXX_COMPILER_REQUIREMENTS INTERFACE
+ ${ObjectiveProject_CXX_FLAGS}
+)
+# Set nasm compiler flags
target_compile_options(ASM_NASM_COMPILER_REQUIREMENTS INTERFACE
${ObjectiveProject_ASM_NASM_FLAGS}
)
@@ -69,7 +84,7 @@ target_include_directories(CXX_COMPILER_REQUIREMENTS
${ObjectiveProject_SOURCE_DIR}/include
)
-# Subscribe compiler requirements to Object executable
+# Subscribe compiler requirements to Objective executable
target_link_libraries(Objective PUBLIC CXX_COMPILER_REQUIREMENTS)
add_subdirectory(arch)
@@ -90,4 +105,20 @@ target_link_libraries(Objective PRIVATE
CRTN
)
+# Set cxx linker options
target_link_libraries(Objective PRIVATE CXX_LINKER_REQUIREMENTS)
+
+# Targets to show output of generator expression
+add_custom_target(options
+ COMMENT "Toolset passed options"
+ COMMAND ${CMAKE_COMMAND} -E echo
+ "CXX compiler options: "
+ "$<JOIN:$<TARGET_PROPERTY:CXX_COMPILER_REQUIREMENTS,INTERFACE_COMPILE_OPTIONS>, >"
+ COMMAND ${CMAKE_COMMAND} -E echo
+ "NASM compiler options: "
+ "$<JOIN:$<TARGET_PROPERTY:ASM_NASM_COMPILER_REQUIREMENTS,INTERFACE_COMPILE_OPTIONS>, >"
+ COMMAND ${CMAKE_COMMAND} -E echo
+ "Linker options: "
+ "$<JOIN:$<TARGET_PROPERTY:CXX_LINKER_REQUIREMENTS,INTERFACE_LINK_OPTIONS>, >"
+ VERBATIM
+)
diff --git a/arch/CMakeLists.txt b/arch/CMakeLists.txt
index c8719ce..0491df7 100644
--- a/arch/CMakeLists.txt
+++ b/arch/CMakeLists.txt
@@ -14,4 +14,4 @@ target_sources(Initialization
${CMAKE_CURRENT_LIST_DIR}/SecondaryInit.h
)
-add_subdirectory(${ARCH})
+add_subdirectory(${ObjectiveProject_ARCHITECTURE})
diff --git a/cmake/toolchain/x86_generic_clang.cmake b/cmake/toolchain/x86_generic_clang.cmake
index 696568e..23b3b80 100644
--- a/cmake/toolchain/x86_generic_clang.cmake
+++ b/cmake/toolchain/x86_generic_clang.cmake
@@ -1,6 +1,7 @@
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_CROSSCOMPILING true)
set(CMAKE_SYSTEM_PROCESSOR i686)
+set(ObjectiveProject_ARCHITECTURE x86)
set(CMAKE_ASM_NASM_OBJECT_FORMAT elf32)
diff --git a/cmake/toolchain/x86_generic_gcc.cmake b/cmake/toolchain/x86_generic_gcc.cmake
index 8ea769e..a284bb3 100644
--- a/cmake/toolchain/x86_generic_gcc.cmake
+++ b/cmake/toolchain/x86_generic_gcc.cmake
@@ -1,6 +1,7 @@
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_CROSSCOMPILING true)
set(CMAKE_SYSTEM_PROCESSOR i686)
+set(ObjectiveProject_ARCHITECTURE x86)
set(CMAKE_ASM_NASM_OBJECT_FORMAT elf32)
diff --git a/libgcc/CMakeLists.txt b/libgcc/CMakeLists.txt
index b5b2abc..6fd97b6 100644
--- a/libgcc/CMakeLists.txt
+++ b/libgcc/CMakeLists.txt
@@ -1,3 +1,6 @@
+list(APPEND CMAKE_MESSAGE_CONTEXT libgcc)
+message(STATUS "Searching CRT objects")
+
macro(setup_crt_object_file object_file target_name)
execute_process(
COMMAND ${CMAKE_CXX_COMPILER} --print-file-name=${object_file}
@@ -11,6 +14,7 @@ macro(setup_crt_object_file object_file target_name)
message(FATAL_ERROR ${ERROR_MESSAGE})
endif()
+ message(STATUS "${object_file} was found at the ${PATH} path")
add_library(${target_name} OBJECT IMPORTED GLOBAL)
set_target_properties(${target_name} PROPERTIES
IMPORTED_OBJECTS ${PATH}
@@ -22,4 +26,5 @@ endmacro()
setup_crt_object_file(crtbegin.o CRTBEGIN)
setup_crt_object_file(crtend.o CRTEND)
-add_subdirectory(${ARCH})
+message(STATUS "The CRT objects were found")
+add_subdirectory(${ObjectiveProject_ARCHITECTURE})