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.