Mercurial > projects > qtd
comparison CMakeLists.txt @ 384:d2f48c4cb3e3
Same behavior of shared libs on linux and windows. Minor build script fixes.
author | Max Samukha <maxter@spambox.com> |
---|---|
date | Fri, 16 Jul 2010 20:04:29 +0300 |
parents | 347e4c7a9ba1 |
children | b13910fdd739 |
comparison
equal
deleted
inserted
replaced
383:bd7f485e3573 | 384:d2f48c4cb3e3 |
---|---|
43 ## Settings. | 43 ## Settings. |
44 ##-------------------------------------------- | 44 ##-------------------------------------------- |
45 | 45 |
46 ## Options. | 46 ## Options. |
47 option(BUILD_EXAMPLES "Build examples" "OFF") | 47 option(BUILD_EXAMPLES "Build examples" "OFF") |
48 option(BUILD_SHARED_LIBRARIES "Build shared library (very experemental and only for ldc)" "OFF") | 48 # option(BUILD_SHARED_LIBRARIES "Build shared library (very experemental and only for ldc)" "OFF") |
49 | |
50 if (CMAKE_HOST_WIN32) | |
51 set(CPP_SHARED true CACHE INTERNAL "") | |
52 else() | |
53 option(CPP_SHARED "Build C++ part into shared libraries" "ON") | |
54 endif() | |
55 | |
49 option(BUILD_TOOLS "Build tools" "ON") | 56 option(BUILD_TOOLS "Build tools" "ON") |
50 #option(GENERATE_DI_FILES "Generate *.di files with DC -H command" "OFF") | 57 #option(GENERATE_DI_FILES "Generate *.di files with DC -H command" "OFF") |
51 set(GENERATE_DI_FILES OFF) ## Very experimental option. Temporarily disabled. | 58 set(GENERATE_DI_FILES OFF) ## Very experimental option. Temporarily disabled. |
52 option(VERBOSE_DEBUG "Verbose debug" "OFF") | 59 option(VERBOSE_DEBUG "Verbose debug" "OFF") |
53 | 60 |
76 # System specific settings. | 83 # System specific settings. |
77 if(CMAKE_HOST_WIN32) | 84 if(CMAKE_HOST_WIN32) |
78 set(implib implib) | 85 set(implib implib) |
79 find_program(IMPLIB ${implib}) | 86 find_program(IMPLIB ${implib}) |
80 if (NOT IMPLIB) | 87 if (NOT IMPLIB) |
81 message(FATAL_ERROR "implib is not found. You can donwload it from http://ftp.digitalmars.com/bup.zip") | 88 message(FATAL_ERROR "implib is not found. You can donwload it from http://ftp.digitalmars.com/bup.zip") |
82 endif () | 89 endif () |
83 if(D_IS_MARS) | 90 endif() |
84 set(GEN_OPT ${GEN_OPT} --cpp_shared) | 91 |
85 endif() | 92 if(CPP_SHARED) |
86 endif() | 93 set(GEN_OPT ${GEN_OPT} --cpp-shared) |
87 add_definitions(-DCPP_SHARED) | 94 add_definitions(-DCPP_SHARED) |
95 endif() | |
88 | 96 |
89 set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./) | 97 set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./) |
90 set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET}) | 98 set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET}) |
91 | 99 |
92 set(packages CACHE INTERNAL "") | 100 set(packages CACHE INTERNAL "") |
146 COMMENT "" | 154 COMMENT "" |
147 ) | 155 ) |
148 | 156 |
149 ## "Make install" command. | 157 ## "Make install" command. |
150 set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${CMAKE_BINARY_DIR}/build) | 158 set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${CMAKE_BINARY_DIR}/build) |
159 | |
160 set(native_build_path ${CMAKE_BINARY_DIR}/build) | |
161 make_native_path(native_build_path) | |
151 add_custom_target(install | 162 add_custom_target(install |
152 COMMAND cd ${CMAKE_BINARY_DIR}/build && ${make_util} install | 163 COMMAND cd ${native_build_path} && ${make_util} install |
153 COMMENT "" | 164 COMMENT "" |
154 ) | 165 ) |
155 add_dependencies(install preinstall) | 166 add_dependencies(install preinstall) |
156 | 167 |
157 ########################################################## | 168 ########################################################## |
159 ########################################################## | 170 ########################################################## |
160 else(NOT SECOND_RUN) | 171 else(NOT SECOND_RUN) |
161 | 172 |
162 PROJECT(qtd CXX C) | 173 PROJECT(qtd CXX C) |
163 if(NOT ${CMAKE_BINARY_DIR} STREQUAL ${CMAKE_SOURCE_DIR}) | 174 if(NOT ${CMAKE_BINARY_DIR} STREQUAL ${CMAKE_SOURCE_DIR}) |
164 load_cache(${CMAKE_BINARY_DIR}/.. INCLUDE_INTERNALS all_packages QTD_VERSION_STR QTD_VERSION) | 175 load_cache(${CMAKE_BINARY_DIR}/.. INCLUDE_INTERNALS all_packages QTD_VERSION_STR QTD_VERSION CPP_SHARED) |
165 endif() | 176 endif() |
166 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) | 177 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) |
167 FIND_PACKAGE(D REQUIRED) | 178 FIND_PACKAGE(D REQUIRED) |
168 FIND_PACKAGE(Qt4 REQUIRED) | 179 FIND_PACKAGE(Qt4 REQUIRED) |
169 | 180 |
178 # System specifc settings. | 189 # System specifc settings. |
179 if(CMAKE_HOST_WIN32) | 190 if(CMAKE_HOST_WIN32) |
180 string(REGEX REPLACE ".dll([A-Za-z\\.0-9]+)" "\\1" CMAKE_IMPORT_LIBRARY_SUFFIX "${CMAKE_IMPORT_LIBRARY_SUFFIX}") | 191 string(REGEX REPLACE ".dll([A-Za-z\\.0-9]+)" "\\1" CMAKE_IMPORT_LIBRARY_SUFFIX "${CMAKE_IMPORT_LIBRARY_SUFFIX}") |
181 endif() | 192 endif() |
182 | 193 |
183 if(CMAKE_HOST_WIN32 AND D_IS_MARS) | 194 if(CPP_SHARED) |
184 set(D_FLAGS -version=cpp_shared) | 195 set(D_FLAGS -version=QtdCppShared) |
185 endif() | 196 add_definitions(-DCPP_SHARED) |
186 add_definitions(-DCPP_SHARED) | 197 endif() |
187 set(CPP_SHARED 1 CACHE INTERNAL "") | |
188 | |
189 | 198 |
190 if(UNITTEST) | 199 if(UNITTEST) |
191 add_d_versions(QtdUnittest) | 200 add_d_versions(QtdUnittest) |
192 set(D_FLAGS ${D_FLAGS} -unittest) | 201 set(D_FLAGS ${D_FLAGS} -unittest) |
193 endif() | 202 endif() |
216 | 225 |
217 macro(qtd_add_resource output) | 226 macro(qtd_add_resource output) |
218 set (params NAME OPTIONS) | 227 set (params NAME OPTIONS) |
219 qtd_parse_params (RESOURCES params ${ARGN}) | 228 qtd_parse_params (RESOURCES params ${ARGN}) |
220 if(NAME_tmp) | 229 if(NAME_tmp) |
221 set(OPTIONS_tmp ${OPTIONS_tmp} -name ${NAME_tmp}) | 230 set(OPTIONS_tmp ${OPTIONS_tmp} -name ${NAME_tmp}) |
222 endif(NAME_tmp) | 231 endif() |
223 qtd_command ("${output}" "${DRCC}" "${OPTIONS_tmp}" "qrc_" | 232 qtd_command ("${output}" "${DRCC}" "${OPTIONS_tmp}" "qrc_" |
224 "Generate" ${RESOURCES_tmp}) | 233 "Generate" ${RESOURCES_tmp}) |
225 endmacro() | 234 endmacro() |
226 | 235 |
227 macro(qtd_wrap_ui output) | 236 macro(qtd_wrap_ui output) |
318 endforeach() | 327 endforeach() |
319 if(NOT is_found) | 328 if(NOT is_found) |
320 message(STATUS "Example '${name}' requires the package '${req}', but it is not active. Example will not be built") | 329 message(STATUS "Example '${name}' requires the package '${req}', but it is not active. Example will not be built") |
321 return(build_example name) | 330 return(build_example name) |
322 else() | 331 else() |
323 set(qtd_libs cpp_${package} ${${package}_lib_param} ${qtd_libs}) | 332 set(qtd_libs ${${package}_lib_param} ${qtd_libs}) |
333 if(CPP_SHARED AND CMAKE_HOST_UNIX) | |
334 set(qtd_libs cpp_${package} ${qtd_libs}) | |
335 endif() | |
324 endif() | 336 endif() |
325 endforeach() | 337 endforeach() |
326 add_d_program(${name} ${SOURCES_tmp} NO_DEPS_SOURCES ${res_sources} ${uic_sources} | 338 add_d_program(${name} ${SOURCES_tmp} NO_DEPS_SOURCES ${res_sources} ${uic_sources} |
327 DEPENDS ${res_sources} INCLUDES ${QTD_IMPORT_PATH} ${CMAKE_CURRENT_BINARY_DIR} | 339 DEPENDS ${res_sources} INCLUDES ${QTD_IMPORT_PATH} ${CMAKE_CURRENT_BINARY_DIR} |
328 LIB_PATHS ${QTD_LIBRARIES_PATH} ${CMAKE_SOURCE_DIR}/lib ${QT_LIBRARY_DIR} LIBS ${qtd_libs}) | 340 LIB_PATHS ${QTD_LIBRARIES_PATH} ${CMAKE_SOURCE_DIR}/lib ${QT_LIBRARY_DIR} LIBS ${qtd_libs}) |
390 else(BUILD_QT_${package_upper}) | 402 else(BUILD_QT_${package_upper}) |
391 set(all_req_found) | 403 set(all_req_found) |
392 endif(BUILD_QT_${package_upper}) | 404 endif(BUILD_QT_${package_upper}) |
393 | 405 |
394 if("${all_req_found}" EQUAL 1) | 406 if("${all_req_found}" EQUAL 1) |
395 set(packages_big ${packages_big} ${package_big}) | 407 set(packages_big ${packages_big} ${package_big}) |
396 set(packages ${packages} ${package}) | 408 set(packages ${packages} ${package}) |
397 ## Load a package sources list. | 409 ## Load a package sources list. |
398 foreach(d_source ${package}/ArrayOps2 ${d_generated_files}) | 410 foreach(d_source ${package}/ArrayOps2 ${d_generated_files}) |
399 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}.d) | 411 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}.d) |
400 if(EXISTS ${CMAKE_BINARY_DIR}/qt/${d_source}_aux.d) | 412 if(EXISTS ${CMAKE_BINARY_DIR}/qt/${d_source}_aux.d) |
401 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}_aux.d) | 413 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}_aux.d) |
402 endif() | 414 endif() |
403 endforeach(d_source ${d_generated_files}) | 415 endforeach() |
404 set(classes ArrayOps ${classes}) | 416 set(classes ArrayOps ${classes}) |
405 foreach(class ${classes}) | 417 foreach(class ${classes}) |
406 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d) | 418 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d) |
407 set(cpp_sources ${cpp_sources} ${CMAKE_BINARY_DIR}/cpp/qt_${package}/${class}_shell.cpp) | 419 set(cpp_sources ${cpp_sources} ${CMAKE_BINARY_DIR}/cpp/qt_${package}/${class}_shell.cpp) |
408 if(EXISTS ${CMAKE_BINARY_DIR}/qt/${package}/${class}_aux.d) | 420 if(EXISTS ${CMAKE_BINARY_DIR}/qt/${package}/${class}_aux.d) |
409 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${package}/${class}_aux.d) | 421 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${package}/${class}_aux.d) |
410 endif(EXISTS ${CMAKE_BINARY_DIR}/qt/${package}/${class}_aux.d) | 422 endif() |
411 endforeach(class ${classes}) | 423 endforeach() |
412 set(files_for_gen ${files_for_gen} ${cpp_sources} ${d_sources}) | 424 set(files_for_gen ${files_for_gen} ${cpp_sources} ${d_sources}) |
413 | 425 |
414 foreach (cpp_source ${cpp_files}) | 426 foreach (cpp_source ${cpp_files}) |
415 set(cpp_sources ${cpp_sources} ${CMAKE_SOURCE_DIR}/cpp/${cpp_source}.cpp) | 427 set(cpp_sources ${cpp_sources} ${CMAKE_SOURCE_DIR}/cpp/${cpp_source}.cpp) |
416 endforeach(cpp_source ${cpp_files}) | 428 endforeach() |
417 foreach (cpp_source ${cpp_generated_files}) | 429 foreach (cpp_source ${cpp_generated_files}) |
418 set(cpp_sources ${cpp_sources} ${CMAKE_BINARY_DIR}/cpp/${cpp_source}.cpp) | 430 set(cpp_sources ${cpp_sources} ${CMAKE_BINARY_DIR}/cpp/${cpp_source}.cpp) |
419 endforeach(cpp_source ${cpp_generated_files}) | 431 endforeach() |
420 foreach(d_source ${d_qt_files}) | 432 foreach(d_source ${d_qt_files}) |
421 set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/d${D_VERSION}/qt/${d_source}.d) | 433 set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/d${D_VERSION}/qt/${d_source}.d) |
422 endforeach(d_source ${d_qt_files}) | 434 endforeach() |
423 foreach(d_source ${d_qtd_files}) | 435 foreach(d_source ${d_qtd_files}) |
424 set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/d${D_VERSION}/qtd/${d_source}.d) | 436 set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/d${D_VERSION}/qtd/${d_source}.d) |
425 endforeach(d_source ${d_qtd_files}) | 437 endforeach() |
426 | 438 |
427 if(NOT GENERATE_DI_FILES) | 439 if(NOT GENERATE_DI_FILES) |
428 foreach(d_source ${d_sources}) | 440 foreach(d_source ${d_sources}) |
429 get_filename_component(path ${d_source} PATH) | 441 get_filename_component(path ${d_source} PATH) |
430 get_filename_component(name ${d_source} NAME_WE) | 442 get_filename_component(name ${d_source} NAME_WE) |
431 regex_safe_string(cbd_safe_tmp ${CMAKE_CURRENT_BINARY_DIR}) | 443 regex_safe_string(cbd_safe_tmp ${CMAKE_CURRENT_BINARY_DIR}) |
432 regex_safe_string(csd_safe_tmp ${CMAKE_CURRENT_SOURCE_DIR}) | 444 regex_safe_string(csd_safe_tmp ${CMAKE_CURRENT_SOURCE_DIR}) |
433 regex_safe_string(ver_safe_tmp ${CMAKE_CURRENT_SOURCE_DIR}/d${D_VERSION}) | 445 regex_safe_string(ver_safe_tmp ${CMAKE_CURRENT_SOURCE_DIR}/d${D_VERSION}) |
434 set(regexp_str_tmp "(${ver_safe_tmp}/|${cbd_safe_tmp}/|${csd_safe_tmp}/|)(.+)") | 446 set(regexp_str_tmp "(${ver_safe_tmp}/|${cbd_safe_tmp}/|${csd_safe_tmp}/|)(.+)") |
435 string(REGEX REPLACE ${regexp_str_tmp} "\\2" ins_path "${path}") | 447 string(REGEX REPLACE ${regexp_str_tmp} "\\2" ins_path "${path}") |
436 install(FILES ${d_source} DESTINATION include/d/${ins_path} COMPONENT qtd RENAME ${name}.di) | 448 install(FILES ${d_source} DESTINATION include/d/${ins_path} COMPONENT qtd RENAME ${name}.di) |
437 endforeach(d_source ${d_sources}) | 449 endforeach() |
438 endif(NOT GENERATE_DI_FILES) | 450 endif(NOT GENERATE_DI_FILES) |
439 | 451 |
440 ### Build the CPP part. | 452 ### Build the CPP part. |
441 if(CPP_SHARED) | 453 if(CPP_SHARED) |
442 set(cpp_method SHARED) | 454 set(cpp_method SHARED) |
443 else() | 455 else() |
444 set(cpp_method STATIC) | 456 set(cpp_method STATIC) |
445 endif() | 457 endif() |
446 add_library(cpp_${package} ${cpp_method} ${cpp_sources}) | 458 add_library(cpp_${package} ${cpp_method} ${cpp_sources}) |
447 # FIXME, do less redundant | 459 |
448 if(CMAKE_HOST_WIN32) | |
449 set_target_properties(cpp_${package} PROPERTIES | 460 set_target_properties(cpp_${package} PROPERTIES |
450 RUNTIME_OUTPUT_DIRECTORY lib | 461 LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib |
451 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles | 462 RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib |
452 LINK_FLAGS -Wl,-enable-auto-import | |
453 COMPILE_DEFINITIONS QTD_${package_upper} | |
454 ) | |
455 else() | |
456 set_target_properties(cpp_${package} PROPERTIES | |
457 LIBRARY_OUTPUT_DIRECTORY lib | |
458 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles | 463 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles |
459 COMPILE_DEFINITIONS QTD_${package_upper} | 464 COMPILE_DEFINITIONS QTD_${package_upper} |
460 ) | 465 ) |
466 | |
467 if(CMAKE_HOST_WIN32) | |
468 set_target_properties(cpp_${package} PROPERTIES | |
469 LINK_FLAGS -Wl,-enable-auto-import | |
470 ) | |
471 endif() | |
472 | |
473 set(link_cpp ${link_cpp} ${QT_QT${package_upper}_LIBRARY}) | |
474 if(NOT CPP_SHARED) | |
475 ## Get an objects list. It will be used in building the D part. | |
476 foreach(cpp_source ${cpp_sources}) | |
477 set(cpp_source ${cpp_source}) | |
478 obj_path(cpp_source) | |
479 set(cpp_objs ${cpp_objs} ${CMAKE_BINARY_DIR}/CMakeFiles/cpp_${package}.dir/${cpp_source}${CMAKE_CXX_OUTPUT_EXTENSION}) | |
480 endforeach() | |
481 endif() | |
482 | |
483 ## Settings for the D part. | |
484 set(lib_name qtd${package}) | |
485 # if(BUILD_SHARED_LIBRARIES) | |
486 # set(lib lib/${CMAKE_SHARED_LIBRARY_PREFIX}${lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX}) | |
487 # set(build_type SHARED) | |
488 # else() | |
489 set(lib lib/${D_LIB_PREFIX}${lib_name}${D_LIB_SUFFIX}) | |
490 set(build_type STATIC) | |
491 # endif() | |
492 | |
493 ## Package dependencies. | |
494 foreach(req ${required}) | |
495 set(is_found) | |
496 foreach(pack ${packages_big}) | |
497 if("${pack}" STREQUAL "${req}") | |
498 set(is_found 1) | |
499 break(pack ${packages_big}) | |
500 endif() | |
501 endforeach() | |
502 if(NOT is_found) | |
503 message(FATAL_ERROR "Package ${package_big} requires ${req}, but it is not found") | |
504 endif() | |
505 string(TOUPPER ${req} req_upper) | |
506 string(TOLOWER ${req} req_lower) | |
507 set(link_cpp ${link_cpp} cpp_${req_lower} ${QT_QT${req_upper}_LIBRARY}) | |
508 endforeach() | |
509 | |
510 if(${package_big} STREQUAL "Qwt" AND CMAKE_HOST_WIN32) | |
511 set(qwt_release_lib ${QWT_LIB_PATH}/libqwt5.a) | |
512 set(qwt_debug_lib ${QWT_LIB_PATH}/libqwtd5.a) | |
513 if(EXISTS ${qwt_release_lib}) | |
514 set(qwt_lib ${qwt_release_lib}) | |
515 elseif(EXISTS ${qwt_debug_lib}) | |
516 set(qwt_lib ${qwt_debug_lib}) | |
517 endif() | |
518 set(link_cpp ${link_cpp} ${qwt_lib}) | |
519 endif() | |
520 | |
521 target_link_libraries(cpp_${package} ${link_cpp} ) | |
522 set(d_objs ${d_objs} ${objects}) | |
523 | |
524 if(CPP_SHARED) | |
525 set(cpp_lib ${CMAKE_BINARY_DIR}/lib/libcpp_${package}${CMAKE_SHARED_LIBRARY_SUFFIX}) | |
526 install(FILES ${cpp_lib} COMPONENT qtd DESTINATION lib) | |
527 | |
528 if(CMAKE_HOST_WIN32) | |
529 ## Create an implib library which will be linked to the D part. | |
530 set(cpp_lib_native ${cpp_lib}) | |
531 make_native_path(cpp_lib_native) | |
532 set(d_implib ${CMAKE_BINARY_DIR}/CMakeFiles/${package}.dir/cpp_${package}.lib) | |
533 set(d_implib_native ${d_implib}) | |
534 make_native_path(d_implib_native) | |
535 add_custom_command( | |
536 OUTPUT "${d_implib}" | |
537 COMMAND "${IMPLIB}" | |
538 ARGS /system /PAGESIZE:64 ${d_implib_native} ${cpp_lib_native} | |
539 DEPENDS "cpp_${package}" | |
540 COMMENT "Creating implib ${lib_name}" | |
541 ) | |
542 endif() | |
543 else() | |
544 set(${package}_lib_param Qt${package_big}) | |
545 endif() | |
546 | |
547 ## Link the D part. | |
548 add_d_target(${lib_name} NOT_DETECT_DEPENDS TYPE ${build_type} INCLUDES ${QTD_IMPORT_PATH} SOURCES ${d_sources} OBJECTS ${cpp_objs} ${d_implib} | |
549 OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib DEPENDS ${d_implib} ) | |
550 install(FILES ${CMAKE_BINARY_DIR}/${lib} COMPONENT qtd DESTINATION lib) | |
551 ## Paths for the QtD libs. It is necessary for examples. | |
552 set(${package}_lib_param qtd${package} ${${package}_lib_param} ${link_example}) | |
553 | |
554 ## Generate dependences for make (or nmake). | |
555 add_custom_target(${package}) | |
556 add_dependencies(${package} ${lib_name}) | |
557 | |
558 add_dependencies(${lib_name} cpp_${package}) | |
559 foreach(depend ${required}) | |
560 string(TOLOWER ${depend} depend) | |
561 add_dependencies(cpp_${package} cpp_${depend}) | |
562 add_dependencies(${package} ${depend}) | |
563 endforeach() | |
564 add_dependencies(allpackages ${package}) | |
565 | |
566 ## TODO: Do we need to generate *.di files? | |
567 if(GENERATE_DI_FILES) | |
568 regexseafestring(cbd_safe ${CMAKE_BINARY_DIR}) | |
569 regexseafestring(csd_safe ${CMAKE_SOURCE_DIR}) | |
570 set(regexp_str "(${csd}/qt/d${D_VERSION}|${csd_safe}|${cbd_safe})/([A-Za-z0-9\\-_\\\\/]+)[/]+([A-Za-z0-9\\-_\\\\]+).d") | |
571 foreach(source ${d_sources}) | |
572 # find_file(source ${source} PATHS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} | |
573 # ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}) | |
574 string(REGEX REPLACE ${regexp_str} "\\2" inc_path "${source}") | |
575 string(REGEX REPLACE ${regexp_str} "\\3" file_name "${source}") | |
576 set(interface_file_path ${CMAKE_BINARY_DIR}/d/${inc_path}) | |
577 set(interface_file "${interface_file_path}/${file_name}.di") | |
578 if(NOT "${file_name}" STREQUAL "QGlobal") | |
579 add_custom_command(OUTPUT "${interface_file}" | |
580 COMMAND "${DC}" | |
581 ARGS ${D_FLAGS} -o- -H -Hd${interface_file_path} ${source} | |
582 COMMENT "Generating header for ${source}" | |
583 DEPENDS ${source} | |
584 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | |
585 ) | |
586 else(NOT "${file_name}" STREQUAL "QGlobal") ## The DMD frontend crashes on this file. | |
587 add_custom_command(OUTPUT "${interface_file}" | |
588 COMMAND ${CMAKE_COMMAND} -E make_directory ${interface_file_path} | |
589 COMMAND ${CMAKE_COMMAND} -E remove -f ${interface_file} | |
590 COMMAND ${CMAKE_COMMAND} -E copy ${source} ${interface_file} | |
591 COMMENT "" | |
592 DEPENDS ${source} | |
593 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | |
594 ) | |
595 endif(NOT "${file_name}" STREQUAL "QGlobal" AND GENERATE_DI_FILES) | |
596 set(interfaces_list ${interfaces_list} ${interface_file_path}/${file_name}.di) | |
597 install(FILES ${interface_file} COMPONENT qtd DESTINATION include/d/${inc_path}) | |
598 endforeach() | |
599 endif() | |
461 endif() | 600 endif() |
462 | 601 endforeach() |
463 set(link_cpp ${link_cpp} ${QT_QT${package_upper}_LIBRARY}) | |
464 if(NOT CPP_SHARED) | |
465 ## Get an objects list. It will be used in building the D part. | |
466 foreach(cpp_source ${cpp_sources}) | |
467 set(cpp_source ${cpp_source}) | |
468 obj_path(cpp_source) | |
469 set(cpp_objs ${cpp_objs} ${CMAKE_BINARY_DIR}/CMakeFiles/cpp_${package}.dir/${cpp_source}${CMAKE_CXX_OUTPUT_EXTENSION}) | |
470 endforeach(cpp_source ${cpp_sources}) | |
471 endif() | |
472 | |
473 ## Settings for the D part. | |
474 set(lib_name qtd${package}) | |
475 if(BUILD_SHARED_LIBRARIES) | |
476 set(lib lib/${CMAKE_SHARED_LIBRARY_PREFIX}${lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX}) | |
477 set(build_type SHARED) | |
478 else() | |
479 set(lib lib/${D_LIB_PREFIX}${lib_name}${D_LIB_SUFFIX}) | |
480 set(build_type STATIC) | |
481 endif() | |
482 | |
483 ## Package dependencies. | |
484 foreach(req ${required}) | |
485 set(is_found) | |
486 foreach(pack ${packages_big}) | |
487 if("${pack}" STREQUAL "${req}") | |
488 set(is_found 1) | |
489 break(pack ${packages_big}) | |
490 endif() | |
491 endforeach() | |
492 if(NOT is_found) | |
493 message(FATAL_ERROR "Package ${package_big} requires ${req}, but it is not found") | |
494 endif() | |
495 string(TOUPPER ${req} req_upper) | |
496 string(TOLOWER ${req} req_lower) | |
497 set(link_cpp ${link_cpp} cpp_${req_lower} ${QT_QT${req_upper}_LIBRARY}) | |
498 endforeach() | |
499 | |
500 if(${package_big} STREQUAL "Qwt" AND CMAKE_HOST_WIN32) | |
501 set(qwt_release_lib ${QWT_LIB_PATH}/libqwt5.a) | |
502 set(qwt_debug_lib ${QWT_LIB_PATH}/libqwtd5.a) | |
503 if(EXISTS ${qwt_release_lib}) | |
504 set(qwt_lib ${qwt_release_lib}) | |
505 elseif(EXISTS ${qwt_debug_lib}) | |
506 set(qwt_lib ${qwt_debug_lib}) | |
507 endif() | |
508 set(link_cpp ${link_cpp} ${qwt_lib}) | |
509 endif() | |
510 | |
511 target_link_libraries(cpp_${package} ${link_cpp} ) | |
512 set(d_objs ${d_objs} ${objects}) | |
513 | |
514 if(CPP_SHARED) | |
515 set(cpp_lib ${CMAKE_BINARY_DIR}/lib/libcpp_${package}${CMAKE_SHARED_LIBRARY_SUFFIX}) | |
516 install(FILES ${cpp_lib} COMPONENT qtd DESTINATION lib) | |
517 | |
518 if(CMAKE_HOST_WIN32) | |
519 ## Create an implib library which will be linked to the D part. | |
520 set(cpp_lib_native ${cpp_lib}) | |
521 make_native_path(cpp_lib_native) | |
522 set(d_implib ${CMAKE_BINARY_DIR}/CMakeFiles/${package}.dir/cpp_${package}.lib) | |
523 set(d_implib_native ${d_implib}) | |
524 make_native_path(d_implib_native) | |
525 add_custom_command( | |
526 OUTPUT "${d_implib}" | |
527 COMMAND "${IMPLIB}" | |
528 ARGS /system /PAGESIZE:64 ${d_implib_native} ${cpp_lib_native} | |
529 DEPENDS "cpp_${package}" | |
530 COMMENT "Creating implib ${lib_name}" | |
531 ) | |
532 endif() | |
533 else() | |
534 set(${package}_lib_param Qt${package_big}) | |
535 endif() | |
536 | |
537 ## Link the D part. | |
538 add_d_target(${lib_name} NOT_DETECT_DEPENDS TYPE ${build_type} INCLUDES ${QTD_IMPORT_PATH} SOURCES ${d_sources} OBJECTS ${cpp_objs} ${d_implib} | |
539 OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib DEPENDS ${d_implib} ) | |
540 install(FILES ${CMAKE_BINARY_DIR}/${lib} COMPONENT qtd DESTINATION lib) | |
541 ## Paths for the QtD libs. It is necessary for examples. | |
542 set(${package}_lib_param qtd${package} ${${package}_lib_param} ${link_example}) | |
543 | |
544 ## Generate dependences for make (or nmake). | |
545 add_custom_target(${package}) | |
546 add_dependencies(${package} ${lib_name}) | |
547 | |
548 add_dependencies(${lib_name} cpp_${package}) | |
549 foreach(depend ${required}) | |
550 string(TOLOWER ${depend} depend) | |
551 add_dependencies(cpp_${package} cpp_${depend}) | |
552 add_dependencies(${package} ${depend}) | |
553 endforeach(depend ${required}) | |
554 add_dependencies(allpackages ${package}) | |
555 | |
556 ## TODO: Do we need to generate *.di files? | |
557 if(GENERATE_DI_FILES) | |
558 regexseafestring(cbd_safe ${CMAKE_BINARY_DIR}) | |
559 regexseafestring(csd_safe ${CMAKE_SOURCE_DIR}) | |
560 set(regexp_str "(${csd}/qt/d${D_VERSION}|${csd_safe}|${cbd_safe})/([A-Za-z0-9\\-_\\\\/]+)[/]+([A-Za-z0-9\\-_\\\\]+).d") | |
561 foreach(source ${d_sources}) | |
562 # find_file(source ${source} PATHS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} | |
563 # ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}) | |
564 string(REGEX REPLACE ${regexp_str} "\\2" inc_path "${source}") | |
565 string(REGEX REPLACE ${regexp_str} "\\3" file_name "${source}") | |
566 set(interface_file_path ${CMAKE_BINARY_DIR}/d/${inc_path}) | |
567 set(interface_file "${interface_file_path}/${file_name}.di") | |
568 if(NOT "${file_name}" STREQUAL "QGlobal") | |
569 add_custom_command(OUTPUT "${interface_file}" | |
570 COMMAND "${DC}" | |
571 ARGS ${D_FLAGS} -o- -H -Hd${interface_file_path} ${source} | |
572 COMMENT "Generating header for ${source}" | |
573 DEPENDS ${source} | |
574 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | |
575 ) | |
576 else(NOT "${file_name}" STREQUAL "QGlobal") ## The DMD frontend crashes on this file. | |
577 add_custom_command(OUTPUT "${interface_file}" | |
578 COMMAND ${CMAKE_COMMAND} -E make_directory ${interface_file_path} | |
579 COMMAND ${CMAKE_COMMAND} -E remove -f ${interface_file} | |
580 COMMAND ${CMAKE_COMMAND} -E copy ${source} ${interface_file} | |
581 COMMENT "" | |
582 DEPENDS ${source} | |
583 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} | |
584 ) | |
585 endif(NOT "${file_name}" STREQUAL "QGlobal" AND GENERATE_DI_FILES) | |
586 set(interfaces_list ${interfaces_list} ${interface_file_path}/${file_name}.di) | |
587 install(FILES ${interface_file} COMPONENT qtd DESTINATION include/d/${inc_path}) | |
588 endforeach(source) | |
589 endif(GENERATE_DI_FILES) | |
590 endif("${all_req_found}" EQUAL 1) | |
591 endforeach(package_big ${packages_big}) | |
592 if(GENERATE_DI_FILES) | 602 if(GENERATE_DI_FILES) |
593 add_custom_target(generate_headers ALL DEPENDS ${interfaces_list}) | 603 add_custom_target(generate_headers ALL DEPENDS ${interfaces_list}) |
594 endif(GENERATE_DI_FILES) | 604 endif(GENERATE_DI_FILES) |
595 | 605 |
596 set(CPACK_COMPONENTS_ALL qtd qtd_tools) | 606 set(CPACK_COMPONENTS_ALL qtd qtd_tools) |
622 set(CPACK_PACKAGE_VERSION_PATCH 1) | 632 set(CPACK_PACKAGE_VERSION_PATCH 1) |
623 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "QtD is a D binding to the Qt application and UI framework.") | 633 set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "QtD is a D binding to the Qt application and UI framework.") |
624 set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/changelog.txt") | 634 set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/changelog.txt") |
625 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/license.txt") | 635 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/license.txt") |
626 set(CPACK_PACKAGE_VENDOR "QtD team") | 636 set(CPACK_PACKAGE_VENDOR "QtD team") |
627 set(CPACK_PACKAGE_CONTACT "e@mail.com") | 637 set(CPACK_PACKAGE_CONTACT "qtd@qtd.org") |
628 set(CPACK_PACKAGE_VERSION "0.6") | 638 set(CPACK_PACKAGE_VERSION "0.6") |
629 set(CPACK_PACKAGE_INSTALL_DIRECTORY "qtd ${CPACK_PACKAGE_VERSION}") | 639 set(CPACK_PACKAGE_INSTALL_DIRECTORY "qtd ${CPACK_PACKAGE_VERSION}") |
630 set(CPACK_PACKAGE_FILE_NAME "qtd-${CPACK_PACKAGE_VERSION}") | 640 set(CPACK_PACKAGE_FILE_NAME "qtd-${CPACK_PACKAGE_VERSION}") |
631 set(CPACK_SOURCE_PACKAGE_FILE_NAME "qtd-${CPACK_PACKAGE_VERSION}") | 641 set(CPACK_SOURCE_PACKAGE_FILE_NAME "qtd-${CPACK_PACKAGE_VERSION}") |
632 if(CMAKE_HOST_WIN32) | 642 if(CMAKE_HOST_WIN32) |