changeset 235:b796329e8c38

We need to start cmake twice. It is necessary for getting a class list from the generator and using this list for building other parts of QtD.
author SokoL_SD
date Sun, 19 Jul 2009 18:09:33 +0000
parents 1b0e2ee5aedc
children fcc0ada121e1
files CMakeLists.txt cmake/FindD.cmake generator/CMakeLists.txt
diffstat 3 files changed, 135 insertions(+), 83 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Sat Jul 18 15:06:12 2009 +0000
+++ b/CMakeLists.txt	Sun Jul 19 18:09:33 2009 +0000
@@ -1,5 +1,11 @@
 cmake_minimum_required(VERSION 2.6)
 PROJECT(qtd CXX C)
+
+##########################################################
+## Building generator and settings.
+##########################################################
+if(NOT SECOND_RUN)
+
 FIND_PACKAGE(Qt4 REQUIRED)
 set (QT_USE_QTMAIN false)
 set (QT_USE_QTGUI false)
@@ -8,8 +14,6 @@
 ## Settings.
 ##--------------------------------------------
 
-include_directories(${QT_INCLUDES} include ${CMAKE_CURRENT_BINARY_DIR}/include)
-
 ## Options.
 option(BUILD_EXAMPLES "Build examples" "OFF")
 option(BUILD_SHARED_LIBRARIES "Build shared library (very experemental and only for ldc)" "OFF")
@@ -17,18 +21,12 @@
 #option(GENERATE_DI_FILES "Generate *.di files with DC -H command" "OFF")
 set(GENERATE_DI_FILES OFF) ## Very experemental option. Temporary disabled.
 
-set(QTD_VERSION_STR ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH})
-math(EXPR QTD_VERSION "(${QT_VERSION_MAJOR} << 16) + (${QT_VERSION_MINOR} << 8) + ${QT_VERSION_PATCH}")
-
-set(all_packages Core Gui OpenGL Xml Svg Network WebKit) 
+set(all_packages Core Gui OpenGL Xml Svg Network WebKit CACHE INTERNAL "") 
 
 ## Init D toolkit.
 set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
 FIND_PACKAGE(D REQUIRED)
 
