Mercurial > projects > qtd
comparison CMakeLists.txt @ 7:b8a79f9fba5a
More fixes and cleanups in CMake build script.
author | SokoL_SD |
---|---|
date | Thu, 14 May 2009 08:36:04 +0000 |
parents | 834feae7809b |
children | 16eec94c5b33 |
comparison
equal
deleted
inserted
replaced
6:374a61671448 | 7:b8a79f9fba5a |
---|---|
1 cmake_minimum_required(VERSION 2.6) | 1 cmake_minimum_required(VERSION 2.6) |
2 PROJECT(qtd CXX C) | 2 PROJECT(qtd CXX C) |
3 FIND_PACKAGE(Qt4 REQUIRED) | 3 FIND_PACKAGE(Qt4 REQUIRED) |
4 | 4 |
5 ##-------------------------------------------- | |
6 ## Settings. | |
7 ##-------------------------------------------- | |
8 | |
5 include_directories(${QT_INCLUDES} include ${CMAKE_CURRENT_BINARY_DIR}/include) | 9 include_directories(${QT_INCLUDES} include ${CMAKE_CURRENT_BINARY_DIR}/include) |
6 | 10 |
11 ## Options. | |
7 option(BUILD_QT_OPENGL "Build QtOpenGL" "ON") | 12 option(BUILD_QT_OPENGL "Build QtOpenGL" "ON") |
8 option(BUILD_EXAMPLES "Build examples" "ON") | 13 option(BUILD_EXAMPLES "Build examples" "ON") |
9 | 14 |
10 set(PACKAGES Core Gui) | 15 ## Packages list. |
16 set(packages_big Core Gui) | |
11 if(BUILD_QT_OPENGL) | 17 if(BUILD_QT_OPENGL) |
12 set(PACKAGES ${PACKAGES} OpenGL) | 18 set(packages_big ${packages_big} OpenGL) |
13 endif(BUILD_QT_OPENGL) | 19 endif(BUILD_QT_OPENGL) |
14 | 20 |
15 set(packages_big ${PACKAGES}) | |
16 set(packages) | 21 set(packages) |
17 foreach(package ${packages_big}) | 22 foreach(package ${packages_big}) |
18 string(TOLOWER ${package} package) | 23 string(TOLOWER ${package} package) |
19 set(packages ${packages} ${package}) | 24 set(packages ${packages} ${package}) |
20 endforeach(package ${packages_big}) | 25 endforeach(package ${packages_big}) |
21 | 26 |
22 #set(CMAKE_LIBRARY_OUTPUT_DIRECTORY CMakeFiles) | 27 ## Find D compiler and parsing its version. |
23 | |
24 find_program(DC dmd ldc) | 28 find_program(DC dmd ldc) |
25 ## Parsing D compiler version. | |
26 if (DC) | 29 if (DC) |
27 exec_program(${DC} ARGS "" OUTPUT_VARIABLE d_output) | 30 exec_program(${DC} ARGS "" OUTPUT_VARIABLE d_output) |
28 string(REGEX MATCH "Digital Mars D Compiler v[0-9]\\.[0-9]+" dmd_version "${d_output}") | 31 string(REGEX MATCH "Digital Mars D Compiler v[0-9]\\.[0-9]+" dmd_version "${d_output}") |
29 if (dmd_version) | 32 if (dmd_version) |
30 set(D_IS_MARS true) | 33 set(D_IS_MARS true) |
52 message(STATUS "D compiler founded -- ${D_COMPILER_NAME} v${D_VERSION}.${D_FRONTEND}") | 55 message(STATUS "D compiler founded -- ${D_COMPILER_NAME} v${D_VERSION}.${D_FRONTEND}") |
53 else (DC) | 56 else (DC) |
54 message(FATAL_ERROR "D compliler not founded") | 57 message(FATAL_ERROR "D compliler not founded") |
55 endif (DC) | 58 endif (DC) |
56 | 59 |
60 if(D_IS_MARS) | |
61 option(COMBINED_OBJECT_FILE "Build all d sources to one object file" "ON") | |
62 elseif(D_IS_LLVM) | |
63 option(COMBINED_OBJECT_FILE "Build all d sources to one object file" "OFF") | |
64 endif(D_IS_MARS) | |
65 | |
57 # Check D compiler version | 66 # Check D compiler version |
58 if(D_VERSION EQUAL "1") | 67 if(D_VERSION EQUAL "1") |
59 if (D_FRONTEND LESS "041") | 68 if (D_FRONTEND LESS "041") |
60 message(STATUS "Minimum required version of D compiler is 1.041 (or compiler based on this version)") | 69 message(STATUS "Minimum required version of D compiler is 1.041 (or compiler based on this version)") |
61 endif(D_FRONTEND LESS "041") | 70 endif(D_FRONTEND LESS "041") |
62 set(D_TARGET d1-tango) | 71 set(D_TARGET d1-tango) |
63 elseif(D_VERSION EQUAL "2") | 72 elseif(D_VERSION EQUAL "2") |
64 set(D_TARGET ) ## TODO: hm... I don`t known this parameter for D2 ^( | 73 set(D_TARGET ) ## TODO: hm... I don`t known this parameter for D2 ^( |
65 endif(D_VERSION EQUAL "1") | 74 endif(D_VERSION EQUAL "1") |
66 | |
67 if(D_IS_MARS) | |
68 set(SEPARETLY_D_OBJECTS true) | |
69 elseif(D_IS_LLVM) | |
70 set(SEPARETLY_D_OBJECTS true) | |
71 endif(D_IS_MARS) | |
72 | 75 |
73 # Debug and release flags. | 76 # Debug and release flags. |
74 if (${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG]) | 77 if (${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG]) |
75 #set(CMAKE_BUILD_TYPE Debug) | 78 #set(CMAKE_BUILD_TYPE Debug) |
76 #set( SUFFIXLIB "${SUFFIXLIB}-debug" ) | 79 #set( SUFFIXLIB "${SUFFIXLIB}-debug" ) |
84 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | 87 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows) |
85 set(D_FLAGS ${D_FLAGS} -L/subsystem:windows) | 88 set(D_FLAGS ${D_FLAGS} -L/subsystem:windows) |
86 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | 89 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows) |
87 endif (${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG]) | 90 endif (${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG]) |
88 set(D_FLAGS ${D_FLAGS} -I${CMAKE_BINARY_DIR} -I${CMAKE_SOURCE_DIR}) | 91 set(D_FLAGS ${D_FLAGS} -I${CMAKE_BINARY_DIR} -I${CMAKE_SOURCE_DIR}) |
89 | 92 if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL Windows AND NOT D_IS_MARS) |
90 MACRO(MAKE_WINDOWS_PATH pathname) | 93 set(D_FLAGS ${D_FLAGS} -L-L${CMAKE_BINARY_DIR}/lib) |
91 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | 94 endif(NOT ${CMAKE_SYSTEM_NAME} STREQUAL Windows AND NOT D_IS_MARS) |
92 # An extra \\ escape is necessary to get a \ through CMake's processing. | 95 |
93 STRING(REPLACE "/" "\\" ${pathname} "${${pathname}}") | |
94 # Enclose with UNESCAPED quotes. This means we need to escape our | |
95 # quotes once here, i.e. with \" | |
96 SET(${pathname} \"${${pathname}}\") | |
97 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | |
98 ENDMACRO(MAKE_WINDOWS_PATH) | |
99 | 96 |
100 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | 97 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows) |
101 set(implib implib) | 98 set(implib implib) |
102 find_program(IMPLIB ${implib}) | 99 find_program(IMPLIB ${implib}) |
103 if (NOT IMPLIB) | 100 if (NOT IMPLIB) |
111 set(D_LIB_SUFFIX .a) | 108 set(D_LIB_SUFFIX .a) |
112 set(D_LIB_PREFIX lib) | 109 set(D_LIB_PREFIX lib) |
113 endif(D_IS_MARS) | 110 endif(D_IS_MARS) |
114 set(GEN_OPT ${GEN_OPT} --cpp_shared) | 111 set(GEN_OPT ${GEN_OPT} --cpp_shared) |
115 add_definitions(-DCPP_SHARED) | 112 add_definitions(-DCPP_SHARED) |
113 string(REGEX REPLACE ".dll([A-Za-z\\.0-9]+)" "\\1" CMAKE_IMPORT_LIBRARY_SUFFIX "${CMAKE_IMPORT_LIBRARY_SUFFIX}") | |
116 elseif(${CMAKE_SYSTEM_NAME} STREQUAL Linux) | 114 elseif(${CMAKE_SYSTEM_NAME} STREQUAL Linux) |
117 set(D_LIB_SUFFIX .a) | 115 set(D_LIB_SUFFIX .a) |
118 set(D_LIB_PREFIX lib) | 116 set(D_LIB_PREFIX lib) |
119 set(D_OBJECT_SUFFIX .o) | 117 set(D_OBJECT_SUFFIX .o) |
120 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | 118 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows) |
121 | 119 |
122 set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./) | 120 set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./) |
123 set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET}) | 121 set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET}) |
124 | 122 |
125 add_subdirectory(generator) | 123 ##-------------------------------------------- |
126 | 124 ## Macroses and functions. |
125 ##-------------------------------------------- | |
126 | |
127 ## Make native path. | |
128 ## Usage: | |
129 ## set(path c:/file_path/file_name.cpp) | |
130 ## make_native_path(path) | |
131 ## message(STATUS ${path}) | |
132 ## Output: | |
133 ## -- "c:\file_path\file_name.cpp" | |
134 ## Command "file(TO_NATIVE_PATH ...)" is wrong on Windows | |
135 macro(MAKE_NATIVE_PATH pathname) | |
136 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | |
137 # An extra \\ escape is necessary to get a \ through CMake's processing. | |
138 string(REPLACE "/" "\\" ${pathname} "${${pathname}}") | |
139 # Enclose with UNESCAPED quotes. This means we need to escape our | |
140 # quotes once here, i.e. with \" | |
141 set(${pathname} \"${${pathname}}\") | |
142 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | |
143 endmacro(MAKE_NATIVE_PATH) | |
144 | |
145 ## Remove unnecessary travel to the object file. | |
146 ## path -- path to object file. | |
147 ## Example: | |
148 ## set(path ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/target.dir/main.d.obj) | |
149 ## obj_path(path) | |
150 ## message(STATUS ${path}) | |
151 ## Example output: | |
152 ## -- CMakeFiles/target.dir/main.d.obj | |
127 macro(OBJ_PATH path) | 153 macro(OBJ_PATH path) |
128 unset(test) | 154 unset(test) |
129 string(REGEX MATCH "${CMAKE_CURRENT_BINARY_DIR}/.*" test "${${path}}") | 155 string(REGEX MATCH "${CMAKE_CURRENT_BINARY_DIR}/.*" test "${${path}}") |
130 if(NOT ${test} EQUAL "") | 156 if(NOT ${test} EQUAL "") |
131 string(LENGTH "${CMAKE_CURRENT_BINARY_DIR}" first) | 157 string(LENGTH "${CMAKE_CURRENT_BINARY_DIR}" first) |
143 string(SUBSTRING "${${path}}" ${first} ${len} ${path}) | 169 string(SUBSTRING "${${path}}" ${first} ${len} ${path}) |
144 endif(NOT ${test} EQUAL "") | 170 endif(NOT ${test} EQUAL "") |
145 endif(NOT ${test} EQUAL "") | 171 endif(NOT ${test} EQUAL "") |
146 endmacro(OBJ_PATH) | 172 endmacro(OBJ_PATH) |
147 | 173 |
174 | |
175 ## Compile d files. | |
176 ## target -- name of a new target. | |
177 ## objects_list -- created object files. | |
178 ## params -- sources files. | |
148 macro(compile_d_files target objects_list) | 179 macro(compile_d_files target objects_list) |
149 unset(${objects_list}) | 180 unset(${objects_list}) |
150 set(tmp_dir ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${target}.dir) | 181 set(tmp_dir ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${target}.dir) |
151 file(MAKE_DIRECTORY ${tmp_dir}) | 182 file(MAKE_DIRECTORY ${tmp_dir}) |
152 if(${SEPARETLY_D_OBJECTS}) | 183 if(NOT COMBINED_OBJECT_FILE) |
153 foreach (d_source ${ARGN}) | 184 foreach (d_source_p ${ARGN}) |
154 OBJ_PATH(d_source) | 185 ## TODO: why find_file command work wrong? |
186 find_file(d_source_p ${d_source_p} PATHS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} | |
187 ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}) | |
188 set (d_source ${d_source_p}) | |
189 obj_path(d_source) | |
155 set(d_obj ${tmp_dir}/${d_source}${D_OBJECT_SUFFIX}) | 190 set(d_obj ${tmp_dir}/${d_source}${D_OBJECT_SUFFIX}) |
156 set(${objects_list} ${${objects_list} ${d_obj}) | 191 set(${objects_list} ${${objects_list}} ${d_obj}) |
157 get_filename_component(path ${d_obj} PATH) | 192 get_filename_component(path ${d_obj} PATH) |
158 file(MAKE_DIRECTORY ${path}) | 193 file(MAKE_DIRECTORY ${path}) |
159 set(d_obj_out ${d_obj}) | 194 set(d_obj_out ${d_obj}) |
160 OBJ_PATH(d_obj_out) | 195 obj_path(d_obj_out) |
161 add_custom_command(OUTPUT "${d_obj}" | 196 add_custom_command(OUTPUT "${d_obj}" |
162 COMMAND "${DC}" | 197 COMMAND "${DC}" |
163 ARGS ${D_FLAGS} -c ${d_source} -of${d_obj} | 198 ARGS ${D_FLAGS} -c ${d_source_p} -of${d_obj} |
164 COMMENT "Building ${d_obj_out}" | 199 COMMENT "Building ${d_obj_out}" |
165 DEPENDS ${d_source} | 200 DEPENDS ${d_source_p} |
166 ) | 201 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} |
167 endforeach(d_source) | 202 ) |
168 else(${SEPARETLY_D_OBJECTS}) | 203 endforeach(d_source_p) |
204 else(NOT COMBINED_OBJECT_FILE) | |
169 set(${objects_list} ${tmp_dir}/${target}${D_OBJECT_SUFFIX}) | 205 set(${objects_list} ${tmp_dir}/${target}${D_OBJECT_SUFFIX}) |
170 set(d_obj_out ${${objects_list}}) | 206 set(d_obj_out ${${objects_list}}) |
171 OBJ_PATH(d_obj_out) | 207 obj_path(d_obj_out) |
172 set(parameters_list_file ${tmp_dir}/parameters) | 208 set(parameters_list_file ${tmp_dir}/parameters) |
173 SET (parameters ${D_FLAGS} -c ${ARGN} -of${${objects_list}}) | 209 set(parameters ${D_FLAGS} -c ${ARGN} -of${${objects_list}}) |
174 FILE (REMOVE ${parameters_list_file}) | 210 file(REMOVE ${parameters_list_file}) |
175 FOREACH(arg ${parameters}) | 211 foreach(arg ${parameters}) |
176 FILE (APPEND ${parameters_list_file} "${arg}\n") | 212 file(APPEND ${parameters_list_file} "${arg}\n") |
177 ENDFOREACH(arg) | 213 endforeach(arg) |
178 add_custom_command(OUTPUT "${${objects_list}}" | 214 add_custom_command(OUTPUT "${${objects_list}}" |
179 COMMAND "${DC}" | 215 COMMAND "${DC}" |
180 ARGS @${parameters_list_file} | 216 ARGS @${parameters_list_file} |
181 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | 217 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} |
182 DEPENDS ${ARGN} | 218 DEPENDS ${ARGN} |
183 COMMENT "" | 219 COMMENT "" |
184 ) | 220 ) |
185 endif(${SEPARETLY_D_OBJECTS}) | 221 endif(NOT COMBINED_OBJECT_FILE) |
222 add_custom_target(${target} DEPENDS "${${objects_list}}") | |
186 endmacro(compile_d_files objects_list) | 223 endmacro(compile_d_files objects_list) |
187 | 224 |
188 file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/lib) | 225 ## Build example macro. |
189 add_custom_target(allpackages ALL) | 226 ## name -- example name. |
190 | 227 ## Options: |
191 link_directories(${CMAKE_BINARY_DIR}/CMakeFiles) | 228 ## PACKAGES -- list of packages to link to exaple (for example, QtCore QtGui QtOpenGL). |
192 | 229 ## Default value is "QtCore QtGui". |
193 foreach(package ${packages}) | 230 ## params -- sources d files. |
194 unset(d_objs) | 231 ## Usage: |
195 unset(cpp_objs) | 232 ## build_example(ExampleName PACKAGES QtCore QtGui QtXml main.d another_d_file.d) |
196 unset(d_sources) | |
197 unset(cpp_sources) | |
198 unset(lib_name) | |
199 unset(link_cpp) | |
200 unset(link_d) | |
201 unset(cpp_files) | |
202 unset(d_files) | |
203 unset(classes) | |
204 unset(d_generated_files) | |
205 | |
206 include (${CMAKE_SOURCE_DIR}/build/${package}.txt) | |
207 | |
208 set(${package}_link_example "${link_example}") | |
209 set(${link_example} "") | |
210 | |
211 set(CUR_TMP_PATH CMakeFiles/${package}.dir) | |
212 | |
213 set(classes ArrayOps ${classes}) | |
214 foreach(class ${classes}) | |
215 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d) | |
216 set(cpp_sources ${cpp_sources} ${CMAKE_BINARY_DIR}/cpp/qt_${package}/${class}_shell.cpp) | |
217 endforeach(class) | |
218 add_sources_for_generating(${cpp_sources}) | |
219 | |
220 foreach(d_source ${d_files}) | |
221 set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/qt/${d_source}.d) | |
222 endforeach(d_source) | |
223 foreach(d_source ${d_generated_files}) | |
224 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}.d) | |
225 endforeach(d_source) | |
226 foreach (cpp_source ${cpp_files}) | |
227 set(cpp_sources ${cpp_sources} ${CMAKE_SOURCE_DIR}/cpp/${cpp_source}.cpp) | |
228 endforeach(cpp_source) | |
229 | |
230 compile_d_files(${package}_dobjs objects ${d_sources}) | |
231 set(d_objs ${d_objs} ${objects}) | |
232 | |
233 set(lib_name ${D_LIB_PREFIX}qtd${package}${D_LIB_SUFFIX}) | |
234 | |
235 add_library(cpp_${package} SHARED ${cpp_sources}) | |
236 add_dependencies(cpp_${package} dgen) | |
237 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | |
238 set_property(TARGET cpp_${package} PROPERTY RUNTIME_OUTPUT_DIRECTORY lib) | |
239 set_property(TARGET cpp_${package} PROPERTY ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles) | |
240 ADD_CUSTOM_COMMAND( | |
241 TARGET cpp_${package} | |
242 POST_BUILD | |
243 COMMAND ${CMAKE_COMMAND} -E remove | |
244 ${CMAKE_BINARY_DIR}/CMakeFiles/${CMAKE_IMPORT_LIBRARY_PREFIX}cpp${package}${CMAKE_IMPORT_LIBRARY_SUFFIX} | |
245 COMMAND ${CMAKE_COMMAND} -E copy | |
246 ${CMAKE_BINARY_DIR}/CMakeFiles/${CMAKE_IMPORT_LIBRARY_PREFIX}cpp_${package}.dll${CMAKE_IMPORT_LIBRARY_SUFFIX} | |
247 ${CMAKE_BINARY_DIR}/CMakeFiles/${CMAKE_IMPORT_LIBRARY_PREFIX}cpp${package}${CMAKE_IMPORT_LIBRARY_SUFFIX} | |
248 ) | |
249 | |
250 target_link_libraries(cpp_${package} ${link_cpp} ) | |
251 set(cpp_lib ${CMAKE_BINARY_DIR}/lib/libcpp_${package}.dll) | |
252 set(cpp_lib_native ${cpp_lib}) | |
253 MAKE_WINDOWS_PATH(cpp_lib_native) | |
254 set(d_implib ${CMAKE_BINARY_DIR}/CMakeFiles/${package}.dir/cpp_${package}.lib) | |
255 set(d_implib_native ${d_implib}) | |
256 MAKE_WINDOWS_PATH(d_implib_native) | |
257 set(cpp_${package}_implib cpp${package}) | |
258 add_custom_command( | |
259 OUTPUT "${d_implib}" | |
260 COMMAND "${IMPLIB}" | |
261 ARGS /system /PAGESIZE:32 ${d_implib_native} ${cpp_lib_native} | |
262 DEPENDS "cpp_${package}" | |
263 COMMENT "Creating implib ${lib_name}" | |
264 ) | |
265 add_custom_command( | |
266 OUTPUT "${lib_name}" | |
267 COMMAND "${DC}" | |
268 ARGS -lib ${d_objs} ${d_implib} -oflib/${lib_name} | |
269 DEPENDS ${d_objs} ${d_implib} | |
270 COMMENT "Linking ${lib_name}" | |
271 ) | |
272 else(${CMAKE_SYSTEM_NAME} STREQUAL Linux) | |
273 set_property(TARGET cpp_${package} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles) | |
274 foreach(cpp_source ${cpp_sources}) | |
275 set(cpp_source ${cpp_source}) | |
276 OBJ_PATH(cpp_source) | |
277 set(cpp_objs ${cpp_objs} CMakeFiles/cpp_${package}.dir/${cpp_source}.o) | |
278 endforeach(cpp_source) | |
279 | |
280 add_custom_command( | |
281 OUTPUT "${lib_name}" | |
282 COMMAND "${CMAKE_AR}" | |
283 ARGS rcs lib/${lib_name} ${d_objs} ${cpp_objs} | |
284 DEPENDS ${d_objs} cpp_${package} | |
285 COMMENT "Linking ${lib_name}" | |
286 ) | |
287 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | |
288 add_custom_target(${package} DEPENDS ${lib_name}) | |
289 foreach(depend ${depends}) | |
290 add_dependencies(cpp_${package} cpp_${depend}) | |
291 add_dependencies(${package} ${depend}) | |
292 endforeach(depend ${depends}) | |
293 add_dependencies(allpackages ${package}) | |
294 set(depends ${depends} ${package}) | |
295 endforeach(package) | |
296 | |
297 foreach(package_big ${packages_big}) | |
298 string(TOLOWER ${package_big} package) | |
299 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows AND D_IS_MARS) | |
300 set(libs_path ${CMAKE_BINARY_DIR}/lib/qtd${package}.lib) | |
301 MAKE_WINDOWS_PATH(libs_path) | |
302 set(${package}_lib_param -L+${libs_path}) | |
303 foreach(link ${${package}_link_example}) | |
304 set(link ${CMAKE_SOURCE_DIR}/lib/${link}.lib) | |
305 MAKE_WINDOWS_PATH(link) | |
306 set(link -L+${link}) | |
307 set(${package}_lib_param ${${package}_lib_param} ${link}) | |
308 endforeach(link ${link_example}) | |
309 else (${CMAKE_SYSTEM_NAME} STREQUAL Windows AND D_IS_MARS) | |
310 set(${package}_lib_param -L-lqtd${package} -L-lQt${package_big}) | |
311 foreach(link ${link_example}) | |
312 set(${package}_lib_param ${${package}_lib_param} ${link}) | |
313 endforeach(link ${link_example}) | |
314 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows AND D_IS_MARS) | |
315 endforeach(package_big ${packages_big}) | |
316 | |
317 macro(build_example name) | 233 macro(build_example name) |
318 unset(is_sources) | 234 unset(is_sources) |
319 unset(is_libs) | 235 unset(is_libs) |
320 set(qtd_libs ${core_lib_param} ${gui_lib_param}) | 236 set(qtd_libs ${core_lib_param} ${gui_lib_param}) |
321 foreach(param ${ARGN}) | 237 foreach(param ${ARGN}) |
352 if(is_sources) | 268 if(is_sources) |
353 set(sources ${sources} ${param}) | 269 set(sources ${sources} ${param}) |
354 endif(is_sources) | 270 endif(is_sources) |
355 endif(NOT is_libs) | 271 endif(NOT is_libs) |
356 endforeach(param ${ARGN}) | 272 endforeach(param ${ARGN}) |
357 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows AND D_IS_MARS) | |
358 set(libs_path ) | |
359 else(${CMAKE_SYSTEM_NAME} STREQUAL Windows AND D_IS_MARS) | |
360 set(libs_path -L-L${CMAKE_BINARY_DIR}/lib) | |
361 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows AND D_IS_MARS) | |
362 compile_d_files(${name}_dobjs objects ${sources} ) | 273 compile_d_files(${name}_dobjs objects ${sources} ) |
363 set(output ${CMAKE_CURRENT_BINARY_DIR}/${name}${CMAKE_EXECUTABLE_SUFFIX}) | 274 set(output ${CMAKE_CURRENT_BINARY_DIR}/${name}${CMAKE_EXECUTABLE_SUFFIX}) |
364 set(output_native ${output}) | 275 set(output_native ${output}) |
365 make_windows_path(output_native) | 276 make_native_path(output_native) |
277 ## Bug fix: Reverse libs for ldc. | |
278 if(D_IS_LLVM) | |
279 set(qtd_libs_tmp ${qtd_libs}) | |
280 unset(qtd_libs) | |
281 foreach(libs ${qtd_libs_tmp}) | |
282 set(qtd_libs ${libs} ${qtd_libs}) | |
283 endforeach(libs ${qtd_libs_tmp}) | |
284 endif(D_IS_LLVM) | |
285 | |
366 add_custom_command(OUTPUT "${output}" | 286 add_custom_command(OUTPUT "${output}" |
367 COMMAND "${DC}" | 287 COMMAND "${DC}" |
368 ARGS ${D_FLAGS} ${libs_path} ${qtd_libs} ${objects} | 288 ARGS ${D_FLAGS} ${libs_path} ${qtd_libs} ${objects} |
369 -of${output_native} | 289 -of${output_native} |
370 DEPENDS ${objects} | 290 DEPENDS ${objects} |
373 ) | 293 ) |
374 add_custom_target(example_${name} ALL DEPENDS "${output}") | 294 add_custom_target(example_${name} ALL DEPENDS "${output}") |
375 add_dependencies(example_${name} allpackages) | 295 add_dependencies(example_${name} allpackages) |
376 endmacro(build_example sources) | 296 endmacro(build_example sources) |
377 | 297 |
378 if(BUILD_QT_OPENGL) | 298 ##-------------------------------------------- |
299 ## Build library. | |
300 ##-------------------------------------------- | |
301 add_subdirectory(generator) | |
302 file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/lib) | |
303 add_custom_target(allpackages ALL) | |
304 link_directories(${CMAKE_BINARY_DIR}/CMakeFiles) | |
305 | |
306 foreach(package_big ${packages_big}) | |
307 string(TOLOWER ${package_big} package) | |
308 ## Loading settings for package. | |
309 unset(d_objs) | |
310 unset(cpp_objs) | |
311 unset(d_sources) | |
312 unset(cpp_sources) | |
313 unset(lib_name) | |
314 unset(link_cpp) | |
315 unset(link_d) | |
316 unset(cpp_files) | |
317 unset(d_files) | |
318 unset(classes) | |
319 unset(d_generated_files) | |
320 unset(link_example) | |
321 include (${CMAKE_SOURCE_DIR}/build/${package}.txt) | |
322 | |
323 ## Loading package sources list. | |
324 foreach(d_source ${d_files}) | |
325 set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/qt/${d_source}.d) | |
326 endforeach(d_source) | |
327 foreach(d_source ${d_generated_files}) | |
328 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}.d) | |
329 endforeach(d_source) | |
330 foreach (cpp_source ${cpp_files}) | |
331 set(cpp_sources ${cpp_sources} ${CMAKE_SOURCE_DIR}/cpp/${cpp_source}.cpp) | |
332 endforeach(cpp_source) | |
333 set(classes ArrayOps ${classes}) | |
334 foreach(class ${classes}) | |
335 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d) | |
336 set(cpp_sources ${cpp_sources} ${CMAKE_BINARY_DIR}/cpp/qt_${package}/${class}_shell.cpp) | |
337 endforeach(class) | |
338 add_sources_for_generating(${cpp_sources}) | |
339 | |
340 ## Link CPP library. | |
341 set(lib_name ${D_LIB_PREFIX}qtd${package}${D_LIB_SUFFIX}) | |
342 add_library(cpp_${package} SHARED ${cpp_sources}) | |
343 | |
344 ## Link D library. | |
345 compile_d_files(${package}_dobjs objects ${d_sources}) | |
346 set(d_objs ${d_objs} ${objects}) | |
347 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | |
348 set_property(TARGET cpp_${package} PROPERTY RUNTIME_OUTPUT_DIRECTORY lib) | |
349 set_property(TARGET cpp_${package} PROPERTY ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles) | |
350 target_link_libraries(cpp_${package} ${link_cpp} ) | |
351 set(cpp_lib ${CMAKE_BINARY_DIR}/lib/libcpp_${package}.dll) | |
352 set(cpp_lib_native ${cpp_lib}) | |
353 make_native_path(cpp_lib_native) | |
354 set(d_implib ${CMAKE_BINARY_DIR}/CMakeFiles/${package}.dir/cpp_${package}.lib) | |
355 set(d_implib_native ${d_implib}) | |
356 make_native_path(d_implib_native) | |
357 add_custom_command( | |
358 OUTPUT "${d_implib}" | |
359 COMMAND "${IMPLIB}" | |
360 ARGS /system /PAGESIZE:32 ${d_implib_native} ${cpp_lib_native} | |
361 DEPENDS "cpp_${package}" | |
362 COMMENT "Creating implib ${lib_name}" | |
363 ) | |
364 add_custom_command( | |
365 OUTPUT "${lib_name}" | |
366 COMMAND "${DC}" | |
367 ARGS -lib ${d_objs} ${d_implib} -oflib/${lib_name} | |
368 DEPENDS ${d_objs} ${d_implib} | |
369 COMMENT "Linking ${lib_name}" | |
370 ) | |
371 else(${CMAKE_SYSTEM_NAME} STREQUAL Linux) | |
372 set_property(TARGET cpp_${package} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles) | |
373 foreach(cpp_source ${cpp_sources}) | |
374 set(cpp_source ${cpp_source}) | |
375 obj_path(cpp_source) | |
376 set(cpp_objs ${cpp_objs} CMakeFiles/cpp_${package}.dir/${cpp_source}.o) | |
377 endforeach(cpp_source) | |
378 add_custom_command( | |
379 OUTPUT "${lib_name}" | |
380 COMMAND "${CMAKE_AR}" | |
381 ARGS rcs lib/${lib_name} ${d_objs} ${cpp_objs} | |
382 DEPENDS ${d_objs} cpp_${package} | |
383 COMMENT "Linking ${lib_name}" | |
384 ) | |
385 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | |
386 | |
387 ## Dependences. | |
388 add_dependencies(cpp_${package} dgen) | |
389 add_custom_target(${package} DEPENDS ${lib_name}) | |
390 foreach(depend ${depends}) | |
391 add_dependencies(cpp_${package} cpp_${depend}) | |
392 add_dependencies(${package} ${depend}) | |
393 endforeach(depend ${depends}) | |
394 add_dependencies(allpackages ${package}) | |
395 set(depends ${depends} ${package}) | |
396 | |
397 ## Paths for QtD libs. Needed by examples. | |
398 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows AND D_IS_MARS) | |
399 set(libs_path ${CMAKE_BINARY_DIR}/lib/qtd${package}.lib) | |
400 make_native_path(libs_path) | |
401 set(${package}_lib_param -L+${libs_path}) | |
402 foreach(link ${link_example}) | |
403 set(link ${CMAKE_SOURCE_DIR}/lib/${link}.lib) | |
404 make_native_path(link) | |
405 set(link -L+${link}) | |
406 set(${package}_lib_param ${${package}_lib_param} ${link}) | |
407 endforeach(link ${link_example}) | |
408 else (${CMAKE_SYSTEM_NAME} STREQUAL Windows AND D_IS_MARS) | |
409 set(${package}_lib_param -L-lqtd${package} -L-lQt${package_big}) | |
410 foreach(link ${link_example}) | |
411 set(${package}_lib_param ${${package}_lib_param} ${link}) | |
412 endforeach(link ${link_example}) | |
413 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows AND D_IS_MARS) | |
414 endforeach(package_big ${packages_big}) | |
415 | |
416 ##-------------------------------------------- | |
417 ## Build other parts of the QtD. | |
418 ##-------------------------------------------- | |
419 if(BUILD_EXAMPLES) | |
379 add_subdirectory(demos) | 420 add_subdirectory(demos) |
380 add_subdirectory(examples) | 421 add_subdirectory(examples) |
381 endif(BUILD_QT_OPENGL) | 422 endif(BUILD_EXAMPLES) |