list(APPEND _keyboard_layouts kbda1 kbda2 kbda3 kbdal kbdarme kbdarmw kbdaze kbdazel kbdbe kbdbga kbdbgt kbdblr kbdbr kbdbu kbdbur kbdcan kbdcr kbdcz kbdcz1 kbdda kbddv kbdeo kbdest kbdfc kbdfi kbdfr kbdgeo kbdgerg kbdgneo kbdgr kbdgr1 kbdhe kbdheb kbdhu kbdic kbdinasa kbdinben kbdindev kbdinguj kbdinmal kbdir kbdit kbdjpn kbdkaz kbdkor kbdla kbdlt1 kbdlv kbdmac kbdne kbdno kbdpl kbdpl1 kbdpo kbdro kbdrost kbdru kbdru1 kbdsf kbdsg kbdsl kbdsl1 kbdsp kbdsw kbdtat kbdth0 kbdth1 kbdth2 kbdth3 kbdtuf kbdtuq kbduk kbdur kbdurs kbdus kbdusa kbdusl kbdusr kbdusx kbduzb kbdvntc kbdycc kbdycl) foreach(_keyboard_layout ${_keyboard_layouts}) spec2def(${_keyboard_layout}.dll ${_keyboard_layout}/${_keyboard_layout}.spec) add_library(${_keyboard_layout} MODULE ${_keyboard_layout}/${_keyboard_layout}.c ${_keyboard_layout}/${_keyboard_layout}.rc ${CMAKE_CURRENT_BINARY_DIR}/${_keyboard_layout}.def) target_include_directories(${_keyboard_layout} PRIVATE ${REACTOS_SOURCE_DIR}/ntoskrnl/include) set_entrypoint(${_keyboard_layout} 0) set_image_base(${_keyboard_layout} 0x5FFF0000) set_subsystem(${_keyboard_layout} native) if(MSVC) # Merge the .text and .rdata section into the .data section target_link_options(${_keyboard_layout} PRIVATE "/ignore:4254;/SECTION:.data,ER;/MERGE:.text=.data;/MERGE:.rdata=.data;/MERGE:.bss=.data;/MERGE:.edata=.data") else() # Use a custom linker script target_link_options(${_keyboard_layout} PRIVATE "-Wl,-T,${CMAKE_CURRENT_SOURCE_DIR}/kbdlayout.lds") # Avoid "universal character names are only valid in C++ and C99" error. set_property(TARGET ${_keyboard_layout} PROPERTY C_STANDARD 99) endif() # dynamic analysis switches if(STACK_PROTECTOR) target_compile_options(${_keyboard_layout} PRIVATE -fno-stack-protector) endif() if(RUNTIME_CHECKS) target_link_libraries(${_keyboard_layout} runtmchk) endif() add_dependencies(${_keyboard_layout} psdk) add_cd_file(TARGET ${_keyboard_layout} DESTINATION reactos/system32 FOR all) endforeach()