-## Strip utility.
-find_program(STRIP strip)
-
 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR "${CMAKE_INSTALL_PREFIX}" STREQUAL "")
     set(CMAKE_INSTALL_PREFIX
 	${DC_PATH} CACHE PATH "QtD install prefix" FORCE
@@ -40,9 +38,9 @@
     if (D_FRONTEND LESS "041")
 	message(STATUS "Minimum required version of D compiler is 1.041 (or compiler based on this version)")
     endif(D_FRONTEND LESS "041")
-    set(D_TARGET d1-tango)   
+    set(D_TARGET d1-tango CACHE INTERNAL "")   
 elseif(D_VERSION EQUAL "2")
-    set(D_TARGET d2-phobos)
+    set(D_TARGET d2-phobos CACHE INTERNAL "")
 endif(D_VERSION EQUAL "1")
 
 # Debug and release flags.
@@ -70,30 +68,123 @@
 	message(FATAL_ERROR "implib not found. You can donwload it from http://ftp.digitalmars.com/bup.zip")
     endif (NOT IMPLIB)
     if(D_IS_MARS)
-      set(D_FLAGS ${D_FLAGS} -version=cpp_shared)    
       set(GEN_OPT ${GEN_OPT} --cpp_shared)
       add_definitions(-DCPP_SHARED)
     endif(D_IS_MARS)
+endif(CMAKE_HOST_WIN32) 
+
+set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./)
+set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET})
+
+set(packages CACHE INTERNAL "")
+foreach(package_big ${all_packages})
+    string(TOLOWER ${package_big} package) 
+    string(TOUPPER ${package_big} package_upper) 
+    option(BUILD_QT_${package_upper} "Build Qt${package_big}" "ON")
+    set(packages ${packages} ${package})
+endforeach(package_big ${all_packages})
+
+add_subdirectory(generator)
+
+add_custom_target(main ALL)
+add_dependencies(main dgen)
+
+if(${CMAKE_GENERATOR} STREQUAL "NMake Makefiles")
+    set(make_util nmake)
+elseif(${CMAKE_GENERATOR} STREQUAL "MinGW Makefiles" OR
+    ${CMAKE_GENERATOR} STREQUAL "Unix Makefiles")
+    set(make_util $(MAKE))
+else(${CMAKE_GENERATOR} STREQUAL "NMake Makefiles")
+    message(FATAL_ERROR "${CMAKE_GENERATOR} isn't supported")
+endif(${CMAKE_GENERATOR} STREQUAL "NMake Makefiles")
+
+set(cd_path ${CMAKE_BINARY_DIR}/build)
+make_native_path(cd_path)
+add_custom_command(TARGET main POST_BUILD	
+	COMMAND ${CMAKE_COMMAND} ARGS -E make_directory ${CMAKE_BINARY_DIR}/build
+	COMMAND cd  ARGS ${cd_path} && ${CMAKE_COMMAND} -G${CMAKE_GENERATOR} -DSECOND_RUN=1 ${CMAKE_SOURCE_DIR} && ${make_util} allpackages
+	COMMENT ""	
+	)  
+
+## Make commands.
+set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${CMAKE_BINARY_DIR}/build)
+add_custom_target(install
+	COMMAND cd ${CMAKE_BINARY_DIR}/build && ${make_util} install
+	COMMENT ""
+	)  
+add_dependencies(install preinstall)
+
+##--------------------------------------------
+## CPack.
+##--------------------------------------------
+set(CPACK_PACKAGE_VERSION_PATCH 1)
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "QtD is a D binding to the Qt application and UI framework. 
+QtD is a D binding to the Qt application and UI framework. 
+This package installs binding and static library for qt port on D programming language.
+")
+#SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/ReadMe.txt")
+SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/license.txt")
+set(CPACK_PACKAGE_VENDOR "QtD team")
+set(CPACK_PACKAGE_CONTACT "e@mail.ru" )
+SET(CPACK_PACKAGE_VERSION "0.1")
+#set(CPACK_PACKAGE_VERSION_PATCH "${RFS_VERSION_BUILD}")
+set(CPACK_PACKAGE_INSTALL_DIRECTORY "qtd ${CPACK_PACKAGE_VERSION}")
+set(CPACK_PACKAGE_FILE_NAME "qtd-${CPACK_PACKAGE_VERSION}")
+set(CPACK_SOURCE_PACKAGE_FILE_NAME "qtd-${CPACK_PACKAGE_VERSION}")
+if(CMAKE_HOST_WIN32)
+    set(CPACK_GENERATOR "ZIP")
+elseif(CMAKE_HOST_UNIX)
+    set(CPACK_GENERATOR "TBZ2;DEB;RPM")
+endif(CMAKE_HOST_WIN32)
+include(CPack)
+
+##########################################################
+## Building QtD.
+##########################################################
+else(NOT SECOND_RUN)
+
+PROJECT(qtd CXX C)
+load_cache(${CMAKE_BINARY_DIR}/.. INCLUDE_INTERNALS all_packages QTD_VERSION_STR QTD_VERSION)
+set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
+FIND_PACKAGE(D REQUIRED)
+FIND_PACKAGE(Qt4 REQUIRED)
+
+set(QTD_VERSION_STR ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH})
+math(EXPR QTD_VERSION "(${QT_VERSION_MAJOR} << 16) + (${QT_VERSION_MINOR} << 8) + ${QT_VERSION_PATCH}")
+
+include_directories(${QT_INCLUDES} ${CMAKE_SOURCE_DIR}/include ${CMAKE_CURRENT_BINARY_DIR}/include)
+
+## Strip utility.
+find_program(STRIP strip)
+
+# System specifc settings.
+if(CMAKE_HOST_WIN32)
     string(REGEX REPLACE ".dll([A-Za-z\\.0-9]+)" "\\1" CMAKE_IMPORT_LIBRARY_SUFFIX "${CMAKE_IMPORT_LIBRARY_SUFFIX}")
 endif(CMAKE_HOST_WIN32) 
 
 if(CMAKE_HOST_WIN32 AND D_IS_MARS)
-    set(CPP_SHARED 1)
+    set(CPP_SHARED 1 CACHE INTERNAL "")
 endif(CMAKE_HOST_WIN32 AND D_IS_MARS)
 
-set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./)
-set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET})
+if(D_IS_MARS)
+    set(D_FLAGS -version=cpp_shared)    
+    add_definitions(-DCPP_SHARED)
+endif(D_IS_MARS)
 
 ## Bootstrap settings for QtD.
-set(DRCC ${CMAKE_BINARY_DIR}/tools/drcc/drcc)
-set(DUIC ${CMAKE_BINARY_DIR}/tools/duic/duic)
-set(QTD_IMPORT_PATH ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/qt/d${D_VERSION})
-set(QTD_LIBRARIES_PATH ${CMAKE_BINARY_DIR}/lib)
+set(DRCC ${CMAKE_BINARY_DIR}/tools/drcc/drcc CACHE INTERNAL "")
+set(DUIC ${CMAKE_BINARY_DIR}/tools/duic/duic CACHE INTERNAL "")
+set(QTD_IMPORT_PATH ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/qt/d${D_VERSION} CACHE INTERNAL "")
+set(QTD_LIBRARIES_PATH ${CMAKE_BINARY_DIR}/lib CACHE INTERNAL "")
 
 ##--------------------------------------------
 ## Macros and functions.
 ##--------------------------------------------
 
