[HAL]
[reactos.git] / CMakeMacros.cmake
1
2 MACRO(_PCH_GET_COMPILE_FLAGS _target_name _out_compile_flags _header_filename)
3
4 # Add the precompiled header to the build
5 get_filename_component(FILE ${_header_filename} NAME)
6 set(_gch_filename "${_target_name}_${FILE}.gch")
7 list(APPEND ${_out_compile_flags} -c ${_header_filename} -o ${_gch_filename})
8
9 # This gets us our includes
10 get_directory_property(DIRINC INCLUDE_DIRECTORIES)
11 foreach(item ${DIRINC})
12 list(APPEND ${_out_compile_flags} -I${item})
13 endforeach(item)
14
15 # This is a particular bit of undocumented/hacky magic I'm quite proud of
16 get_directory_property(_compiler_flags DEFINITIONS)
17 string(REPLACE "\ " "\t" _compiler_flags ${_compiler_flags})
18 list(APPEND ${_out_compile_flags} ${_compiler_flags})
19
20 # This gets any specific definitions that were added with set-target-property
21 get_target_property(_target_defs ${_target_name} COMPILE_DEFINITIONS)
22 if (_target_defs)
23 foreach(item ${_target_defs})
24 list(APPEND ${_out_compile_flags} -D${item})
25 endforeach(item)
26 endif()
27
28 ENDMACRO(_PCH_GET_COMPILE_FLAGS)
29
30 if (NOT MSVC)
31 MACRO(CreateBootSectorTarget _target_name _asm_file _object_file)
32
33 get_filename_component(OBJECT_PATH ${_object_file} PATH)
34 get_filename_component(OBJECT_NAME ${_object_file} NAME)
35 file(MAKE_DIRECTORY ${OBJECT_PATH})
36 get_directory_property(defines COMPILE_DEFINITIONS)
37 get_directory_property(includes INCLUDE_DIRECTORIES)
38
39 foreach(arg ${defines})
40 set(result_defs ${result_defs} -D${arg})
41 endforeach(arg ${defines})
42
43 foreach(arg ${includes})
44 set(result_incs -I${arg} ${result_incs})
45 endforeach(arg ${includes})
46
47 add_custom_command(
48 OUTPUT ${_object_file}
49 COMMAND nasm -o ${_object_file} ${result_incs} ${result_defs} -f bin ${_asm_file}
50 DEPENDS ${_asm_file})
51 set_source_files_properties(${_object_file} PROPERTIES GENERATED TRUE)
52 add_custom_target(${_target_name} ALL DEPENDS ${_object_file})
53 add_minicd(${_object_file} loader ${OBJECT_NAME})
54 ENDMACRO(CreateBootSectorTarget _target_name _asm_file _object_file)
55 else()
56 MACRO(CreateBootSectorTarget _target_name _asm_file _object_file)
57 ENDMACRO()
58 endif()
59
60 MACRO(MACRO_IDL_COMPILE_OBJECT OBJECT SOURCE)
61 GET_PROPERTY(FLAGS SOURCE ${SOURCE} PROPERTY COMPILE_FLAGS)
62 GET_PROPERTY(DEFINES SOURCE ${SOURCE} PROPERTY COMPILE_DEFINITIONS)
63 GET_PROPERTY(INCLUDE_DIRECTORIES DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
64 FOREACH(DIR ${INCLUDE_DIRECTORIES})
65 SET(FLAGS "${FLAGS} -I${DIR}")
66 ENDFOREACH()
67
68 SET(IDL_COMMAND ${CMAKE_IDL_COMPILE_OBJECT})
69 STRING(REPLACE "<CMAKE_IDL_COMPILER>" "${CMAKE_IDL_COMPILER}" IDL_COMMAND "${IDL_COMMAND}")
70 STRING(REPLACE <FLAGS> "${FLAGS}" IDL_COMMAND "${IDL_COMMAND}")
71 STRING(REPLACE "<DEFINES>" "${DEFINES}" IDL_COMMAND "${IDL_COMMAND}")
72 STRING(REPLACE "<OBJECT>" "${OBJECT}" IDL_COMMAND "${IDL_COMMAND}")
73 STRING(REPLACE "<SOURCE>" "${SOURCE}" IDL_COMMAND "${IDL_COMMAND}")
74 SEPARATE_ARGUMENTS(IDL_COMMAND)
75
76 ADD_CUSTOM_COMMAND(
77 OUTPUT ${OBJECT}
78 COMMAND ${IDL_COMMAND}
79 DEPENDS ${SOURCE}
80 VERBATIM
81 )
82 ENDMACRO()
83
84 MACRO(ADD_INTERFACE_DEFINITIONS TARGET)
85 FOREACH(SOURCE ${ARGN})
86 GET_FILENAME_COMPONENT(FILE ${SOURCE} NAME_WE)
87 SET(OBJECT ${CMAKE_CURRENT_BINARY_DIR}/${FILE}.h)
88 MACRO_IDL_COMPILE_OBJECT(${OBJECT} ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE})
89 LIST(APPEND OBJECTS ${OBJECT})
90 ENDFOREACH()
91 ADD_CUSTOM_TARGET(${TARGET} ALL DEPENDS ${OBJECTS})
92 ENDMACRO()
93
94 MACRO(add_minicd_target _targetname _dir) # optional parameter: _nameoncd
95 if("${ARGN}" STREQUAL "")
96 get_target_property(FILENAME ${_targetname} LOCATION)
97 get_filename_component(_nameoncd ${FILENAME} NAME)
98 else()
99 set(_nameoncd ${ARGN})
100 endif()
101
102 file(APPEND ${REACTOS_BINARY_DIR}/boot/ros_minicd_target.txt "${_targetname}\t${_dir}\t${_nameoncd}\n")
103 ENDMACRO(add_minicd_target)
104
105 MACRO(add_minicd FILENAME _dir _nameoncd)
106 file(APPEND ${REACTOS_BINARY_DIR}/boot/ros_minicd.txt "${FILENAME}\t${_dir}\t${_nameoncd}\n")
107 ENDMACRO(add_minicd)
108
109 macro(set_cpp)
110 include_directories(BEFORE ${REACTOS_SOURCE_DIR}/include/c++/stlport)
111 set(IS_CPP 1)
112 add_definitions(
113 -DNATIVE_CPP_INCLUDE=${REACTOS_SOURCE_DIR}/include/c++
114 -DNATIVE_C_INCLUDE=${REACTOS_SOURCE_DIR}/include/crt)
115 endmacro()
116
117 MACRO(add_livecd_target _targetname _dir )# optional parameter : _nameoncd
118 if("${ARGN}" STREQUAL "")
119 get_target_property(FILENAME ${_targetname} LOCATION)
120 get_filename_component(_nameoncd ${FILENAME} NAME)
121 else()
122 set(_nameoncd ${ARGN})
123 endif()
124
125 file(APPEND ${REACTOS_BINARY_DIR}/boot/ros_livecd_target.txt "${_targetname}\t${_dir}\t${_nameoncd}\n")
126 ENDMACRO(add_livecd_target)
127
128 MACRO(add_livecd FILENAME _dir)# optional parameter : _nameoncd
129 if("${ARGN}" STREQUAL "")
130 get_filename_component(_nameoncd ${FILENAME} NAME)
131 else()
132 set(_nameoncd ${ARGN})
133 endif()
134 file(APPEND ${REACTOS_BINARY_DIR}/boot/ros_livecd.txt "${FILENAME}\t${_dir}\t${_nameoncd}\n")
135 ENDMACRO(add_livecd)
136
137 macro(cab_to_dir _dir_num _var_name)
138 # 1 = system32
139 # 2 = system32\drivers
140 # 3 = Fonts
141 # 4 =
142 # 5 = system32\drivers\etc
143 # 6 = inf
144 # 7 = bin
145 # 8 = media
146 if(${_dir_num} STREQUAL "1")
147 set(${_var_name} "reactos/system32")
148 elseif(${_dir_num} STREQUAL "2")
149 set(${_var_name} "reactos/system32/drivers")
150 elseif(${_dir_num} STREQUAL "3")
151 set(${_var_name} "reactos/fonts")
152 elseif(${_dir_num} STREQUAL "4")
153 set(${_var_name} "reactos")
154 elseif(${_dir_num} STREQUAL "5")
155 set(${_var_name} "reactos/system32/drivers/etc")
156 elseif(${_dir_num} STREQUAL "6")
157 set(${_var_name} "reactos/inf")
158 elseif(${_dir_num} STREQUAL "7")
159 set(${_var_name} "reactos/bin")
160 elseif(${_dir_num} STREQUAL "8")
161 set(${_var_name} "reactos/system32/drivers")
162 else()
163 message(FATAL_ERROR "Wrong directory ${_dir_num}")
164 endif()
165 endmacro()
166
167 MACRO(add_cab_target _targetname _num )
168 file(APPEND ${REACTOS_BINARY_DIR}/boot/ros_cab_target.txt "${_targetname}\t${_num}\n")
169 cab_to_dir(${_num} _dir)
170 add_livecd_target(${_targetname} ${_dir})
171 ENDMACRO(add_cab_target)
172
173 MACRO(add_cab FILENAME _num)
174 file(APPEND ${REACTOS_BINARY_DIR}/boot/ros_cab.txt "${FILENAME}\t${_num}\n")
175 cab_to_dir(${_num} _dir)
176 add_livecd(${FILENAME} ${_dir})
177 ENDMACRO(add_cab)
178
179 macro(custom_incdefs)
180 if(NOT DEFINED result_incs) #rpc_defines
181 get_directory_property(rpc_defines COMPILE_DEFINITIONS)
182 get_directory_property(rpc_includes INCLUDE_DIRECTORIES)
183
184 foreach(arg ${rpc_defines})
185 set(result_defs ${result_defs} -D${arg})
186 endforeach(arg ${defines})
187
188 foreach(arg ${rpc_includes})
189 set(result_incs -I${arg} ${result_incs})
190 endforeach(arg ${includes})
191 endif()
192 endmacro(custom_incdefs)
193
194 macro(rpcproxy TARGET)
195 custom_incdefs()
196 list(APPEND SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_proxy.dlldata.c)
197
198 foreach(_in_FILE ${ARGN})
199 get_filename_component(FILE ${_in_FILE} NAME_WE)
200 add_custom_command(
201 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.h ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.c
202 COMMAND native-widl ${result_incs} ${result_defs} -m32 --win32 -h -H ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.h -p -P ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.c ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.idl
203 DEPENDS native-widl)
204 set_source_files_properties(
205 ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.h ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.c
206 PROPERTIES GENERATED TRUE)
207 list(APPEND SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.c)
208 list(APPEND IDLS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.idl)
209 list(APPEND PROXY_DEPENDS ${TARGET}_${FILE}_p)
210 add_custom_target(${TARGET}_${FILE}_p
211 DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_p.c)
212 #add_dependencies(${TARGET}_proxy ${TARGET}_${FILE}_p)
213 endforeach(_in_FILE ${ARGN})
214
215 add_custom_command(
216 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_proxy.dlldata.c
217 COMMAND native-widl ${result_incs} ${result_defs} -m32 --win32 --dlldata-only --dlldata=${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_proxy.dlldata.c ${IDLS}
218 DEPENDS native-widl)
219 set_source_files_properties(
220 ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_proxy.dlldata.c
221 PROPERTIES GENERATED TRUE)
222
223 add_library(${TARGET}_proxy ${SOURCE})
224 add_dependencies(${TARGET}_proxy psdk ${PROXY_DEPENDS})
225 endmacro(rpcproxy)
226
227 macro (MACRO_IDL_FILES)
228 custom_incdefs()
229 foreach(_in_FILE ${ARGN})
230 get_filename_component(FILE ${_in_FILE} NAME_WE)
231 add_custom_command(
232 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.h ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.c
233 COMMAND ${IDL_COMPILER} ${result_incs} ${result_defs} ${IDL_FLAGS} ${IDL_HEADER_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.h ${IDL_SERVER_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.c ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.idl
234 DEPENDS ${_in_file})
235 set_source_files_properties(
236 ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.h ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.c
237 PROPERTIES GENERATED TRUE)
238 add_library(${FILE}_server ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_s.c)
239 add_dependencies(${FILE}_server psdk)
240
241 add_custom_command(
242 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.h ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.c
243 COMMAND ${IDL_COMPILER} ${result_incs} ${result_defs} ${IDL_FLAGS} ${IDL_HEADER_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.h ${IDL_CLIENT_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.c ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.idl
244 DEPENDS ${_in_file})
245 set_source_files_properties(
246 ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.h ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.c
247 PROPERTIES GENERATED TRUE)
248 add_library(${FILE}_client ${CMAKE_CURRENT_BINARY_DIR}/${FILE}_c.c)
249 add_dependencies(${FILE}_client psdk)
250 endforeach(_in_FILE ${ARGN})
251
252 endmacro (MACRO_IDL_FILES)
253
254 macro(ADD_TYPELIB TARGET)
255 custom_incdefs()
256 foreach(SOURCE ${ARGN})
257 get_filename_component(FILE ${SOURCE} NAME_WE)
258 set(OBJECT ${CMAKE_CURRENT_BINARY_DIR}/${FILE}.tlb)
259 add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${FILE}.tlb
260 COMMAND ${IDL_COMPILER} ${result_incs} ${IDL_FLAGS} ${IDL_TYPELIB_ARG} ${CMAKE_CURRENT_BINARY_DIR}/${FILE}.tlb ${CMAKE_CURRENT_SOURCE_DIR}/${SOURCE}
261 DEPENDS ${SOURCE})
262 list(APPEND OBJECTS ${OBJECT})
263 endforeach()
264 add_custom_target(${TARGET} ALL DEPENDS ${OBJECTS})
265 endmacro()