changeset 42:eb3b5bbffc8f

CMake: generator is not running multiple times. generator: packages can have dependencies now (but this do not used in real code yet).
author SokoL_SD
date Sun, 17 May 2009 15:53:27 +0000
parents 691e68637348
children bfc76a437a62
files CMakeLists.txt build/opengl.txt generator/CMakeLists.txt generator/abstractmetalang.h generator/typesystem.cpp generator/typesystem.h generator/typesystem_gui.xml generator/typesystem_opengl.xml
diffstat 8 files changed, 103 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/CMakeLists.txt	Sun May 17 12:41:14 2009 +0000
+++ b/CMakeLists.txt	Sun May 17 15:53:27 2009 +0000
@@ -53,6 +53,13 @@
     message(FATAL_ERROR "D compliler not founded")
 endif (DC)
 
+# find_program(DC_TMP ${DC})
+# mark_as_advanced(DC_TMP)
+# string(REGEX MATCH "([A-Za-z\\.0-9/_\\ ]+)(/bin)/[A-Za-z\\.0-9/_\\ ]+" "\\1" dc_path "${DC_PATH}")
+# if(NOT "${DC_TMP}" STREQUAL "${dc_path}")
+#     set(CMAKE_INSTALL_PREFIX ${dc_path})
+# endif(NOT "${DC_TMP}" STREQUAL "${dc_path}")
+
 if(D_IS_MARS)
     option(SINGLE_D_OBJECT "Build all d sources to one object file" "ON")
 elseif(D_IS_LLVM)
@@ -322,7 +329,6 @@
 file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
 add_custom_target(allpackages ALL)
 link_directories(${CMAKE_BINARY_DIR}/CMakeFiles)
-#add_dgen_target(all ${packages})
 
 foreach(package_big ${all_packages})
     string(TOLOWER ${package_big} package) 
@@ -345,7 +351,7 @@
 
     set(all_req_found 1)
     string(TOUPPER ${package} package_upper)
-    option(BUILD_QT_${package_upper} "Build Qt${package}" "ON")
+    option(BUILD_QT_${package_upper} "Build Qt${package_big}" "ON")
     if(BUILD_QT_${package_upper})
 	foreach(req ${required})
 	    set(req_found)
@@ -547,12 +553,11 @@
     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_subdirectory(generator)
 add_sources_for_generating(${files_for_gen})	
 
 ##--------------------------------------------
--- a/build/opengl.txt	Sun May 17 12:41:14 2009 +0000
+++ b/build/opengl.txt	Sun May 17 15:53:27 2009 +0000
@@ -9,5 +9,5 @@
     )
 if(${CMAKE_SYSTEM_NAME} STREQUAL Windows AND D_IS_MARS)
     set(link_example opengl32 glu32)
-    install(FILES ${link_example} DESTINATION lib)
+    install(FILES lib/opengl32.lib lib/glu32.lib DESTINATION lib)
 endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows AND D_IS_MARS)
\ No newline at end of file
--- a/generator/CMakeLists.txt	Sun May 17 12:41:14 2009 +0000
+++ b/generator/CMakeLists.txt	Sun May 17 15:53:27 2009 +0000
@@ -245,44 +245,67 @@
 endforeach(package ${packages})
 file(APPEND ${dgen_build_conf} "</typesystem>\n")
 
-# foreach(dgen_impl ${files_for_gen})
-#     add_custom_command(OUTPUT ${dgen_impl}
-# 			COMMAND ${CMAKE_COMMAND} -E remove -f ${dgen_impl}
-# 			COMMAND "generator"
-# 			ARGS ${GEN_OPT}  --qt-include-directory=${QT_INCLUDE_DIR} --output-directory=${CMAKE_BINARY_DIR}
-# 			    --source-directory=${CMAKE_SOURCE_DIR}/generator
-# 			    qtjambi_masterinclude.h 
-# 			    ${dgen_build_conf}
-# 			COMMENT "Generating binding..."
-# 			DEPENDS  generator ${gen_typesystem} ${gen_sources} 
-# 		    )
-# endforeach(dgen_impl ${files_for_gen})
-add_custom_target(dgen COMMENT "")
+# macro(add_sources_for_generating)	
+#     set(parameters_list_file ${CMAKE_BINARY_DIR}/CMakeFiles/dgen_parameters)
+#     if(${CMAKE_SYSTEM_NAME} STREQUAL Windows)	
+# 	file(REMOVE ${parameters_list_file})
+# 	foreach(arg ${ARGN})
+# 	    file(APPEND ${parameters_list_file} "${arg}\n")
+# 	endforeach(arg)
+# 	set(param @${parameters_list_file})
+#     elseif(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
+# 	set(param ${parameters})
+#     endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows)
+#     foreach(dgen_impl ${ARGN})
+# 	add_custom_command(OUTPUT ${dgen_impl}
+# 			    COMMAND ${CMAKE_COMMAND} -E remove -f ${param}
+# 			    COMMAND "generator"
+# 			    ARGS ${GEN_OPT}  --qt-include-directory=${QT_INCLUDE_DIR} --output-directory=${CMAKE_BINARY_DIR}
+# 							--source-directory=${CMAKE_SOURCE_DIR}/generator 
+# 							qtjambi_masterinclude.h  
+# 							${CMAKE_BINARY_DIR}/CMakeFiles/build.txt
+# 			    COMMENT "Generating binding..."
+# 			    DEPENDS  generator ${gen_typesystem} ${gen_sources} 
+# 			)
+#     endforeach(dgen_impl ${ARGN})
+#     add_custom_target(dgen DEPENDS ${ARGN})
+# endmacro(add_sources_for_generating)
 
