comparison CMakeLists.txt @ 132:a860544c5ee8

CMake: initial version of CMakeD script. CMake: MSVC fixes (not work yet). CMake: add experimental option BUILD_SHARED_LIBRARIES.
author SokoL_SD
date Sun, 07 Jun 2009 14:31:36 +0000
parents 138753025375
children eba71ddf864a
comparison
equal deleted inserted replaced
131:6d5eeec1d9a1 132:a860544c5ee8
8 8
9 include_directories(${QT_INCLUDES} include ${CMAKE_CURRENT_BINARY_DIR}/include) 9 include_directories(${QT_INCLUDES} include ${CMAKE_CURRENT_BINARY_DIR}/include)
10 10
11 ## Options. 11 ## Options.
12 option(BUILD_EXAMPLES "Build examples" "ON") 12 option(BUILD_EXAMPLES "Build examples" "ON")
13 option(BUILD_SHARED_LIBRARIES "Build shared library (very experemental and only for ldc)" "OFF")
13 option(BUILD_TOOLS "Build tools" "ON") 14 option(BUILD_TOOLS "Build tools" "ON")
14 option(GENERATE_DI_FILES "Generate *.di files with DC -H command" "OFF") 15 #option(GENERATE_DI_FILES "Generate *.di files with DC -H command" "OFF")
15 16 set(GENERATE_DI_FILES OFF) ## Very experemental option. Temporary disabled.
16 set(all_packages Core Gui OpenGL Xml Svg Network WebKit) ## TODO: Loading. 17
17 18 set(QTD_VERSION_STR ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH})
19 math(EXPR QTD_VERSION "(${QT_VERSION_MAJOR} << 16) + (${QT_VERSION_MINOR} << 8) + ${QT_VERSION_PATCH}")
20 configure_file(qt/QGlobal.d.inc qt/QGlobal.d)
21
22 set(all_packages Core Gui OpenGL Xml Svg Network WebKit)
23
24 ## Init D toolkit.
25 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
26 FIND_PACKAGE(D REQUIRED)
18 27
19 ## Strip utility. 28 ## Strip utility.
20 find_program(STRIP strip) 29 find_program(STRIP strip)
21 30
22 ## Find D compiler and parsing its version.
23
24 find_program(DC dmd ldc)
25 if (DC)
26 get_filename_component(dc_path ${DC} PATH)
27 if("${dc_path}" STREQUAL ${CMAKE_BINARY_DIR})
28 get_filename_component(DC ${DC} NAME)
29 endif("${dc_path}" STREQUAL ${CMAKE_BINARY_DIR})
30 exec_program(${DC} ARGS "" OUTPUT_VARIABLE d_output)
31 string(REGEX MATCH "Digital Mars D Compiler v[0-9]\\.[0-9]+" dmd_version "${d_output}")
32 if (dmd_version)
33 set(D_IS_MARS true)
34 set(D_IS_DMD true)
35 set(D_COMPILER_NAME "Digital Mars D Compiler")
36 string(REGEX REPLACE "Digital Mars D Compiler v([0-9])\\.[0-9]+" "\\1" D_VERSION "${dmd_version}")
37 string(REGEX REPLACE "Digital Mars D Compiler v[0-9]\\.([0-9]+)" "\\1" D_FRONTEND "${dmd_version}")
38 else (dmd_version)
39 string(REGEX MATCH "LLVM-based D Compiler" is_ldc "${d_output}")
40 if (is_ldc)
41 exec_program(${DC} ARGS "--version" OUTPUT_VARIABLE d_output)
42 string(REGEX MATCH "based on DMD v[0-9]\\.[0-9]+" ldc_version "${d_output}")
43 set(D_IS_LLVM true)
44 set(D_IS_LDC true)
45 if(ldc_version)
46 set(D_IS_LLVM true)
47 set(D_COMPILER_NAME "LLVM-based D Compiler")
48 string(REGEX REPLACE "based on DMD v([0-9])\\.[0-9]+" "\\1" D_VERSION "${ldc_version}")
49 string(REGEX REPLACE "based on DMD v[0-9]\\.([0-9]+)" "\\1" D_FRONTEND "${ldc_version}")
50 else(ldc_version)
51 message(FATAL_ERROR "LDC compiler was found, but the version can not be processed")
52 endif(ldc_version)
53 else (is_ldc)
54 message(FATAL_ERROR "D compliler not found")
55 endif(is_ldc)
56 endif(dmd_version)
57 message(STATUS "D compiler found -- ${D_COMPILER_NAME} v${D_VERSION}.${D_FRONTEND}")
58 else (DC)
59 message(FATAL_ERROR "D compliler not found")
60 endif (DC)
61
62 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR "${CMAKE_INSTALL_PREFIX}" STREQUAL "") 31 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR "${CMAKE_INSTALL_PREFIX}" STREQUAL "")
63 get_filename_component(dc_path ${DC} PATH)
64 if("${dc_path}" STREQUAL "")
65 find_program(dc_path_tmp ${DC})
66 get_filename_component(dc_path ${dc_path_tmp} PATH)
67 mark_as_advanced(dc_path_tmp)
68 endif("${dc_path}" STREQUAL "")
69 get_filename_component(dc_parent_dir ${dc_path} NAME)
70 if("${dc_parent_dir}" STREQUAL "bin")
71 get_filename_component(dc_path ${dc_path} PATH)
72 endif("${dc_parent_dir}" STREQUAL "bin")
73 set(CMAKE_INSTALL_PREFIX 32 set(CMAKE_INSTALL_PREFIX
74 ${dc_path} CACHE PATH "QtD install prefix" FORCE 33 ${DC_PATH} CACHE PATH "QtD install prefix" FORCE
75 ) 34 )
76 endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR "${CMAKE_INSTALL_PREFIX}" STREQUAL "") 35 endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR "${CMAKE_INSTALL_PREFIX}" STREQUAL "")
77
78 ## TODO: disable this option for ldc < rev. 1433.
79 if(D_IS_MARS)
80 option(SINGLE_D_OBJECT "Build all d sources to one object file" "ON")
81 elseif(D_IS_LLVM)
82 option(SINGLE_D_OBJECT "Build all d sources to one object file" "OFF")
83 endif(D_IS_MARS)
84
85 if(SINGLE_D_OBJECT AND D_IS_LLVM)
86 set(D_FLAGS ${D_FLAGS} -singleobj)
87 endif(SINGLE_D_OBJECT AND D_IS_LLVM)
88 36
89 # Check D compiler version 37 # Check D compiler version
90 if(D_VERSION EQUAL "1") 38 if(D_VERSION EQUAL "1")
91 if (D_FRONTEND LESS "041") 39 if (D_FRONTEND LESS "041")
92 message(STATUS "Minimum required version of D compiler is 1.041 (or compiler based on this version)") 40 message(STATUS "Minimum required version of D compiler is 1.041 (or compiler based on this version)")
93 endif(D_FRONTEND LESS "041") 41 endif(D_FRONTEND LESS "041")
94 set(D_TARGET d1-tango) 42 set(D_TARGET d1-tango)
95 elseif(D_VERSION EQUAL "2") 43 elseif(D_VERSION EQUAL "2")
96 set(D_TARGET ) ## TODO: hm... I don`t known this parameter for D2 ^( 44 set(D_TARGET ) ## TODO: hm... I don`t known this parameter for D2 ^(
97 endif(D_VERSION EQUAL "1") 45 endif(D_VERSION EQUAL "1")
98 set(D_FLAGS ${D_FLAGS} -I${CMAKE_SOURCE_DIR}/qt/d${D_VERSION})
99 46
100 # Debug and release flags. 47 # Debug and release flags.
101 if (NOT CMAKE_BUILD_TYPE) 48 if (NOT CMAKE_BUILD_TYPE)
102 set(CMAKE_BUILD_TYPE Release) 49 set(CMAKE_BUILD_TYPE Release)
103 endif (NOT CMAKE_BUILD_TYPE) 50 endif (NOT CMAKE_BUILD_TYPE)
104 if(${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG]) 51 if(${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG])
105 set(CMAKE_BUILD_TYPE Debug) 52 set(CMAKE_BUILD_TYPE Debug)
106 #set( SUFFIXLIB "${SUFFIXLIB}-debug" ) 53 #set( SUFFIXLIB "${SUFFIXLIB}-debug" )
107 #set( SUFFIXBIN "${SUFFIXBIN}-debug" ) 54 #set( SUFFIXBIN "${SUFFIXBIN}-debug" )
108 add_definitions(-DDEBUG) 55 add_definitions(-DDEBUG)
109 set(D_FLAGS ${D_FLAGS} -g -gc -debug)
110 elseif (NOT ${CMAKE_BUILD_TYPE} MATCHES [rR][eE][lL][eE][aA][sS]) 56 elseif (NOT ${CMAKE_BUILD_TYPE} MATCHES [rR][eE][lL][eE][aA][sS])
111 message(STATUS "Only debug and release configuration are now supproted. Configuration changed to 'Release'") 57 message(STATUS "Only debug and release configurations are supproted now. Configuration will change to 'Release'")
112 set(CMAKE_BUILD_TYPE Release) 58 set(CMAKE_BUILD_TYPE Release)
113 endif (${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG]) 59 endif (${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG])
114 if (${CMAKE_BUILD_TYPE} MATCHES [rR][eE][lL][eE][aA][sS]) 60 if (${CMAKE_BUILD_TYPE} MATCHES [rR][eE][lL][eE][aA][sS])
115 #add_definitions(-UNO_DEBUG) 61 #add_definitions(-UNO_DEBUG)
116 set(D_FLAGS ${D_FLAGS} -O -release)
117 if(D_IS_MARS)
118 set(D_FLAGS ${D_FLAGS} -inline)
119 elseif(D_IS_LLVM)
120 set(D_FLAGS ${D_FLAGS} -enable-inlining)
121 endif(D_IS_MARS)
122 if(CMAKE_HOST_WIN32)
123 set(D_FLAGS ${D_FLAGS} -L/subsystem:windows)
124 endif(CMAKE_HOST_WIN32)
125 endif(${CMAKE_BUILD_TYPE} MATCHES [rR][eE][lL][eE][aA][sS] ) 62 endif(${CMAKE_BUILD_TYPE} MATCHES [rR][eE][lL][eE][aA][sS] )
126
127 set(D_FLAGS ${D_FLAGS} -I${CMAKE_BINARY_DIR} -I${CMAKE_SOURCE_DIR})
128 if(D_IS_MARS AND CMAKE_HOST_WIN32)
129 else(D_IS_MARS AND CMAKE_HOST_WIN32)
130 set(D_FLAGS ${D_FLAGS} -L-L${CMAKE_BINARY_DIR}/lib)
131 endif(D_IS_MARS AND CMAKE_HOST_WIN32)
132 63
133 # System specifc settings. 64 # System specifc settings.
134 if(CMAKE_HOST_WIN32) 65 if(CMAKE_HOST_WIN32)
135 set(implib implib) 66 set(implib implib)
136 find_program(IMPLIB ${implib}) 67 find_program(IMPLIB ${implib})
137 if (NOT IMPLIB) 68 if (NOT IMPLIB)
138 message(FATAL_ERROR "implib not found. You can donwload it from http://ftp.digitalmars.com/bup.zip") 69 message(FATAL_ERROR "implib not found. You can donwload it from http://ftp.digitalmars.com/bup.zip")
139 endif (NOT IMPLIB) 70 endif (NOT IMPLIB)
140 set(D_OBJECT_SUFFIX .obj)
141 if(D_IS_MARS) 71 if(D_IS_MARS)
142 set(D_LIB_SUFFIX .lib)
143 set(D_LIB_PREFIX )
144 set(D_FLAGS ${D_FLAGS} -version=cpp_shared) 72 set(D_FLAGS ${D_FLAGS} -version=cpp_shared)
145 set(GEN_OPT ${GEN_OPT} --cpp_shared) 73 set(GEN_OPT ${GEN_OPT} --cpp_shared)
146 add_definitions(-DCPP_SHARED) 74 add_definitions(-DCPP_SHARED)
147 elseif(D_IS_LDC)
148 set(D_LIB_SUFFIX .a)
149 set(D_LIB_PREFIX lib)
150 endif(D_IS_MARS) 75 endif(D_IS_MARS)
151 string(REGEX REPLACE ".dll([A-Za-z\\.0-9]+)" "\\1" CMAKE_IMPORT_LIBRARY_SUFFIX "${CMAKE_IMPORT_LIBRARY_SUFFIX}") 76 string(REGEX REPLACE ".dll([A-Za-z\\.0-9]+)" "\\1" CMAKE_IMPORT_LIBRARY_SUFFIX "${CMAKE_IMPORT_LIBRARY_SUFFIX}")
152 elseif(CMAKE_HOST_UNIX)
153 set(D_LIB_SUFFIX .a)
154 set(D_LIB_PREFIX lib)
155 set(D_OBJECT_SUFFIX .o)
156 endif(CMAKE_HOST_WIN32) 77 endif(CMAKE_HOST_WIN32)
157 78
158 set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./) 79 set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./)
159 set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET}) 80 set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET})
160 81
161 ## Bootstrap settings for tools. 82 ## Bootstrap settings for QtD.
162 set(DRCC ${CMAKE_BINARY_DIR}/tools/drcc/drcc) 83 set(DRCC ${CMAKE_BINARY_DIR}/tools/drcc/drcc)
84 set(QTD_IMPORT_PATH ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/qt/d${D_VERSION})
85 set(QTD_LIBRARIES_PATH ${CMAKE_BINARY_DIR}/lib)
163 86
164 ##-------------------------------------------- 87 ##--------------------------------------------
165 ## Macroses and functions. 88 ## Macroses and functions.
166 ##-------------------------------------------- 89 ##--------------------------------------------
167
168 ## Make native path.
169 ## Usage:
170 ## set(path c:/file_path/file_name.cpp)
171 ## make_native_path(path)
172 ## message(STATUS ${path})
173 ## Output:
174 ## -- "c:\file_path\file_name.cpp"
175 ## Command "file(TO_NATIVE_PATH ...)" is wrong on Windows
176 macro(MAKE_NATIVE_PATH pathname)
177 if(CMAKE_HOST_WIN32)
178 # An extra \\ escape is necessary to get a \ through CMake's processing.
179 string(REPLACE "/" "\\" ${pathname} "${${pathname}}")
180 # Enclose with UNESCAPED quotes. This means we need to escape our
181 # quotes once here, i.e. with \"
182 set(${pathname} \"${${pathname}}\")
183 endif(CMAKE_HOST_WIN32)
184 endmacro(MAKE_NATIVE_PATH)
185
186 ##
187 ## Example:
188 ## set(path 24.3+23.bin)
189 ## obj_path(path)
190 ## message(STATUS ${path})
191 ## Example output:
192 ## -- 24\.3\+23\.bin
193 macro(regex_safe_string outvariable)
194 set(${outvariable} ${ARGN})
195 set(__regex_chars__ ^ $ . ] [ - * + ? | \( \))
196 foreach(__regex_char__ ${__regex_chars__})
197 string(REPLACE "${__regex_char__}"
198 "\\${__regex_char__}" ${outvariable} ${${outvariable}}
199 )
200 endforeach(__regex_char__ ${__regex_chars__})
201 endmacro(regex_safe_string outvariable)
202
203 ## Remove unnecessary path to the object file.
204 ## path -- path to object file.
205 ## Example:
206 ## set(path ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/target.dir/main.d.obj)
207 ## obj_path(path)
208 ## message(STATUS ${path})
209 ## Example output:
210 ## -- CMakeFiles/target.dir/main.d.obj
211 macro(OBJ_PATH path)
212 regex_safe_string(__cbd_safe__ ${CMAKE_CURRENT_BINARY_DIR})
213 regex_safe_string(__csd_safe__ ${CMAKE_CURRENT_SOURCE_DIR})
214 set(regexp_str "(${__cbd_safe__}/|${__csd_safe__}/|)(.+)")
215 string(REGEX REPLACE ${regexp_str} "\\2" ${path} "${${path}}")
216 endmacro(OBJ_PATH)
217
218 ## Compile d files.
219 ## target -- name of a new target.
220 ## objects_list -- created object files.
221 ## params -- sources files.
222 macro(compile_d_files target objects_list)
223 set(${objects_list})
224 set(tmp_dir ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${target}.dir)
225 file(MAKE_DIRECTORY ${tmp_dir})
226 if(NOT SINGLE_D_OBJECT)
227 foreach (d_source_p ${ARGN})
228 ## TODO: why find_file command work wrong?
229 find_file(d_source_p ${d_source_p} PATHS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
230 ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR})
231 set (d_source ${d_source_p})
232 obj_path(d_source)
233 set(d_obj ${tmp_dir}/${d_source}${D_OBJECT_SUFFIX})
234 set(${objects_list} ${${objects_list}} ${d_obj})
235 get_filename_component(path ${d_obj} PATH)
236 file(MAKE_DIRECTORY ${path})
237 set(d_obj_out ${d_obj})
238 obj_path(d_obj_out)
239 add_custom_command(OUTPUT "${d_obj}"
240 COMMAND "${DC}"
241 ARGS ${D_FLAGS} -c ${d_source_p} -of${d_obj}
242 COMMENT "Building ${d_obj_out}"
243 DEPENDS ${d_source_p}
244 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
245 )
246 endforeach(d_source_p)
247 else(NOT SINGLE_D_OBJECT)
248 set(${objects_list} ${tmp_dir}/${target}${D_OBJECT_SUFFIX})
249 set(d_obj_out ${${objects_list}})
250 obj_path(d_obj_out)
251 set(parameters ${D_FLAGS} -c ${ARGN} -of${${objects_list}})
252 set(parameters_list_file ${tmp_dir}/parameters)
253 if(CMAKE_HOST_WIN32)
254 file(REMOVE ${parameters_list_file})
255 foreach(arg ${parameters})
256 file(APPEND ${parameters_list_file} "${arg}\n")
257 endforeach(arg)
258 set(param @${parameters_list_file})
259 elseif(CMAKE_HOST_UNIX)
260 set(param ${parameters})
261 endif(CMAKE_HOST_WIN32)
262 add_custom_command(OUTPUT "${${objects_list}}"
263 COMMAND "${DC}"
264 ARGS ${param}
265 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
266 DEPENDS ${ARGN}
267 COMMENT ""
268 )
269 endif(NOT SINGLE_D_OBJECT)
270 add_custom_target(${target} DEPENDS "${${objects_list}}")
271 endmacro(compile_d_files objects_list)
272 90
273 macro(qtd_add_resource name output) 91 macro(qtd_add_resource name output)
274 set(${output}) 92 set(${output})
275 foreach(res "${ARGN}") 93 foreach(res "${ARGN}")
276 ## Test input file exists. 94 ## Test input file exists.
322 endif(NOT founded_type_dat) 140 endif(NOT founded_type_dat)
323 endforeach(arg_dat ${ARGN}) 141 endforeach(arg_dat ${ARGN})
324 if(NOT PACKAGES) 142 if(NOT PACKAGES)
325 set(PACKAGES QtCore QtGui) 143 set(PACKAGES QtCore QtGui)
326 endif(NOT PACKAGES) 144 endif(NOT PACKAGES)
327 ## TODO: Tools building is acitve??? 145 ## TODO: Is the building tools activated ???
328 if(RESOURCES) 146 if(RESOURCES)
329 if(NOT BUILD_TOOLS) 147 if(NOT BUILD_TOOLS)
330 message(STATUS "Example '${name}' required drcc. Example will not build") 148 message(STATUS "Example '${name}' required drcc. Example will not build")
331 return(build_example name) 149 return(build_example name)
332 endif(NOT BUILD_TOOLS) 150 endif(NOT BUILD_TOOLS)
333 qtd_add_resource(${name} res_sources ${RESOURCES}) 151 qtd_add_resource(${name} res_sources ${RESOURCES})
334 endif(RESOURCES) 152 endif(RESOURCES)
335 compile_d_files(${name}_dobjs objects ${SOURCES} ${res_sources})
336 set(output ${CMAKE_CURRENT_BINARY_DIR}/${name}${CMAKE_EXECUTABLE_SUFFIX})
337 set(output_native ${output})
338 make_native_path(output_native)
339 foreach(package ${PACKAGES}) 153 foreach(package ${PACKAGES})
340 string(REGEX REPLACE "Qt([A-Za-z0-9])" "\\1" req "${package}") 154 string(REGEX REPLACE "Qt([A-Za-z0-9])" "\\1" req "${package}")
341 set(is_founded) 155 set(is_founded)
342 foreach(package_big ${packages_big}) 156 foreach(package_big ${packages_big})
343 string(TOLOWER ${package_big} package) 157 string(TOLOWER ${package_big} package)
351 return(build_example name) 165 return(build_example name)
352 else(NOT is_founded) 166 else(NOT is_founded)
353 set(qtd_libs ${${package}_lib_param} ${qtd_libs}) 167 set(qtd_libs ${${package}_lib_param} ${qtd_libs})
354 endif(NOT is_founded) 168 endif(NOT is_founded)
355 endforeach(package ${PACKAGES}) 169 endforeach(package ${PACKAGES})
356 add_custom_command(OUTPUT "${output}" 170 add_d_program(${name} ${SOURCES} ${res_sources} INCLUDES ${QTD_IMPORT_PATH} ${CMAKE_CURRENT_BINARY_DIR}
357 COMMAND "${DC}" 171 LIB_PATHS ${QTD_LIBRARIES_PATH} ${CMAKE_SOURCE_DIR}/lib LIBS ${qtd_libs})
358 ARGS ${D_FLAGS} ${libs_path} ${qtd_libs} ${objects}
359 -of${output_native}
360 DEPENDS ${objects}
361 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
362 COMMENT "Building example ${name}"
363 )
364 add_custom_target(example_${name} ALL DEPENDS "${output}")
365 ## TODO: Enable on windows too. 172 ## TODO: Enable on windows too.
366 if(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX) ## 173 if(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX) ##
367 add_custom_command(TARGET example_${name} POST_BUILD COMMAND "${STRIP}" ARGS "${output}") 174 add_custom_command(TARGET example_${name} POST_BUILD COMMAND "${STRIP}" ARGS "${output}")
368 endif(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX) 175 endif(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX)
369 add_dependencies(example_${name} allpackages) 176 add_dependencies(${name} allpackages)
370 endmacro(build_example sources) 177 endmacro(build_example sources)
371 178
372 ##-------------------------------------------- 179 ##--------------------------------------------
373 ## Build and install library. 180 ## Build and install library.
374 ##-------------------------------------------- 181 ##--------------------------------------------
429 ## TODO: cleanup. 236 ## TODO: cleanup.
430 if("${all_req_found}" EQUAL 1) 237 if("${all_req_found}" EQUAL 1)
431 set(packages_big ${packages_big} ${package_big}) 238 set(packages_big ${packages_big} ${package_big})
432 set(packages ${packages} ${package}) 239 set(packages ${packages} ${package})
433 ## Loading package sources list. 240 ## Loading package sources list.
434 foreach(d_source ${d_version_files})
435 set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/qt/d${D_VERSION}/qt/${d_source}.d)
436 if(NOT GENERATE_DI_FILES)
437 get_filename_component(path ${d_source}.d PATH)
438 get_filename_component(name ${d_source}.d NAME_WE)
439 install(FILES ${CMAKE_SOURCE_DIR}/qt/d${D_VERSION}/qt/${d_source}.d COMPONENT qtd DESTINATION include/d/qt/${path} RENAME ${name}.di)
440 install(FILES ${CMAKE_SOURCE_DIR}/qt/d${D_VERSION}/qt/${d_source}_enum.d COMPONENT qtd DESTINATION include/d/qt/${path} RENAME ${name}_enum.di OPTIONAL)
441 endif(NOT GENERATE_DI_FILES)
442 endforeach(d_source)
443 foreach(d_source ${d_files})
444 set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/qt/${d_source}.d)
445 if(NOT GENERATE_DI_FILES)
446 get_filename_component(path ${d_source}.d PATH)
447 get_filename_component(name ${d_source}.d NAME_WE)
448 install(FILES ${CMAKE_SOURCE_DIR}/qt/${d_source}.d DESTINATION include/d/qt/${path} COMPONENT qtd RENAME ${name}.di)
449 install(FILES ${CMAKE_SOURCE_DIR}/qt/${d_source}_enum.d DESTINATION include/d/qt/${path} COMPONENT qtd RENAME ${name}_enum.di OPTIONAL)
450 endif(NOT GENERATE_DI_FILES)
451 endforeach(d_source)
452 foreach(d_source ${d_generated_files}) 241 foreach(d_source ${d_generated_files})
453 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}.d) 242 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}.d)
454 if(NOT GENERATE_DI_FILES) 243 endforeach(d_source ${d_generated_files})
455 get_filename_component(path ${d_source}.d PATH)
456 get_filename_component(name ${d_source}.d NAME_WE)
457 install(FILES ${CMAKE_BINARY_DIR}/qt/${d_source}.d DESTINATION include/d/qt/${path} COMPONENT qtd RENAME ${name}.di)
458 install(FILES ${CMAKE_BINARY_DIR}/qt/${d_source}_enum.d DESTINATION include/d/qt/${path} COMPONENT qtd RENAME ${name}_enum.di OPTIONAL)
459 endif(NOT GENERATE_DI_FILES)
460 endforeach(d_source)
461 foreach (cpp_source ${cpp_files})
462 set(cpp_sources ${cpp_sources} ${CMAKE_SOURCE_DIR}/cpp/${cpp_source}.cpp)
463 endforeach(cpp_source)
464 set(classes ArrayOps ${classes}) 244 set(classes ArrayOps ${classes})
465 foreach(class ${classes}) 245 foreach(class ${classes})
466 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d) 246 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d)
467 set(cpp_sources ${cpp_sources} ${CMAKE_BINARY_DIR}/cpp/qt_${package}/${class}_shell.cpp) 247 set(cpp_sources ${cpp_sources} ${CMAKE_BINARY_DIR}/cpp/qt_${package}/${class}_shell.cpp)
468 set(files_for_gen ${files_for_gen} ${CMAKE_BINARY_DIR}/cpp/qt_${package}/${class}_shell.cpp 248 endforeach(class ${classes})
469 ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d) 249 set(files_for_gen ${files_for_gen} ${cpp_sources} ${d_sources})
470 if(NOT GENERATE_DI_FILES) 250
471 install(FILES ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d DESTINATION include/d/qt/${package} COMPONENT qtd RENAME ${class}.di) 251 foreach (cpp_source ${cpp_files})
472 install(FILES ${CMAKE_BINARY_DIR}/qt/${package}/${class}_enum.d DESTINATION include/d/qt/${package} COMPONENT qtd RENAME ${class}_enum.di OPTIONAL) 252 set(cpp_sources ${cpp_sources} ${CMAKE_SOURCE_DIR}/cpp/${cpp_source}.cpp)
473 endif(NOT GENERATE_DI_FILES) 253 endforeach(cpp_source)
474 endforeach(class) 254 foreach(d_source ${d_version_files})
255 set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/qt/d${D_VERSION}/qt/${d_source}.d)
256 endforeach(d_source ${d_version_files})
257 foreach(d_source ${d_files})
258 set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/qt/${d_source}.d)
259 endforeach(d_source ${d_files})
260
261 if(NOT GENERATE_DI_FILES)
262 foreach(d_source ${d_sources})
263 get_filename_component(path ${d_source} PATH)
264 get_filename_component(name ${d_source} NAME_WE)
265 regex_safe_string(cbd_safe_tmp ${CMAKE_CURRENT_BINARY_DIR})
266 regex_safe_string(csd_safe_tmp ${CMAKE_CURRENT_SOURCE_DIR})
267 regex_safe_string(ver_safe_tmp ${CMAKE_CURRENT_SOURCE_DIR}/qt/d${D_VERSION})
268 set(regexp_str_tmp "(${ver_safe_tmp}/|${cbd_safe_tmp}/|${csd_safe_tmp}/|)(.+)")
269 string(REGEX REPLACE ${regexp_str_tmp} "\\2" ins_path "${path}")
270 install(FILES ${d_source} DESTINATION include/d/${ins_path} COMPONENT qtd RENAME ${name}.di)
271 install(FILES ${path}/${name}_enum.d DESTINATION include/d/${ins_path} COMPONENT qtd RENAME ${name}_enum.di OPTIONAL)
272 endforeach(d_source ${d_sources})
273 endif(NOT GENERATE_DI_FILES)
475 274
476 ## Link CPP library. 275 ## Link CPP library.
477 add_library(cpp_${package} SHARED ${cpp_sources}) 276 add_library(cpp_${package} SHARED ${cpp_sources})
478 set_property(TARGET cpp_${package} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles) 277 set_property(TARGET cpp_${package} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles)
479 foreach(cpp_source ${cpp_sources}) 278 if(CMAKE_HOST_WIN32 AND D_IS_MARS) ## TODO: Replace by SEPAREATE_CPP_PART
480 set(cpp_source ${cpp_source}) 279 else(CMAKE_HOST_WIN32 AND D_IS_MARS)
481 obj_path(cpp_source) 280 foreach(cpp_source ${cpp_sources})
482 set(cpp_objs ${cpp_objs} CMakeFiles/cpp_${package}.dir/${cpp_source}${CMAKE_CXX_OUTPUT_EXTENSION}) 281 set(cpp_source ${cpp_source})
483 endforeach(cpp_source) 282 obj_path(cpp_source)
283 set(cpp_objs ${cpp_objs} ${CMAKE_BINARY_DIR}/CMakeFiles/cpp_${package}.dir/${cpp_source}${CMAKE_CXX_OUTPUT_EXTENSION})
284 endforeach(cpp_source ${cpp_sources})
285 endif(CMAKE_HOST_WIN32 AND D_IS_MARS)
484 286
485 ## Link D library. 287 ## Link D library.
486 set(lib_name ${D_LIB_PREFIX}qtd${package}${D_LIB_SUFFIX}) 288 set(lib_name qtd${package})
487 set(lib lib/${lib_name}) 289 if(BUILD_SHARED_LIBRARIES)
488 compile_d_files(${package}_dobjs objects ${d_sources}) 290 set(lib lib/${CMAKE_SHARED_LIBRARY_PREFIX}${lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX})
489 set(d_objs ${d_objs} ${objects}) 291 set(build_type SHARED)
490 if(CMAKE_HOST_WIN32) 292 else(BUILD_SHARED_LIBRARIES)
491 set_property(TARGET cpp_${package} PROPERTY RUNTIME_OUTPUT_DIRECTORY lib) 293 set(lib lib/${D_LIB_PREFIX}${lib_name}${D_LIB_SUFFIX})
492 set_property(TARGET cpp_${package} PROPERTY ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles) 294 set(build_type STATIC)
493 foreach(req ${required}) 295 endif(BUILD_SHARED_LIBRARIES)
296
297 foreach(req ${required})
494 set(is_found) 298 set(is_found)
495 foreach(pack ${packages_big}) 299 foreach(pack ${packages_big})
496 if("${pack}" STREQUAL "${req}") 300 if("${pack}" STREQUAL "${req}")
497 set(is_found 1) 301 set(is_found 1)
498 break(pack ${packages_big}) 302 break(pack ${packages_big})
503 endif(NOT is_found) 307 endif(NOT is_found)
504 string(TOUPPER ${req} req_upper) 308 string(TOUPPER ${req} req_upper)
505 string(TOLOWER ${req} req_lower) 309 string(TOLOWER ${req} req_lower)
506 set(link_cpp ${link_cpp} cpp_${req_lower} ${QT_QT${req_upper}_LIBRARY}) 310 set(link_cpp ${link_cpp} cpp_${req_lower} ${QT_QT${req_upper}_LIBRARY})
507 endforeach(req ${require}) 311 endforeach(req ${require})
508 312 set(d_objs ${d_objs} ${objects})
509 ## Does the next three lines need for ldc? 313
510 string(TOUPPER ${package} package_upper) 314 set_property(TARGET cpp_${package} PROPERTY RUNTIME_OUTPUT_DIRECTORY lib)
511 set(link_cpp ${link_cpp} ${QT_QT${package_upper}_LIBRARY}) 315 set_property(TARGET cpp_${package} PROPERTY ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles)
512 target_link_libraries(cpp_${package} ${link_cpp} ) 316 string(TOUPPER ${package} package_upper)
513 if(D_IS_MARS) 317 set(link_cpp ${link_cpp} ${QT_QT${package_upper}_LIBRARY})
514 set(cpp_lib ${CMAKE_BINARY_DIR}/lib/libcpp_${package}.dll) 318 target_link_libraries(cpp_${package} ${link_cpp} )
515 set(cpp_lib_native ${cpp_lib}) 319 if(CMAKE_HOST_WIN32 AND D_IS_MARS) ## TODO: Replace by SEPAREATE_CPP_PART
516 make_native_path(cpp_lib_native) 320 set(cpp_lib ${CMAKE_BINARY_DIR}/lib/libcpp_${package}.dll)
517 set(d_implib ${CMAKE_BINARY_DIR}/CMakeFiles/${package}.dir/cpp_${package}.lib) 321 set(cpp_lib_native ${cpp_lib})
518 set(d_implib_native ${d_implib}) 322 make_native_path(cpp_lib_native)
519 make_native_path(d_implib_native) 323 set(d_implib ${CMAKE_BINARY_DIR}/CMakeFiles/${package}.dir/cpp_${package}.lib)
520 add_custom_command( 324 set(d_implib_native ${d_implib})
521 OUTPUT "${d_implib}" 325 make_native_path(d_implib_native)
522 COMMAND "${IMPLIB}" 326 add_custom_command(
523 ARGS /system /PAGESIZE:32 ${d_implib_native} ${cpp_lib_native} 327 OUTPUT "${d_implib}"
524 DEPENDS "cpp_${package}" 328 COMMAND "${IMPLIB}"
525 COMMENT "Creating implib ${lib_name}" 329 ARGS /system /PAGESIZE:32 ${d_implib_native} ${cpp_lib_native}
526 ) 330 DEPENDS "cpp_${package}"
527 331 COMMENT "Creating implib ${lib_name}"
528 add_custom_command( 332 )
529 OUTPUT "${lib}"
530 COMMAND "${DC}"
531 ARGS -lib ${d_objs} ${d_implib} -of${lib}
532 DEPENDS ${d_objs} ${d_implib}
533 COMMENT "Linking ${lib_name}"
534 )
535 elseif(D_IS_MARS)
536 add_custom_command(
537 OUTPUT "${lib}"
538 COMMAND "${CMAKE_AR}"
539 ARGS rcs ${lib} ${d_objs} ${cpp_objs}
540 DEPENDS ${d_objs}
541 COMMENT "Linking ${lib_name}"
542 )
543 endif(D_IS_MARS)
544 install(FILES ${cpp_lib} COMPONENT qtd DESTINATION lib) 333 install(FILES ${cpp_lib} COMPONENT qtd DESTINATION lib)
545 else(CMAKE_HOST_UNIX) 334 else(CMAKE_HOST_WIN32 AND D_IS_MARS)
546 add_custom_command( 335 set(${package}_lib_param Qt${package_big}) ## Paths for QtD libs. Needed by examples.
547 OUTPUT "${lib}" 336 endif(CMAKE_HOST_WIN32 AND D_IS_MARS)
548 COMMAND "${CMAKE_AR}" 337 add_d_target(${lib_name} TYPE ${build_type} INCLUDES ${QTD_IMPORT_PATH} SOURCES ${d_sources} OBJECTS ${cpp_objs} ${d_implib}
549 ARGS rcs ${lib} ${d_objs} ${cpp_objs} 338 OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib DEPENDS ${d_implib})
550 DEPENDS ${d_objs} cpp_${package}
551 COMMENT "Linking ${lib_name}"
552 )
553 endif(CMAKE_HOST_WIN32)
554 install(FILES ${CMAKE_BINARY_DIR}/${lib} COMPONENT qtd DESTINATION lib) 339 install(FILES ${CMAKE_BINARY_DIR}/${lib} COMPONENT qtd DESTINATION lib)
340
341 ## Paths for QtD libs. Needed by examples.
342 set(${package}_lib_param qtd${package} ${${package}_lib_param} ${link_example})
555 343
556 ## Dependences. 344 ## Dependences.
557 add_custom_target(${package} DEPENDS ${lib}) 345 add_custom_target(${package} DEPENDS ${lib})
558 foreach(depend ${required}) 346 foreach(depend ${required})
559 string(TOLOWER ${depend} depend) 347 string(TOLOWER ${depend} depend)
560 add_dependencies(cpp_${package} cpp_${depend}) 348 add_dependencies(cpp_${package} cpp_${depend})
561 add_dependencies(${package} ${depend}) 349 add_dependencies(${package} ${depend})
562 endforeach(depend ${required}) 350 endforeach(depend ${required})
563 add_dependencies(allpackages ${package}) 351 add_dependencies(allpackages ${package})
564
565 ## Paths for QtD libs. Needed by examples.
566 if(CMAKE_HOST_WIN32 AND D_IS_MARS)
567 set(libs_path ${CMAKE_BINARY_DIR}/lib/qtd${package}.lib)
568 make_native_path(libs_path)
569 set(${package}_lib_param -L+${libs_path})
570 foreach(link ${link_example})
571 set(link ${CMAKE_SOURCE_DIR}/lib/${link}.lib)
572 make_native_path(link)
573 set(link -L+${link})
574 set(${package}_lib_param ${${package}_lib_param} ${link})
575 endforeach(link ${link_example})
576 else (CMAKE_HOST_WIN32 AND D_IS_MARS)
577 set(${package}_lib_param -L-lqtd${package} -L-lQt${package_big})
578 foreach(link ${link_example})
579 set(${package}_lib_param ${${package}_lib_param} ${link})
580 endforeach(link ${link_example})
581 endif(CMAKE_HOST_WIN32 AND D_IS_MARS)
582 352
583 if(GENERATE_DI_FILES) 353 if(GENERATE_DI_FILES)
584 regexseafestring(cbd_safe ${CMAKE_BINARY_DIR}) 354 regexseafestring(cbd_safe ${CMAKE_BINARY_DIR})
585 regexseafestring(csd_safe ${CMAKE_SOURCE_DIR}) 355 regexseafestring(csd_safe ${CMAKE_SOURCE_DIR})
586 set(regexp_str "(${csd}/qt/d${D_VERSION}|${csd_safe}|${cbd_safe})/([A-Za-z0-9\\-_\\\\/]+)[/]+([A-Za-z0-9\\-_\\\\]+).d") 356 set(regexp_str "(${csd}/qt/d${D_VERSION}|${csd_safe}|${cbd_safe})/([A-Za-z0-9\\-_\\\\/]+)[/]+([A-Za-z0-9\\-_\\\\]+).d")