# HG changeset patch # User Eldar Insafutdinov # Date 1278249469 -3600 # Node ID 7fd4b69378bf6089068ea839607272f224727dc2 # Parent 6e1857c521afeb24aa2a8851c116808fe084939f move cpp part of QtD into shared libs on linux to reduce binaries size diff -r 6e1857c521af -r 7fd4b69378bf CMakeLists.txt --- a/CMakeLists.txt Mon Jun 28 22:02:08 2010 +0300 +++ b/CMakeLists.txt Sun Jul 04 14:17:49 2010 +0100 @@ -82,9 +82,9 @@ endif (NOT IMPLIB) if(D_IS_MARS) set(GEN_OPT ${GEN_OPT} --cpp_shared) - add_definitions(-DCPP_SHARED) endif(D_IS_MARS) endif(CMAKE_HOST_WIN32) + add_definitions(-DCPP_SHARED) set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./) set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET}) @@ -179,9 +179,10 @@ if(CMAKE_HOST_WIN32 AND D_IS_MARS) set(D_FLAGS -version=cpp_shared) +endif(CMAKE_HOST_WIN32 AND D_IS_MARS) add_definitions(-DCPP_SHARED) set(CPP_SHARED 1 CACHE INTERNAL "") -endif(CMAKE_HOST_WIN32 AND D_IS_MARS) + if(UNITTEST) add_d_versions(QtdUnittest) @@ -303,22 +304,22 @@ endif(UIC_tmp) foreach(package ${PACKAGES_tmp}) - string(REGEX REPLACE "Qt([A-Za-z0-9])" "\\1" req "${package}") - set(is_found) - foreach(package_big ${packages_big}) - string(TOLOWER ${package_big} package) - if(${req} STREQUAL ${package_big}) - set(is_found 1) - break(package_big ${packages_big}) - endif(${req} STREQUAL ${package_big}) - endforeach(package_big ${packages_big}) - if(NOT is_found) - message(STATUS "Example '${name}' requires the package '${req}', but it is not active. Example will not be built") - return(build_example name) - else(NOT is_found) - set(qtd_libs ${${package}_lib_param} ${qtd_libs}) - endif(NOT is_found) - endforeach(package ${PACKAGES_tmp}) + string(REGEX REPLACE "Qt([A-Za-z0-9])" "\\1" req "${package}") + set(is_found) + foreach(package_big ${packages_big}) + string(TOLOWER ${package_big} package) + if(${req} STREQUAL ${package_big}) + set(is_found 1) + break(package_big ${packages_big}) + endif() + endforeach() + if(NOT is_found) + message(STATUS "Example '${name}' requires the package '${req}', but it is not active. Example will not be built") + return(build_example name) + else() + set(qtd_libs cpp_${package} ${${package}_lib_param} ${qtd_libs}) + endif() + endforeach() add_d_program(${name} ${SOURCES_tmp} NO_DEPS_SOURCES ${res_sources} ${uic_sources} DEPENDS ${res_sources} INCLUDES ${QTD_IMPORT_PATH} ${CMAKE_CURRENT_BINARY_DIR} LIB_PATHS ${QTD_LIBRARIES_PATH} ${CMAKE_SOURCE_DIR}/lib ${QT_LIBRARY_DIR} LIBS ${qtd_libs}) @@ -366,22 +367,22 @@ foreach(pack ${packages_big}) if(${pack} STREQUAL ${req}) set(req_found 1) - endif(${pack} STREQUAL ${req}) + endif() endforeach(pack ${packages}) if(NOT req_found) - set(req_found) - foreach(pack ${all_packages}) - if(${pack} STREQUAL ${req}) - set(req_found 1) - endif(${pack} STREQUAL ${req}) - endforeach(pack ${all_packages}) - if(req_found) - message(STATUS "Package '${package_big}' requires '${req}', but it is not active") - else(req_found) - message(STATUS "Package '${package_big}' requires '${req}', but it is not found") - endif(req_found) - set(all_req_found) - endif(NOT req_found) + set(req_found) + foreach(pack ${all_packages}) + if(${pack} STREQUAL ${req}) + set(req_found 1) + endif(${pack} STREQUAL ${req}) + endforeach(pack ${all_packages}) + if(req_found) + message(STATUS "Package '${package_big}' requires '${req}', but it is not active") + else() + message(STATUS "Package '${package_big}' requires '${req}', but it is not found") + endif() + set(all_req_found) + endif() endforeach(req ${required}) else(BUILD_QT_${package_upper}) set(all_req_found) @@ -395,7 +396,7 @@ set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}.d) if(EXISTS ${CMAKE_BINARY_DIR}/qt/${d_source}_aux.d) set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}_aux.d) - endif(EXISTS ${CMAKE_BINARY_DIR}/qt/${d_source}_aux.d) + endif() endforeach(d_source ${d_generated_files}) set(classes ArrayOps ${classes}) foreach(class ${classes}) @@ -436,58 +437,66 @@ ### Build the CPP part. if(CPP_SHARED) set(cpp_method SHARED) - else(CPP_SHARED) + else() set(cpp_method STATIC) - endif(CPP_SHARED) + endif() add_library(cpp_${package} ${cpp_method} ${cpp_sources}) - set_target_properties(cpp_${package} PROPERTIES - RUNTIME_OUTPUT_DIRECTORY lib - ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles - LINK_FLAGS -Wl,-enable-auto-import - COMPILE_DEFINITIONS QTD_${package_upper} - ) + # FIXME, do less redundant + if(CMAKE_HOST_WIN32) + set_target_properties(cpp_${package} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY lib + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles + LINK_FLAGS -Wl,-enable-auto-import + COMPILE_DEFINITIONS QTD_${package_upper} + ) + else() + set_target_properties(cpp_${package} PROPERTIES + LIBRARY_OUTPUT_DIRECTORY lib + ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles + COMPILE_DEFINITIONS QTD_${package_upper} + ) + endif() set(link_cpp ${link_cpp} ${QT_QT${package_upper}_LIBRARY}) - if(CPP_SHARED) - else(CPP_SHARED) + if(NOT CPP_SHARED) ## Get an objects list. It will be used in building the D part. foreach(cpp_source ${cpp_sources}) set(cpp_source ${cpp_source}) obj_path(cpp_source) set(cpp_objs ${cpp_objs} ${CMAKE_BINARY_DIR}/CMakeFiles/cpp_${package}.dir/${cpp_source}${CMAKE_CXX_OUTPUT_EXTENSION}) endforeach(cpp_source ${cpp_sources}) - endif(CPP_SHARED) + endif() ## Settings for the D part. set(lib_name qtd${package}) if(BUILD_SHARED_LIBRARIES) set(lib lib/${CMAKE_SHARED_LIBRARY_PREFIX}${lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX}) set(build_type SHARED) - else(BUILD_SHARED_LIBRARIES) + else() set(lib lib/${D_LIB_PREFIX}${lib_name}${D_LIB_SUFFIX}) set(build_type STATIC) - endif(BUILD_SHARED_LIBRARIES) + endif() ## Package dependencies. foreach(req ${required}) set(is_found) foreach(pack ${packages_big}) - if("${pack}" STREQUAL "${req}") - set(is_found 1) - break(pack ${packages_big}) - endif("${pack}" STREQUAL "${req}") - endforeach(pack ${packages_big}) + if("${pack}" STREQUAL "${req}") + set(is_found 1) + break(pack ${packages_big}) + endif() + endforeach() if(NOT is_found) - message(FATAL_ERROR "Package ${package_big} requires ${req}, but it is not found") - endif(NOT is_found) + message(FATAL_ERROR "Package ${package_big} requires ${req}, but it is not found") + endif() string(TOUPPER ${req} req_upper) string(TOLOWER ${req} req_lower) set(link_cpp ${link_cpp} cpp_${req_lower} ${QT_QT${req_upper}_LIBRARY}) - endforeach(req ${require}) + endforeach() target_link_libraries(cpp_${package} ${link_cpp} ) set(d_objs ${d_objs} ${objects}) - if(CPP_SHARED) + if(CPP_SHARED AND CMAKE_HOST_WIN32) ## Create an implib library which will be linked to the D part. set(cpp_lib ${CMAKE_BINARY_DIR}/lib/libcpp_${package}.dll) set(cpp_lib_native ${cpp_lib}) @@ -503,9 +512,14 @@ COMMENT "Creating implib ${lib_name}" ) install(FILES ${cpp_lib} COMPONENT qtd DESTINATION lib) - else(CPP_SHARED) + else() set(${package}_lib_param Qt${package_big}) - endif(CPP_SHARED) + endif() + #FIXME remove redundancy again. see above + if(CPP_SHARED AND CMAKE_HOST_UNIX) + set(cpp_lib ${CMAKE_BINARY_DIR}/lib/libcpp_${package}.so) + install(FILES ${cpp_lib} COMPONENT qtd DESTINATION lib) + endif() ## Link the D part. add_d_target(${lib_name} NOT_DETECT_DEPENDS TYPE ${build_type} INCLUDES ${QTD_IMPORT_PATH} SOURCES ${d_sources} OBJECTS ${cpp_objs} ${d_implib} OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib DEPENDS ${d_implib} )