-macro(add_sources_for_generating)	
-    set(parameters_list_file ${CMAKE_BINARY_DIR}/CMakeFiles/dgen_parameters)
-    if(${CMAKE_SYSTEM_NAME} STREQUAL Windows)	
-	file(REMOVE ${parameters_list_file})
-	foreach(arg ${ARGN})
-	    file(APPEND ${parameters_list_file} "${arg}\n")
-	endforeach(arg)
-	set(param @${parameters_list_file})
-    elseif(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
-	set(param ${parameters})
-    endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows)
-    foreach(dgen_impl ${ARGN})
+set(gen_sources)
+foreach(package ${packages})   
+    set(gen_sources ${gen_sources} ${CMAKE_SOURCE_DIR}/generator/typesystem_${package}.xml)
+    find_file(d_inc_file_found typesystem_${package}-java.java PATHS ${CMAKE_SOURCE_DIR}/generator/) 
+    if(d_inc_file_found)
+	set(${CMAKE_SOURCE_DIR}/generator/typesystem_${package}-java.java)
+    endif(d_inc_file_found)
+endforeach(package ${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})    
 
-	add_custom_command(OUTPUT ${dgen_impl}
-			    COMMAND ${CMAKE_COMMAND} -E remove -f ${param}
-			    COMMAND "generator"
-			    ARGS ${GEN_OPT}  --qt-include-directory=${QT_INCLUDE_DIR} --output-directory=${CMAKE_BINARY_DIR}
-							--source-directory=${CMAKE_SOURCE_DIR}/generator 
-							qtjambi_masterinclude.h  
-							${CMAKE_BINARY_DIR}/CMakeFiles/build.txt
-			    COMMENT "Generating binding..."
-			    DEPENDS  generator ${gen_typesystem} ${gen_sources} 
-			)
-	#add_custom_target(${target_name} DEPENDS ${dgen_impl})
-	#add_dependencies(dgen ${target_name})
-    endforeach(dgen_impl ${ARGN})
+add_custom_command(OUTPUT ${dgen_impl}
+	COMMAND ${CMAKE_COMMAND} -E remove -f ${dgen_impl}
+	COMMAND "generator"
+	ARGS ${GEN_OPT}  --qt-include-directory=${QT_INCLUDE_DIR} --output-directory=${CMAKE_BINARY_DIR}
+	    --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
--- a/generator/abstractmetalang.h	Sun May 17 12:41:14 2009 +0000
+++ b/generator/abstractmetalang.h	Sun May 17 15:53:27 2009 +0000
@@ -843,6 +843,7 @@
     void setTypeAlias(bool typeAlias) { m_is_type_alias = typeAlias; }
     bool isTypeAlias() const { return m_is_type_alias; }
 
+    const QStringList &depends() { return m_type_entry->depends(); }
 private:
     uint m_namespace : 1;
     uint m_qobject : 1;
--- a/generator/typesystem.cpp	Sun May 17 12:41:14 2009 +0000
+++ b/generator/typesystem.cpp	Sun May 17 15:53:27 2009 +0000
@@ -95,6 +95,7 @@
         SimpleMask                  = 0xf00,
         // qtd stuff
         AddClass                    = 0x1100,
+        PackageDepend               = 0x1200,
 
         // Code snip tags (0x1000, 0x2000, ... , 0xf000)
         InjectCode =           0x1000,
@@ -181,6 +182,8 @@
         // qtd
         tagNames["add-class"] = StackElement::AddClass;
         tagNames["store-result"] = StackElement::StoreResult;
+
+        tagNames["package-depend"] = StackElement::PackageDepend;
     }
 
     bool startElement(const QString &namespaceURI, const QString &localName,
@@ -217,6 +220,7 @@
     QHash<QString, StackElement::ElementType> tagNames;
 
     QString m_source_dir;
+    QStringList m_defaultDepends;
 };
 
 bool Handler::error(const QXmlParseException &e)