+macro(load_generated_classes )
+    include(cpp/qt_${package}/qt_${package}.txt)
+endmacro(load_generated_classes )
+
 macro(qtd_add_resource output)
     set (params NAME OPTIONS)
     qtd_parse_params (RESOURCES  params ${ARGN})
@@ -208,10 +299,10 @@
     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 LIBS ${qtd_libs})
-    ## TODO: Enable on windows too.
-    if(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX) ##
-	add_custom_command(TARGET example_${name} POST_BUILD COMMAND "${STRIP}" ARGS "${output}")
-    endif(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX)
+    ## TODO: Enable.
+    #if(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX) ##
+    #	add_custom_command(TARGET example_${name} POST_BUILD COMMAND "${STRIP}" ARGS "${output}")
+    #endif(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX)
     add_dependencies(${name} allpackages)
 endmacro(build_example sources)
 
@@ -245,7 +336,6 @@
 
     set(all_req_found 1)
     string(TOUPPER ${package} package_upper)
-    option(BUILD_QT_${package_upper} "Build Qt${package_big}" "ON")
     if(BUILD_QT_${package_upper})
 	foreach(req ${required})
 	    set(req_found)
@@ -383,14 +473,16 @@
 	    set(${package}_lib_param Qt${package_big}) ## Paths for QtD libs. Needed by examples.
 	endif(CPP_SHARED) 
 	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})
-	install(FILES ${CMAKE_BINARY_DIR}/${lib} COMPONENT qtd DESTINATION lib)
+	      OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib DEPENDS ${d_implib} )
 	
+	install(FILES ${CMAKE_BINARY_DIR}/${lib} COMPONENT qtd DESTINATION lib)	
 	## Paths for QtD libs. Needed by examples.
 	set(${package}_lib_param qtd${package} ${${package}_lib_param} ${link_example})
 
 	## Dependences.
-	add_custom_target(${package} DEPENDS ${lib})
+	add_custom_target(${package})
+	add_dependencies(${package} ${lib_name})
+	add_dependencies(${lib_name} cpp_${package})
 	foreach(depend ${required})
 	    string(TOLOWER ${depend} depend)
 	    add_dependencies(cpp_${package} cpp_${depend})
@@ -437,12 +529,6 @@
     add_custom_target(generate_headers ALL DEPENDS ${interfaces_list})
 endif(GENERATE_DI_FILES)
 
-add_subdirectory(generator)
-## Dependences.
-foreach(package ${packages})
-    add_dependencies(cpp_${package} dgen)
-endforeach(package ${packages})
-add_sources_for_generating(${files_for_gen})	
 
 set(CPACK_COMPONENTS_ALL qtd qtd_tools)
 
@@ -460,26 +546,6 @@
     add_subdirectory(examples)
 endif(BUILD_EXAMPLES)
 
-##--------------------------------------------
-## CPack.
-##--------------------------------------------
-set(CPACK_PACKAGE_VERSION_PATCH 1)
-set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "QtD is a D binding to the Qt application and UI framework. 
-QtD is a D binding to the Qt application and UI framework. 
-This package installs binding and static library for qt port on D programming language.
-")
-#SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/ReadMe.txt")
-SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/license.txt")
-set(CPACK_PACKAGE_VENDOR "QtD team")
-set(CPACK_PACKAGE_CONTACT "e@mail.ru" )
-SET(CPACK_PACKAGE_VERSION "0.1")
-#set(CPACK_PACKAGE_VERSION_PATCH "${RFS_VERSION_BUILD}")
-set(CPACK_PACKAGE_INSTALL_DIRECTORY "qtd ${CPACK_PACKAGE_VERSION}")
-set(CPACK_PACKAGE_FILE_NAME "qtd-${CPACK_PACKAGE_VERSION}")
-set(CPACK_SOURCE_PACKAGE_FILE_NAME "qtd-${CPACK_PACKAGE_VERSION}")
-if(CMAKE_HOST_WIN32)
-    set(CPACK_GENERATOR "ZIP")
-elseif(CMAKE_HOST_UNIX)
-    set(CPACK_GENERATOR "TBZ2;DEB;RPM")
-endif(CMAKE_HOST_WIN32)
-include(CPack)
\ No newline at end of file
+#execute_process(COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_BINARY_DIR}/CMakeCache.txt)
+
+endif(NOT SECOND_RUN)
\ No newline at end of file
--- a/cmake/FindD.cmake	Sat Jul 18 15:06:12 2009 +0000
+++ b/cmake/FindD.cmake	Sun Jul 19 18:09:33 2009 +0000
@@ -2,7 +2,7 @@
 ## Variables.
 ##--------------------------------------------
 
