@@ -11,7 +11,7 @@ set(HARD_DISK_IMAGE "../../harddisk0" CACHE STRING "Path to hard disk image when
1111
1212set (CMAKE_VERBOSE_MAKEFILE OFF )
1313set (CMAKE_C_COMPILER gcc)
14- set (CMAKE_C_LINK_EXECUTABLE "ld -m elf_x86_64 -nostdlib -no-pie -T ${CMAKE_CURRENT_SOURCE_DIR} /buildtools/linker.ld <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" )
14+ set (CMAKE_C_LINK_EXECUTABLE "ld -m elf_x86_64 -nostdlib -no-pie --export-dynamic - T ${CMAKE_CURRENT_SOURCE_DIR} /buildtools/linker.ld <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" )
1515set (CMAKE_ASM_FLAGS "-pipe -g -fno-PIC -Wall -Wextra -Wno-unused-parameter -Wno-int-to-pointer-cast -nostdlib -ffreestanding -nostartfiles -nodefaultlibs -mcmodel=large -mno-red-zone" )
1616
1717set (CMAKE_ASM_NASM_OBJECT_FORMAT elf64)
@@ -97,5 +97,47 @@ foreach (timezone ${timezone_list})
9797 list (APPEND TIMEZONE_TARGETS "timezone_${TZ_NAME} " )
9898endforeach ()
9999
100+ # --- Build loadable modules from modules/<name>/*.c into iso/system/modules/<name>.ko
101+ file (GLOB MODULE_DIRS RELATIVE ${CMAKE_SOURCE_DIR} /modules ${CMAKE_SOURCE_DIR} /modules/*)
102+ set (MODULE_TARGETS "" )
103+ set (MODULE_KO_FILES "" ) # collect .ko outputs so ISO rule can depend on them
104+ foreach (mod ${MODULE_DIRS} )
105+ if (IS_DIRECTORY ${CMAKE_SOURCE_DIR} /modules/${mod} )
106+ file (GLOB mod_srcs ${CMAKE_SOURCE_DIR} /modules/${mod} /*.c)
107+ if (mod_srcs)
108+ # Compile module sources as an object target with large code model etc.
109+ add_library (mod_${mod} OBJECT ${mod_srcs} )
110+ target_compile_options (mod_${mod} PRIVATE
111+ -ffreestanding -fno-pic -fno-plt -mcmodel=large -mno-red-zone
112+ -fvisibility=hidden -fno-asynchronous-unwind-tables -fno-exceptions
113+ )
114+ target_include_directories (mod_${mod} PRIVATE ${UACPI_INCLUDES} )
115+
116+ # Link to a single ET_REL (.ko) using ld -r
117+ set (MOD_OUT ${CMAKE_BINARY_DIR} /iso/system /modules/${mod} .ko)
118+ add_custom_command (OUTPUT ${MOD_OUT}
119+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR} /iso/system /modules
120+ COMMAND ${CMAKE_LINKER} -r -o ${MOD_OUT} $<TARGET_OBJECTS:mod_${mod} >
121+ DEPENDS $<TARGET_OBJECTS:mod_${mod} >
122+ VERBATIM
123+ )
124+
125+ add_custom_target (module_${mod} ALL DEPENDS ${MOD_OUT} )
126+ add_dependencies (ISO module_${mod} )
127+ list (APPEND MODULE_TARGETS module_${mod} )
128+ list (APPEND MODULE_KO_FILES ${MOD_OUT} )
129+ endif ()
130+ endif ()
131+ endforeach ()
132+
133+ # make a single stamp that depends on all .ko files and inject it into iso() deps via IMAGE_TARGETS
134+ set (MODULES_STAMP ${CMAKE_BINARY_DIR} /iso/system /modules/modules.stamp)
135+ add_custom_command (OUTPUT ${MODULES_STAMP}
136+ COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR} /iso/system /modules
137+ COMMAND ${CMAKE_COMMAND} -E touch ${MODULES_STAMP}
138+ DEPENDS ${MODULE_KO_FILES}
139+ VERBATIM
140+ )
141+ list (APPEND IMAGE_TARGETS ${MODULES_STAMP} )
100142
101143iso("rr.iso" "kernel.sym" )
0 commit comments