Mercurial > projects > qtd
comparison CMakeLists.txt @ 4:0a29ce1ae854
CMake build script.
Small fixes in examples.
author | SokoL_SD |
---|---|
date | Wed, 13 May 2009 19:01:55 +0000 |
parents | e78566595089 |
children | 834feae7809b |
comparison
equal
deleted
inserted
replaced
3:323efbe5c2f7 | 4:0a29ce1ae854 |
---|---|
1 cmake_minimum_required(VERSION 2.6) | |
1 PROJECT(qtd CXX C) | 2 PROJECT(qtd CXX C) |
2 cmake_minimum_required(VERSION 2.6) | |
3 FIND_PACKAGE(Qt4 REQUIRED) | 3 FIND_PACKAGE(Qt4 REQUIRED) |
4 # Using Tango | |
5 | |
6 #set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules/cmaked) | |
7 #set(CMAKE_D_USE_TANGO True) | |
8 | 4 |
9 include_directories(${QT_INCLUDES} include) | 5 include_directories(${QT_INCLUDES} include) |
10 | 6 |
11 IF(CMAKE_HOST_WIN32) | 7 option(BUILD_QT_OPENGL "Build QtOpenGL" "ON") |
12 INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/cpp/qt_core/local.cmake) | 8 option(BUILD_EXAMPLES "Build examples" "ON") |
13 INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/cpp/qt_gui/local.cmake) | 9 |
14 INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/cpp/qt_opengl/local.cmake) | 10 set(PACKAGES Core Gui) |
15 # INCLUDE(${CMAKE_CURRENT_SOURCE_DIR}/cpp/qt_qtd/local.cmake) | 11 if(BUILD_QT_OPENGL) |
16 ADD_LIBRARY(qtd_cpp SHARED ${QT_QTD_SRCS} ${QT_CORE_SRCS} ${QT_GUI_SRCS}) | 12 set(PACKAGES ${PACKAGES} OpenGL) |
17 TARGET_LINK_LIBRARIES( qtd_cpp ${QT_LIBRARIES} ) | 13 endif(BUILD_QT_OPENGL) |
18 ELSE(CMAKE_HOST_WIN32) | 14 |
19 ADD_SUBDIRECTORY(cpp/qt_core bin) | 15 set(packages_big ${PACKAGES}) |
20 ADD_SUBDIRECTORY(cpp/qt_gui bin) | 16 set(packages) |
21 ADD_SUBDIRECTORY(cpp/qt_opengl bin) | 17 foreach(package ${packages_big}) |
22 ADD_SUBDIRECTORY(cpp/qt_qtd bin) | 18 string(TOLOWER ${package} package) |
23 ENDIF(CMAKE_HOST_WIN32) | 19 set(packages ${packages} ${package}) |
24 | 20 endforeach(package ${packages_big}) |
25 #ADD_SUBDIRECTORY(qt bin) | 21 |
26 | 22 #set(CMAKE_LIBRARY_OUTPUT_DIRECTORY CMakeFiles) |
23 | |
24 find_program(DC dmd ldc) | |
25 ## Parsing D compiler version. | |
26 if (DC) | |
27 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}") | |
29 if (dmd_version) | |
30 set(D_IS_MARS true) | |
31 set(D_COMPILER_NAME "Digital Mars D Compiler") | |
32 string(REGEX REPLACE "Digital Mars D Compiler v([0-9])\\.[0-9]+" "\\1" D_VERSION "${dmd_version}") | |
33 string(REGEX REPLACE "Digital Mars D Compiler v[0-9]\\.([0-9]+)" "\\1" D_FRONTEND "${dmd_version}") | |
34 else (dmd_version) | |
35 string(REGEX MATCH "LLVM-based D Compiler" is_ldc "${d_output}") | |
36 if (is_ldc) | |
37 exec_program(${DC} ARGS "--version" OUTPUT_VARIABLE d_output) | |
38 string(REGEX MATCH "based on DMD v[0-9]\\.[0-9]+ and llvm [0-9]\\.[0-9]+" ldc_version "${d_output}") | |
39 set(D_IS_LLVM true) | |
40 if(ldc_version) | |
41 set(D_IS_LLVM true) | |
42 set(D_COMPILER_NAME "LLVM-based D Compiler") | |
43 string(REGEX REPLACE "based on DMD v([0-9])\\.[0-9]+ and llvm [0-9]\\.[0-9]+" "\\1" D_VERSION "${ldc_version}") | |
44 string(REGEX REPLACE "based on DMD v[0-9]\\.([0-9]+) and llvm [0-9]\\.[0-9]+" "\\1" D_FRONTEND "${ldc_version}") | |
45 else(ldc_version) | |
46 message(FATAL_ERROR "LDC compiler was found, but the version can not be processed") | |
47 endif(ldc_version) | |
48 else (is_ldc) | |
49 message(FATAL_ERROR "D compliler not founded") | |
50 endif(is_ldc) | |
51 endif(dmd_version) | |
52 message(STATUS "D compiler founded -- ${D_COMPILER_NAME} v${D_VERSION}.${D_FRONTEND}") | |
53 else (DC) | |
54 message(FATAL_ERROR "D compliler not founded") | |
55 endif (DC) | |
56 | |
57 # Check D compiler version | |
58 if(D_VERSION EQUAL "1") | |
59 if (D_FRONTEND LESS "041") | |
60 message(STATUS "Minimum required version of D compiler is 1.041 (or compiler based on this version)") | |
61 endif(D_FRONTEND LESS "041") | |
62 set(D_TARGET d1-tango) | |
63 elseif(D_VERSION EQUAL "2") | |
64 set(D_TARGET ) ## TODO: hm... I don`t known this parameter for D2 ^( | |
65 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 | |
73 # Debug and release flags. | |
74 if (${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG]) | |
75 #set(CMAKE_BUILD_TYPE Debug) | |
76 #set( SUFFIXLIB "${SUFFIXLIB}-debug" ) | |
77 #set( SUFFIXBIN "${SUFFIXBIN}-debug" ) | |
78 add_definitions(-DDEBUG) | |
79 set(D_FLAGS -g -gc -debug) | |
80 else (${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG]) | |
81 #set(CMAKE_BUILD_TYPE Release) | |
82 add_definitions(-UNO_DEBUG) | |
83 set(D_FLAGS -O -release -inline) | |
84 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | |
85 set(D_FLAGS ${D_FLAGS} -L/subsystem:windows) | |
86 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | |
87 endif (${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG]) | |
88 set(D_FLAGS ${D_FLAGS} -I${CMAKE_BINARY_DIR} -I${CMAKE_SOURCE_DIR}) | |
89 | |
90 MACRO(MAKE_WINDOWS_PATH pathname) | |
91 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | |
92 # An extra \\ escape is necessary to get a \ through CMake's processing. | |
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 | |
100 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | |
101 set(implib implib) | |
102 find_program(IMPLIB ${implib}) | |
103 if (NOT IMPLIB) | |
104 message(FATAL_ERROR "implib not found. You can donwload it from http://ftp.digitalmars.com/bup.zip") | |
105 endif (NOT IMPLIB) | |
106 set(D_OBJECT_SUFFIX .obj) | |
107 if(D_IS_MARS) | |
108 set(D_LIB_SUFFIX .lib) | |
109 set(D_LIB_PREFIX ) | |
110 elseif(D_IS_LDC) | |
111 set(D_LIB_SUFFIX .a) | |
112 set(D_LIB_PREFIX lib) | |
113 endif(D_IS_MARS) | |
114 set(GEN_OPT ${GEN_OPT} --cpp_shared) | |
115 add_definitions(-DCPP_SHARED) | |
116 elseif(${CMAKE_SYSTEM_NAME} STREQUAL Linux) | |
117 set(D_LIB_SUFFIX .a) | |
118 set(D_LIB_PREFIX lib) | |
119 set(D_OBJECT_SUFFIX .o) | |
120 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows) | |
121 | |
122 set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./) | |
123 set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET}) | |
124 | |
125 add_subdirectory(generator) | |
126 | |
127 macro(OBJ_PATH path) | |
128 unset(test) | |
129 string(REGEX MATCH "${CMAKE_CURRENT_BINARY_DIR}/.*" test "${${path}}") | |
130 if(NOT ${test} EQUAL "") | |
131 string(LENGTH "${CMAKE_CURRENT_BINARY_DIR}" first) | |
132 string(LENGTH "${${path}}" last) | |
133 math(EXPR first "${first} + 1") | |
134 math(EXPR len "${last} - ${first}") | |
135 string(SUBSTRING "${${path}}" ${first} ${len} ${path}) | |
136 else(NOT ${test} EQUAL "") | |
137 string(REGEX MATCH "${CMAKE_CURRENT_SOURCE_DIR}/.*" test "${${path}}") | |
138 if(NOT ${test} EQUAL "") | |
139 string(LENGTH "${CMAKE_CURRENT_SOURCE_DIR}" first) | |
140 string(LENGTH "${${path}}" last) | |
141 math(EXPR first "${first} + 1") | |
142 math(EXPR len "${last} - ${first}") | |
143 string(SUBSTRING "${${path}}" ${first} ${len} ${path}) | |
144 endif(NOT ${test} EQUAL "") | |
145 endif(NOT ${test} EQUAL "") | |
146 endmacro(OBJ_PATH) | |
147 | |
148 macro(compile_d_files target objects_list) | |
149 unset(${objects_list}) | |
150 set(tmp_dir ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${target}.dir) | |
151 file(MAKE_DIRECTORY ${tmp_dir}) | |
152 if(${SEPARETLY_D_OBJECTS}) | |
153 foreach (d_source ${ARGN}) | |
154 OBJ_PATH(d_source) | |
155 set(d_obj ${tmp_dir}/${d_source}${D_OBJECT_SUFFIX}) | |
156 set(${objects_list} ${${objects_list} ${d_obj}) | |
157 get_filename_component(path ${d_obj} PATH) | |
158 file(MAKE_DIRECTORY ${path}) | |
159 set(d_obj_out ${d_obj}) | |
160 OBJ_PATH(d_obj_out) | |
161 add_custom_command(OUTPUT "${d_obj}" | |
162 COMMAND "${DC}" | |
163 ARGS ${D_FLAGS} -c ${d_source} -of${d_obj} | |
164 COMMENT "Building ${d_obj_out}" | |
165 DEPENDS ${d_source} | |
166 ) | |
167 endforeach(d_source) | |
168 else(${SEPARETLY_D_OBJECTS}) | |
169 set(${objects_list} ${tmp_dir}/${target}${D_OBJECT_SUFFIX}) | |
170 set(d_obj_out ${${objects_list}}) | |
171 OBJ_PATH(d_obj_out) | |
172 set(parameters_list_file ${tmp_dir}/parameters) | |
173 SET (parameters ${D_FLAGS} -c ${ARGN} -of${${objects_list}}) | |
174 FILE (REMOVE ${parameters_list_file}) | |
175 FOREACH(arg ${parameters}) | |
176 FILE (APPEND ${parameters_list_file} "${arg}\n") | |
177 ENDFOREACH(arg) | |
178 add_custom_command(OUTPUT "${${objects_list}}" | |
179 COMMAND "${DC}" | |
180 ARGS @${parameters_list_file} | |
181 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | |
182 DEPENDS ${ARGN} | |
183 COMMENT "" | |
184 ) | |
185 endif(${SEPARETLY_D_OBJECTS}) | |
186 endmacro(compile_d_files objects_list) | |
187 | |
188 file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/lib) | |
189 add_custom_target(allpackages ALL) | |
190 | |
191 link_directories(${CMAKE_BINARY_DIR}/CMakeFiles) | |
192 | |
193 foreach(package ${packages}) | |
194 unset(d_objs) | |
195 unset(cpp_objs) | |
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) | |
318 unset(is_sources) | |
319 unset(is_libs) | |
320 set(qtd_libs ${core_lib_param} ${gui_lib_param}) | |
321 foreach(param ${ARGN}) | |
322 if(is_libs) | |
323 string(REGEX REPLACE "Qt([A-Za-z0-9])" "\\1" param_package "${param}") | |
324 if(${param_package} STREQUAL ${param}) | |
325 unset(is_libs) | |
326 set(is_sources 1) | |
327 else(${param_package} STREQUAL ${param}) | |
328 unset(is_founded) | |
329 foreach(package_big ${packages_big}) | |
330 string(TOLOWER ${package_big} package) | |
331 if(${param_package} STREQUAL ${package_big}) | |
332 set(qtd_libs ${qtd_libs} ${${package}_lib_param}) | |
333 set(is_founded 1) | |
334 break(package_big ${packages_big}) | |
335 endif(${param_package} STREQUAL ${package_big}) | |
336 endforeach(package_big ${packages_big}) | |
337 if(NOT is_founded) | |
338 message(STATUS "Module ${param_package} not founded for example ${name}") | |
339 return(build_example name) | |
340 endif(NOT is_founded) | |
341 endif(${param_package} STREQUAL ${param}) | |
342 endif(is_libs) | |
343 if(NOT is_libs) | |
344 if(NOT is_sources) | |
345 if(${param} STREQUAL PACKAGES) | |
346 set(is_libs 1) | |
347 set(qtd_libs) | |
348 else(${param} STREQUAL PACKAGES) | |
349 set(is_sources 1) | |
350 endif(${param} STREQUAL PACKAGES) | |
351 endif(NOT is_sources) | |
352 if(is_sources) | |
353 set(sources ${sources} ${param}) | |
354 endif(is_sources) | |
355 endif(NOT is_libs) | |
356 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} ) | |
363 set(output ${CMAKE_CURRENT_BINARY_DIR}/${name}${CMAKE_EXECUTABLE_SUFFIX}) | |
364 set(output_native ${output}) | |
365 make_windows_path(output_native) | |
366 add_custom_command(OUTPUT "${output}" | |
367 COMMAND "${DC}" | |
368 ARGS ${D_FLAGS} ${libs_path} ${qtd_libs} ${objects} | |
369 -of${output_native} | |
370 DEPENDS ${objects} | |
371 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | |
372 COMMENT "Building example ${name}" | |
373 ) | |
374 add_custom_target(example_${name} ALL DEPENDS "${output}") | |
375 add_dependencies(example_${name} allpackages) | |
376 endmacro(build_example sources) | |
377 | |
378 if(BUILD_QT_OPENGL) | |
379 add_subdirectory(demos) | |
380 add_subdirectory(examples) | |
381 endif(BUILD_QT_OPENGL) |