changeset 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 6e1857c521af
children 12f60887ed15 a032df77b6ab
files CMakeLists.txt
diffstat 1 files changed, 71 insertions(+), 57 deletions(-) [+]
line wrap: on
line diff
--- 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} )