-## Find D compiler and parsing its version.
+## Find D compiler and parse its version.
 find_program(DC NAMES dmd ldc)
 if (DC)   
     get_filename_component(dc_path ${DC} PATH)
@@ -30,15 +30,15 @@
 		string(REGEX REPLACE "based on DMD v([0-9])\\.[0-9]+" "\\1" D_VERSION "${ldc_version}")
 		string(REGEX REPLACE "based on DMD v[0-9]\\.([0-9]+)" "\\1" D_FRONTEND "${ldc_version}")	    
 	    else(ldc_version)
-		message(FATAL_ERROR "LDC compiler was found, but the version can not be processed")
+		message(FATAL_ERROR "LDC compiler found, but the version can not be processed")
 	    endif(ldc_version)
 	else (is_ldc) 
-	    message(FATAL_ERROR "D compliler not found")
+	    message(FATAL_ERROR "D compiler are not found")
 	endif(is_ldc)
     endif(dmd_version) 
     message(STATUS "D compiler found -- ${D_COMPILER_NAME} v${D_VERSION}.${D_FRONTEND}")
 else (DC)
-    message(FATAL_ERROR "D compliler not found")
+    message(FATAL_ERROR "D compliler are not found")
 endif (DC)
 
 ## Get D compiler path.
@@ -69,7 +69,7 @@
     set(D_MODULES_PER_OBJECT 10000 CACHE STRING "Max number of modules per object file")
 endif(NOT ONE_BUILD_COMMAND)
 
-## Specifics flags for build configurations.
+## Specific flags for build configurations.
 ## TODO: Add another targets.
 set(D_RELEASE_FLAGS -O -release)
 set(D_DEBUG_FLAGS -g )
@@ -488,7 +488,7 @@
 endmacro(add_d_shared_lib name)
 
 ## Add library target.
-## If it support library would shared.
+## Library would shared if it supported.
 macro(add_d_lib name)
     if(D_IS_MARS)
 	add_d_target(${name} TYPE STATIC ${ARGN})
--- a/generator/CMakeLists.txt	Sat Jul 18 15:06:12 2009 +0000
+++ b/generator/CMakeLists.txt	Sun Jul 19 18:09:33 2009 +0000
@@ -302,15 +302,11 @@
     if(d_inc_file_found)
 	set(${CMAKE_SOURCE_DIR}/generator/typesystem_${package}-java.java)
     endif(d_inc_file_found)
-endforeach(package ${packages})
+endforeach(package ${all_packages})
 mark_as_advanced(d_inc_file_found)
 set(d_inc_file_found 1)
 	
-foreach(package ${packages})   
-    set(dgen_impl ${CMAKE_BINARY_DIR}/cpp/qt_${package}/qt_${package}.pri) 
-    break(package ${packages}) 
-endforeach(package ${packages})    
-
+set(dgen_impl ${CMAKE_BINARY_DIR}/build/cpp/qt_core/ArrayOps_shell.cpp)
 if(CMAKE_HOST_WIN32)
     set(sep ";")
 else(CMAKE_HOST_WIN32)
@@ -322,22 +318,12 @@
 add_custom_command(OUTPUT ${dgen_impl}
 	COMMAND ${CMAKE_COMMAND} -E remove -f ${dgen_impl}
 	COMMAND "generator"
-	ARGS ${GEN_OPT}  --include-paths=${inc_paths} --output-directory=${CMAKE_BINARY_DIR}
+	ARGS ${GEN_OPT} --qt-include-directory=${QT_INCLUDE_DIR} 
+	    --output-directory=${CMAKE_BINARY_DIR}/build
 	    --source-directory=${CMAKE_SOURCE_DIR}/generator 
 	    qtjambi_masterinclude.h  
 	    ${CMAKE_BINARY_DIR}/CMakeFiles/build.txt
 	COMMENT "Generating binding..."
-	DEPENDS  generator ${gen_sources}
-	)       
-add_custom_target(dgen DEPENDS ${dgen_impl} COMMENT "")
-
-macro(add_sources_for_generating)
-    foreach(source ${ARGN})
-	add_custom_command(OUTPUT "${source}"
-		COMMAND ""
-		ARGS ""
-		DEPENDS ${dgen_impl}
-		COMMENT ""
-		)
-    endforeach(source ${ARGN})
-endmacro(add_sources_for_generating)
\ No newline at end of file
+	DEPENDS ${gen_sources} ${CMAKE_BINARY_DIR}/CMakeFiles/build.txt
+)       
+add_custom_target(dgen ALL DEPENDS ${dgen_impl} COMMENT "")