Mercurial > projects > qtd
comparison CMakeLists.txt @ 370:7fd4b69378bf
move cpp part of QtD into shared libs on linux to reduce binaries size
author | Eldar Insafutdinov |
---|---|
date | Sun, 04 Jul 2010 14:17:49 +0100 |
parents | 3b0545d4d479 |
children | a032df77b6ab |
comparison
equal
deleted
inserted
replaced
369:6e1857c521af | 370:7fd4b69378bf |
---|---|
80 if (NOT IMPLIB) | 80 if (NOT IMPLIB) |
81 message(FATAL_ERROR "implib is not found. You can donwload it from http://ftp.digitalmars.com/bup.zip") | 81 message(FATAL_ERROR "implib is not found. You can donwload it from http://ftp.digitalmars.com/bup.zip") |
82 endif (NOT IMPLIB) | 82 endif (NOT IMPLIB) |
83 if(D_IS_MARS) | 83 if(D_IS_MARS) |
84 set(GEN_OPT ${GEN_OPT} --cpp_shared) | 84 set(GEN_OPT ${GEN_OPT} --cpp_shared) |
85 add_definitions(-DCPP_SHARED) | |
86 endif(D_IS_MARS) | 85 endif(D_IS_MARS) |
87 endif(CMAKE_HOST_WIN32) | 86 endif(CMAKE_HOST_WIN32) |
87 add_definitions(-DCPP_SHARED) | |
88 | 88 |
89 set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./) | 89 set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./) |
90 set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET}) | 90 set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET}) |
91 | 91 |
92 set(packages CACHE INTERNAL "") | 92 set(packages CACHE INTERNAL "") |
177 string(REGEX REPLACE ".dll([A-Za-z\\.0-9]+)" "\\1" CMAKE_IMPORT_LIBRARY_SUFFIX "${CMAKE_IMPORT_LIBRARY_SUFFIX}") | 177 string(REGEX REPLACE ".dll([A-Za-z\\.0-9]+)" "\\1" CMAKE_IMPORT_LIBRARY_SUFFIX "${CMAKE_IMPORT_LIBRARY_SUFFIX}") |
178 endif(CMAKE_HOST_WIN32) | 178 endif(CMAKE_HOST_WIN32) |
179 | 179 |
180 if(CMAKE_HOST_WIN32 AND D_IS_MARS) | 180 if(CMAKE_HOST_WIN32 AND D_IS_MARS) |
181 set(D_FLAGS -version=cpp_shared) | 181 set(D_FLAGS -version=cpp_shared) |
182 endif(CMAKE_HOST_WIN32 AND D_IS_MARS) | |
182 add_definitions(-DCPP_SHARED) | 183 add_definitions(-DCPP_SHARED) |
183 set(CPP_SHARED 1 CACHE INTERNAL "") | 184 set(CPP_SHARED 1 CACHE INTERNAL "") |
184 endif(CMAKE_HOST_WIN32 AND D_IS_MARS) | 185 |
185 | 186 |
186 if(UNITTEST) | 187 if(UNITTEST) |
187 add_d_versions(QtdUnittest) | 188 add_d_versions(QtdUnittest) |
188 set(D_FLAGS ${D_FLAGS} -unittest) | 189 set(D_FLAGS ${D_FLAGS} -unittest) |
189 endif(UNITTEST) | 190 endif(UNITTEST) |
301 endif(NOT BUILD_TOOLS) | 302 endif(NOT BUILD_TOOLS) |
302 qtd_wrap_ui(uic_sources ${UIC_tmp}) | 303 qtd_wrap_ui(uic_sources ${UIC_tmp}) |
303 endif(UIC_tmp) | 304 endif(UIC_tmp) |
304 | 305 |
305 foreach(package ${PACKAGES_tmp}) | 306 foreach(package ${PACKAGES_tmp}) |
306 string(REGEX REPLACE "Qt([A-Za-z0-9])" "\\1" req "${package}") | 307 string(REGEX REPLACE "Qt([A-Za-z0-9])" "\\1" req "${package}") |
307 set(is_found) | 308 set(is_found) |
308 foreach(package_big ${packages_big}) | 309 foreach(package_big ${packages_big}) |
309 string(TOLOWER ${package_big} package) | 310 string(TOLOWER ${package_big} package) |
310 if(${req} STREQUAL ${package_big}) | 311 if(${req} STREQUAL ${package_big}) |
311 set(is_found 1) | 312 set(is_found 1) |
312 break(package_big ${packages_big}) | 313 break(package_big ${packages_big}) |
313 endif(${req} STREQUAL ${package_big}) | 314 endif() |
314 endforeach(package_big ${packages_big}) | 315 endforeach() |
315 if(NOT is_found) | 316 if(NOT is_found) |
316 message(STATUS "Example '${name}' requires the package '${req}', but it is not active. Example will not be built") | 317 message(STATUS "Example '${name}' requires the package '${req}', but it is not active. Example will not be built") |
317 return(build_example name) | 318 return(build_example name) |
318 else(NOT is_found) | 319 else() |
319 set(qtd_libs ${${package}_lib_param} ${qtd_libs}) | 320 set(qtd_libs cpp_${package} ${${package}_lib_param} ${qtd_libs}) |
320 endif(NOT is_found) | 321 endif() |
321 endforeach(package ${PACKAGES_tmp}) | 322 endforeach() |
322 add_d_program(${name} ${SOURCES_tmp} NO_DEPS_SOURCES ${res_sources} ${uic_sources} | 323 add_d_program(${name} ${SOURCES_tmp} NO_DEPS_SOURCES ${res_sources} ${uic_sources} |
323 DEPENDS ${res_sources} INCLUDES ${QTD_IMPORT_PATH} ${CMAKE_CURRENT_BINARY_DIR} | 324 DEPENDS ${res_sources} INCLUDES ${QTD_IMPORT_PATH} ${CMAKE_CURRENT_BINARY_DIR} |
324 LIB_PATHS ${QTD_LIBRARIES_PATH} ${CMAKE_SOURCE_DIR}/lib ${QT_LIBRARY_DIR} LIBS ${qtd_libs}) | 325 LIB_PATHS ${QTD_LIBRARIES_PATH} ${CMAKE_SOURCE_DIR}/lib ${QT_LIBRARY_DIR} LIBS ${qtd_libs}) |
325 ## TODO: Uncomment. | 326 ## TODO: Uncomment. |
326 #if(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX) ## | 327 #if(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX) ## |
364 foreach(req ${required}) | 365 foreach(req ${required}) |
365 set(req_found) | 366 set(req_found) |
366 foreach(pack ${packages_big}) | 367 foreach(pack ${packages_big}) |
367 if(${pack} STREQUAL ${req}) | 368 if(${pack} STREQUAL ${req}) |
368 set(req_found 1) | 369 set(req_found 1) |
369 endif(${pack} STREQUAL ${req}) | 370 endif() |
370 endforeach(pack ${packages}) | 371 endforeach(pack ${packages}) |
371 if(NOT req_found) | 372 if(NOT req_found) |
372 set(req_found) | 373 set(req_found) |
373 foreach(pack ${all_packages}) | 374 foreach(pack ${all_packages}) |
374 if(${pack} STREQUAL ${req}) | 375 if(${pack} STREQUAL ${req}) |
375 set(req_found 1) | 376 set(req_found 1) |
376 endif(${pack} STREQUAL ${req}) | 377 endif(${pack} STREQUAL ${req}) |
377 endforeach(pack ${all_packages}) | 378 endforeach(pack ${all_packages}) |
378 if(req_found) | 379 if(req_found) |
379 message(STATUS "Package '${package_big}' requires '${req}', but it is not active") | 380 message(STATUS "Package '${package_big}' requires '${req}', but it is not active") |
380 else(req_found) | 381 else() |
381 message(STATUS "Package '${package_big}' requires '${req}', but it is not found") | 382 message(STATUS "Package '${package_big}' requires '${req}', but it is not found") |
382 endif(req_found) | 383 endif() |
383 set(all_req_found) | 384 set(all_req_found) |
384 endif(NOT req_found) | 385 endif() |
385 endforeach(req ${required}) | 386 endforeach(req ${required}) |
386 else(BUILD_QT_${package_upper}) | 387 else(BUILD_QT_${package_upper}) |
387 set(all_req_found) | 388 set(all_req_found) |
388 endif(BUILD_QT_${package_upper}) | 389 endif(BUILD_QT_${package_upper}) |
389 | 390 |
393 ## Load a package sources list. | 394 ## Load a package sources list. |
394 foreach(d_source ${package}/ArrayOps2 ${d_generated_files}) | 395 foreach(d_source ${package}/ArrayOps2 ${d_generated_files}) |
395 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}.d) | 396 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}.d) |
396 if(EXISTS ${CMAKE_BINARY_DIR}/qt/${d_source}_aux.d) | 397 if(EXISTS ${CMAKE_BINARY_DIR}/qt/${d_source}_aux.d) |
397 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}_aux.d) | 398 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}_aux.d) |
398 endif(EXISTS ${CMAKE_BINARY_DIR}/qt/${d_source}_aux.d) | 399 endif() |
399 endforeach(d_source ${d_generated_files}) | 400 endforeach(d_source ${d_generated_files}) |
400 set(classes ArrayOps ${classes}) | 401 set(classes ArrayOps ${classes}) |
401 foreach(class ${classes}) | 402 foreach(class ${classes}) |
402 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d) | 403 set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d) |
403 set(cpp_sources ${cpp_sources} ${CMAKE_BINARY_DIR}/cpp/qt_${package}/${class}_shell.cpp) | 404 set(cpp_sources ${cpp_sources} ${CMAKE_BINARY_DIR}/cpp/qt_${package}/${class}_shell.cpp) |
434 endif(NOT GENERATE_DI_FILES) | 435 endif(NOT GENERATE_DI_FILES) |
435 | 436 |
436 ### Build the CPP part. | 437 ### Build the CPP part. |
437 if(CPP_SHARED) | 438 if(CPP_SHARED) |
438 set(cpp_method SHARED) | 439 set(cpp_method SHARED) |
439 else(CPP_SHARED) | 440 else() |
440 set(cpp_method STATIC) | 441 set(cpp_method STATIC) |
441 endif(CPP_SHARED) | 442 endif() |
442 add_library(cpp_${package} ${cpp_method} ${cpp_sources}) | 443 add_library(cpp_${package} ${cpp_method} ${cpp_sources}) |
443 set_target_properties(cpp_${package} PROPERTIES | 444 # FIXME, do less redundant |
444 RUNTIME_OUTPUT_DIRECTORY lib | 445 if(CMAKE_HOST_WIN32) |
445 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles | 446 set_target_properties(cpp_${package} PROPERTIES |
446 LINK_FLAGS -Wl,-enable-auto-import | 447 RUNTIME_OUTPUT_DIRECTORY lib |
447 COMPILE_DEFINITIONS QTD_${package_upper} | 448 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles |
448 ) | 449 LINK_FLAGS -Wl,-enable-auto-import |
450 COMPILE_DEFINITIONS QTD_${package_upper} | |
451 ) | |
452 else() | |
453 set_target_properties(cpp_${package} PROPERTIES | |
454 LIBRARY_OUTPUT_DIRECTORY lib | |
455 ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles | |
456 COMPILE_DEFINITIONS QTD_${package_upper} | |
457 ) | |
458 endif() | |
449 | 459 |
450 set(link_cpp ${link_cpp} ${QT_QT${package_upper}_LIBRARY}) | 460 set(link_cpp ${link_cpp} ${QT_QT${package_upper}_LIBRARY}) |
451 if(CPP_SHARED) | 461 if(NOT CPP_SHARED) |
452 else(CPP_SHARED) | |
453 ## Get an objects list. It will be used in building the D part. | 462 ## Get an objects list. It will be used in building the D part. |
454 foreach(cpp_source ${cpp_sources}) | 463 foreach(cpp_source ${cpp_sources}) |
455 set(cpp_source ${cpp_source}) | 464 set(cpp_source ${cpp_source}) |
456 obj_path(cpp_source) | 465 obj_path(cpp_source) |
457 set(cpp_objs ${cpp_objs} ${CMAKE_BINARY_DIR}/CMakeFiles/cpp_${package}.dir/${cpp_source}${CMAKE_CXX_OUTPUT_EXTENSION}) | 466 set(cpp_objs ${cpp_objs} ${CMAKE_BINARY_DIR}/CMakeFiles/cpp_${package}.dir/${cpp_source}${CMAKE_CXX_OUTPUT_EXTENSION}) |
458 endforeach(cpp_source ${cpp_sources}) | 467 endforeach(cpp_source ${cpp_sources}) |
459 endif(CPP_SHARED) | 468 endif() |
460 | 469 |
461 ## Settings for the D part. | 470 ## Settings for the D part. |
462 set(lib_name qtd${package}) | 471 set(lib_name qtd${package}) |
463 if(BUILD_SHARED_LIBRARIES) | 472 if(BUILD_SHARED_LIBRARIES) |
464 set(lib lib/${CMAKE_SHARED_LIBRARY_PREFIX}${lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX}) | 473 set(lib lib/${CMAKE_SHARED_LIBRARY_PREFIX}${lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX}) |
465 set(build_type SHARED) | 474 set(build_type SHARED) |
466 else(BUILD_SHARED_LIBRARIES) | 475 else() |
467 set(lib lib/${D_LIB_PREFIX}${lib_name}${D_LIB_SUFFIX}) | 476 set(lib lib/${D_LIB_PREFIX}${lib_name}${D_LIB_SUFFIX}) |
468 set(build_type STATIC) | 477 set(build_type STATIC) |
469 endif(BUILD_SHARED_LIBRARIES) | 478 endif() |
470 | 479 |
471 ## Package dependencies. | 480 ## Package dependencies. |
472 foreach(req ${required}) | 481 foreach(req ${required}) |
473 set(is_found) | 482 set(is_found) |
474 foreach(pack ${packages_big}) | 483 foreach(pack ${packages_big}) |
475 if("${pack}" STREQUAL "${req}") | 484 if("${pack}" STREQUAL "${req}") |
476 set(is_found 1) | 485 set(is_found 1) |
477 break(pack ${packages_big}) | 486 break(pack ${packages_big}) |
478 endif("${pack}" STREQUAL "${req}") | 487 endif() |
479 endforeach(pack ${packages_big}) | 488 endforeach() |
480 if(NOT is_found) | 489 if(NOT is_found) |
481 message(FATAL_ERROR "Package ${package_big} requires ${req}, but it is not found") | 490 message(FATAL_ERROR "Package ${package_big} requires ${req}, but it is not found") |
482 endif(NOT is_found) | 491 endif() |
483 string(TOUPPER ${req} req_upper) | 492 string(TOUPPER ${req} req_upper) |
484 string(TOLOWER ${req} req_lower) | 493 string(TOLOWER ${req} req_lower) |
485 set(link_cpp ${link_cpp} cpp_${req_lower} ${QT_QT${req_upper}_LIBRARY}) | 494 set(link_cpp ${link_cpp} cpp_${req_lower} ${QT_QT${req_upper}_LIBRARY}) |
486 endforeach(req ${require}) | 495 endforeach() |
487 target_link_libraries(cpp_${package} ${link_cpp} ) | 496 target_link_libraries(cpp_${package} ${link_cpp} ) |
488 set(d_objs ${d_objs} ${objects}) | 497 set(d_objs ${d_objs} ${objects}) |
489 | 498 |
490 if(CPP_SHARED) | 499 if(CPP_SHARED AND CMAKE_HOST_WIN32) |
491 ## Create an implib library which will be linked to the D part. | 500 ## Create an implib library which will be linked to the D part. |
492 set(cpp_lib ${CMAKE_BINARY_DIR}/lib/libcpp_${package}.dll) | 501 set(cpp_lib ${CMAKE_BINARY_DIR}/lib/libcpp_${package}.dll) |
493 set(cpp_lib_native ${cpp_lib}) | 502 set(cpp_lib_native ${cpp_lib}) |
494 make_native_path(cpp_lib_native) | 503 make_native_path(cpp_lib_native) |
495 set(d_implib ${CMAKE_BINARY_DIR}/CMakeFiles/${package}.dir/cpp_${package}.lib) | 504 set(d_implib ${CMAKE_BINARY_DIR}/CMakeFiles/${package}.dir/cpp_${package}.lib) |
501 ARGS /system /PAGESIZE:64 ${d_implib_native} ${cpp_lib_native} | 510 ARGS /system /PAGESIZE:64 ${d_implib_native} ${cpp_lib_native} |
502 DEPENDS "cpp_${package}" | 511 DEPENDS "cpp_${package}" |
503 COMMENT "Creating implib ${lib_name}" | 512 COMMENT "Creating implib ${lib_name}" |
504 ) | 513 ) |
505 install(FILES ${cpp_lib} COMPONENT qtd DESTINATION lib) | 514 install(FILES ${cpp_lib} COMPONENT qtd DESTINATION lib) |
506 else(CPP_SHARED) | 515 else() |
507 set(${package}_lib_param Qt${package_big}) | 516 set(${package}_lib_param Qt${package_big}) |
508 endif(CPP_SHARED) | 517 endif() |
518 #FIXME remove redundancy again. see above | |
519 if(CPP_SHARED AND CMAKE_HOST_UNIX) | |
520 set(cpp_lib ${CMAKE_BINARY_DIR}/lib/libcpp_${package}.so) | |
521 install(FILES ${cpp_lib} COMPONENT qtd DESTINATION lib) | |
522 endif() | |
509 ## Link the D part. | 523 ## Link the D part. |
510 add_d_target(${lib_name} NOT_DETECT_DEPENDS TYPE ${build_type} INCLUDES ${QTD_IMPORT_PATH} SOURCES ${d_sources} OBJECTS ${cpp_objs} ${d_implib} | 524 add_d_target(${lib_name} NOT_DETECT_DEPENDS TYPE ${build_type} INCLUDES ${QTD_IMPORT_PATH} SOURCES ${d_sources} OBJECTS ${cpp_objs} ${d_implib} |
511 OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib DEPENDS ${d_implib} ) | 525 OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib DEPENDS ${d_implib} ) |
512 install(FILES ${CMAKE_BINARY_DIR}/${lib} COMPONENT qtd DESTINATION lib) | 526 install(FILES ${CMAKE_BINARY_DIR}/${lib} COMPONENT qtd DESTINATION lib) |
513 ## Paths for the QtD libs. It is necessary for examples. | 527 ## Paths for the QtD libs. It is necessary for examples. |