@@ -565,6 +569,7 @@
             element->entry = m_current_enum;
             m_current_enum->setCodeGeneration(m_generate);
             m_current_enum->setTargetLangPackage(m_defaultPackage);
+            //m_current_enum->setDepends(m_defaultDepends); // For enums its not needed?
             m_current_enum->setUpperBound(attributes["upper-bound"]);
             m_current_enum->setLowerBound(attributes["lower-bound"]);
             m_current_enum->setForceInteger(convertBoolean(attributes["force-integer"], "force-integer", false));
@@ -633,6 +638,7 @@
 
                 ComplexTypeEntry *ctype = static_cast<ComplexTypeEntry *>(element->entry);
                 ctype->setTargetLangPackage(attributes["package"]);
+                //ctype->setDepends(m_defaultDepends);
                 ctype->setDefaultSuperclass(attributes["default-superclass"]);
                 ctype->setGenericClass(convertBoolean(attributes["generic-class"], "generic-class", false));
 
@@ -683,7 +689,10 @@
                 // ctype->setInclude(Include(Include::IncludePath, ctype->name()));
                 ctype = ctype->designatedInterface();
                 if (ctype != 0)
+                {
                     ctype->setTargetLangPackage(attributes["package"]);
+                    ctype->setDepends(m_defaultDepends);
+                }
             }
             break;
         default:
@@ -701,7 +710,8 @@
       || element->type == StackElement::Rejection
       || element->type == StackElement::LoadTypesystem
       || element->type == StackElement::InjectCode
-      || element->type == StackElement::Template;
+      || element->type == StackElement::Template
+      || element->type == StackElement::PackageDepend;
 
         if (!topLevel && current->type == StackElement::Root) {
             m_error = QString("Tag requires parent: '%1'").arg(tagName);
@@ -819,6 +829,9 @@
         case StackElement::AddClass:
             attributes["name"] = QString();
             break;
+        case StackElement::PackageDepend:
+            attributes["package"] = QString();
+            break;
         default:
             ; // nada
         };
@@ -1444,6 +1457,16 @@
             }
             element->parent->value.templateInstance->addReplaceRule(attributes["from"],attributes["to"]);
             break;
+        case StackElement::PackageDepend:
+            {
+                QString package = attributes["package"];
+                if (package.isEmpty()) {
+                    m_error = "bad package depend entry";
+                    return false;
+                }
+                m_defaultDepends << package;
+            }
+            break;
         default:
             break; // nada
         };
--- a/generator/typesystem.h	Sun May 17 12:41:14 2009 +0000
+++ b/generator/typesystem.h	Sun May 17 15:53:27 2009 +0000
@@ -879,6 +879,9 @@
     bool isAbstract() const { return m_isAbstract; }
     void setAbstract(bool isAbstract) { m_isAbstract = isAbstract; }
 
+    void setDepends(const QStringList &depends) {m_depends = depends; }
+    const QStringList &depends() {return m_depends; }
+
     QString addedTo;
     QStringList includedClasses;
 
@@ -908,6 +911,7 @@
     // qtd
     bool m_isStructInD;
     bool m_isAbstract;
+    QStringList m_depends;
 };
 
 class ContainerTypeEntry : public ComplexTypeEntry
--- a/generator/typesystem_gui.xml	Sun May 17 12:41:14 2009 +0000
+++ b/generator/typesystem_gui.xml	Sun May 17 15:53:27 2009 +0000
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <typesystem package="qt.gui" default-superclass="QtDObject">
+<package-depend package="qt.core" />
 <inject-code>
         qt.Utilities.loadQtLibrary("QtGui");
 </inject-code>
--- a/generator/typesystem_opengl.xml	Sun May 17 12:41:14 2009 +0000
+++ b/generator/typesystem_opengl.xml	Sun May 17 15:53:27 2009 +0000
@@ -2,6 +2,8 @@
 <?xml-stylesheet type="text/xsl" href="merge.xsl"?>
 
 <typesystem package="qt.opengl" default-superclass="QtDObject">
+<package-depend package="qt.core" />
+<package-depend package="qt.gui" />
 <inject-code>
     qt.Utilities.loadQtLibrary("QtGui");
     qt.Utilities.loadQtLibrary("QtOpenGL");