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)