xref: /reactos/boot/freeldr/freeldr/uefi.cmake (revision 9c5efed7)
1##
2## PROJECT:     FreeLoader
3## LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4## PURPOSE:     Build definitions for UEFI
5## COPYRIGHT:   Copyright 2023 Justin Miller <justinmiller100@gmail.com>
6##
7
8include_directories(BEFORE
9    ${REACTOS_SOURCE_DIR}/boot/environ/include/efi
10    ${REACTOS_SOURCE_DIR}/boot/freeldr/freeldr
11    ${REACTOS_SOURCE_DIR}/boot/freeldr/freeldr/include
12    ${REACTOS_SOURCE_DIR}/boot/freeldr/freeldr/include/arch/uefi)
13
14list(APPEND UEFILDR_ARC_SOURCE
15    ${FREELDR_ARC_SOURCE}
16    arch/uefi/stubs.c
17    arch/uefi/ueficon.c
18    arch/uefi/uefidisk.c
19    arch/uefi/uefihw.c
20    arch/uefi/uefimem.c
21    arch/uefi/uefisetup.c
22    arch/uefi/uefiutil.c
23    arch/uefi/uefivid.c
24    arch/vgafont.c)
25
26if(ARCH STREQUAL "i386")
27    list(APPEND UEFILDR_ARC_SOURCE
28        arch/i386/i386idt.c)
29    list(APPEND UEFILDR_COMMON_ASM_SOURCE
30        arch/uefi/i386/uefiasm.S
31        arch/i386/i386trap.S)
32elseif(ARCH STREQUAL "amd64")
33    list(APPEND UEFILDR_COMMON_ASM_SOURCE
34        arch/uefi/amd64/uefiasm.S)
35elseif(ARCH STREQUAL "arm")
36    list(APPEND UEFILDR_ARC_SOURCE
37        arch/arm/macharm.c
38        arch/arm/debug.c)
39    #TBD
40elseif(ARCH STREQUAL "arm64")
41    #TBD
42else()
43    #TBD
44endif()
45
46list(APPEND UEFILDR_BOOTMGR_SOURCE
47    ${FREELDR_BOOTMGR_SOURCE}
48    custom.c
49    options.c
50    oslist.c
51)
52
53add_asm_files(uefifreeldr_common_asm ${FREELDR_COMMON_ASM_SOURCE} ${UEFILDR_COMMON_ASM_SOURCE})
54
55add_library(uefifreeldr_common
56    ${uefifreeldr_common_asm}
57    ${UEFILDR_ARC_SOURCE}
58    ${FREELDR_BOOTLIB_SOURCE}
59    ${UEFILDR_BOOTMGR_SOURCE}
60    ${FREELDR_NTLDR_SOURCE})
61
62target_compile_definitions(uefifreeldr_common PRIVATE UEFIBOOT)
63
64if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
65    # Prevent using SSE (no support in freeldr)
66    target_compile_options(uefifreeldr_common PUBLIC -mno-sse)
67endif()
68
69set(PCH_SOURCE
70    ${UEFILDR_ARC_SOURCE}
71    ${FREELDR_BOOTLIB_SOURCE}
72    ${UEFILDR_BOOTMGR_SOURCE}
73    ${FREELDR_NTLDR_SOURCE})
74
75add_pch(uefifreeldr_common include/arch/uefi/uefildr.h PCH_SOURCE)
76add_dependencies(uefifreeldr_common bugcodes asm xdk)
77
78## GCC builds need this extra thing for some reason...
79if(ARCH STREQUAL "i386" AND NOT MSVC)
80    target_link_libraries(uefifreeldr_common mini_hal)
81endif()
82
83
84spec2def(uefildr.exe freeldr.spec)
85
86list(APPEND UEFILDR_BASE_SOURCE
87    include/arch/uefi/uefildr.h
88    arch/uefi/uefildr.c
89    bootmgr.c
90    ntldr/setupldr.c
91    ntldr/inffile.c
92    ${FREELDR_BASE_SOURCE})
93
94if(ARCH STREQUAL "i386")
95    # Must be included together with disk/scsiport.c
96    list(APPEND UEFILDR_BASE_SOURCE
97        ${CMAKE_CURRENT_BINARY_DIR}/uefildr.def)
98endif()
99
100add_executable(uefildr ${UEFILDR_BASE_SOURCE})
101set_target_properties(uefildr PROPERTIES SUFFIX ".efi")
102
103target_compile_definitions(uefildr PRIVATE UEFIBOOT)
104
105# On AMD64 we only map 1GB with freeloader, tell UEFI to keep us low!
106if(ARCH STREQUAL "amd64")
107    set_image_base(uefildr 0x10000)
108endif()
109
110if(MSVC)
111if(NOT ARCH STREQUAL "arm")
112    target_link_options(uefildr PRIVATE /DYNAMICBASE:NO)
113endif()
114    target_link_options(uefildr PRIVATE /NXCOMPAT:NO /ignore:4078 /ignore:4254 /DRIVER)
115    # We don't need hotpatching
116    remove_target_compile_option(uefildr "/hotpatch")
117else()
118    target_link_options(uefildr PRIVATE -Wl,--exclude-all-symbols,--file-alignment,0x200,--section-alignment,0x200)
119    # Strip everything, including rossym data
120    add_custom_command(TARGET uefildr
121                    POST_BUILD
122                    COMMAND ${CMAKE_STRIP} --remove-section=.rossym $<TARGET_FILE:uefildr>
123                    COMMAND ${CMAKE_STRIP} --strip-all $<TARGET_FILE:uefildr>)
124endif()
125
126if(MSVC)
127    set_subsystem(uefildr EFI_APPLICATION)
128else()
129    set_subsystem(uefildr 10)
130endif()
131
132set_entrypoint(uefildr EfiEntry)
133
134if(ARCH STREQUAL "i386")
135    target_link_libraries(uefildr mini_hal)
136endif()
137
138target_link_libraries(uefildr uefifreeldr_common cportlib blcmlib blrtl libcntpr)
139
140# dynamic analysis switches
141if(STACK_PROTECTOR)
142    target_sources(uefildr PRIVATE $<TARGET_OBJECTS:gcc_ssp_nt>)
143endif()
144
145if(RUNTIME_CHECKS)
146    target_link_libraries(uefildr runtmchk)
147endif()
148
149add_dependencies(uefildr xdk)
150