fixed generation of copy constructor
[lqt/mk.git] / CMakeLists.txt
blob0389d8a402b438eac4e3dbc254665a7feeff0594
1 #  Copyright (c) 2008 Peter Kuemmel 
2 #  Copyright (c) 2008 Mauro Iazzi
3 #  
4 #  Permission is hereby granted, free of charge, to any person
5 #  obtaining a copy of this software and associated documentation
6 #  files (the "Software"), to deal in the Software without
7 #  restriction, including without limitation the rights to use,
8 #  copy, modify, merge, publish, distribute, sublicense, and/or sell
9 #  copies of the Software, and to permit persons to whom the
10 #  Software is furnished to do so, subject to the following
11 #  conditions:
12 #  
13 #  The above copyright notice and this permission notice shall be
14 #  included in all copies or substantial portions of the Software.
15 #  
16 #  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 #  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18 #  OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 #  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20 #  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21 #  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 #  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23 #  OTHER DEALINGS IN THE SOFTWARE.
25 cmake_minimum_required(VERSION 2.6)
27 project(lqt)
30 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY  ${CMAKE_BINARY_DIR}/bin) 
31 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY  ${CMAKE_BINARY_DIR}/lib) 
32 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY  ${CMAKE_BINARY_DIR}/lib) 
34 #set(CMAKE_VERBOSE_MAKEFILE TRUE)
36 set(SYSTEM_LUA 1)
38 find_package(Qt4 REQUIRED)
39 set(QT_USE_QTCORE 1)
40 set(QT_USE_QTGUI 1)
41 set(QT_USE_QTNETWORK 1)
42 set(QT_USE_QTWEBKIT 1)
43 set(QT_USE_QTOPENGL 1)
44 set(QT_USE_QTSCRIPT 1)
45 set(QT_USE_QTSVG 1)
46 set(QT_USE_QTXML 1)
47 #set(QT_USE_QTSQL 1)
48 set(QT_USE_QTXMLPATTERNS 1)
49 include(${QT_USE_FILE})
51 if(noqt)
52         set(QT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/test)
53         #set(nomerge TRUE)
54 endif()
56 if(SYSTEM_LUA)
57         find_package(Lua51 REQUIRED)
58         set(LUA_INCLUDE_DIRS ${LUA_INCLUDE_DIR})
59         set(LUA_CMD lua)
60 else()
61         add_subdirectory(lua)
62         set(LUA_CMD luaexec)
63         set(LUA_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/lua/lua/src)
64         set(LUA_LIBRARIES lua)
65 endif()
67 if(MSVC)
68         set(CMAKE_SUPPRESS_REGENERATION TRUE) 
69         add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS -DLUA_BUILD_AS_DLL)
70         set(CMAKE_DEBUG_POSTFIX)
71 endif()
73 if(MINGW)
74         set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-add-stdcall-alias")
75         SET(CMAKE_VERBOSE_MAKEFILE ON)
76 endif()
79 macro(lqt_files name folder)
80         file(GLOB ${name}_sources ${folder}/*.cpp) 
81         file(GLOB ${name}_headers ${folder}/*.hpp) 
82         qt4_wrap_cpp(${name}_moc ${${name}_headers})
83         qt4_automoc(${${name}_sources})
84         set(${name}_src ${${name}_sources} ${${name}_moc})      
85         set(${name}_h ${${name}_headers})
86         source_group(generated FILES ${${name}_moc})
87         project_source_group("${GROUP_CODE}" ${name}_sources ${name}_headers)
88 endmacro()
91 # folders in the msvc projects 
92 # mode==flat  : headers and sources not in folders 
93 # mode==split : standard behavior of cmake, split headers and sources 
94 # mode==<other values> : code is in this folder 
95 macro(project_source_group mode sources headers) 
96         if(${mode} MATCHES "flat") 
97                 source_group("Source Files" Files) 
98                 source_group("Header Files" Files) 
99                 source_group("cmake" FILES CMakeLists.txt) 
100         else() 
101                 if(NOT ${mode} MATCHES "split") 
102                         source_group("${mode}" FILES ${${sources}} ${${headers}}) 
103                 endif() 
104         endif() 
105 endmacro()
106 set(GROUP_CODE "Source Files")
108 set(LQT_BUILDIN_CPPTOXML 1)
109 if(LQT_BUILDIN_CPPTOXML)
110         add_subdirectory(cpptoxml)
111 else()
112         #TODO find cpptpxml
113 endif()
116 function(build_qt_lib_binding BINDING_HEADER)
118         string(TOLOWER ${BINDING_HEADER} BINDING_NAME)
120         # hardcoded in generator.lua
121         set (LQT_GEN_DIR ${CMAKE_BINARY_DIR}/${BINDING_NAME}_src)
122         file(MAKE_DIRECTORY ${LQT_GEN_DIR})
124         set (BINDING_SRC ${LQT_GEN_DIR}/${BINDING_NAME}_merged_build.cpp)
125         set_source_files_properties(${BINDING_SRC} PROPERTIES  GENERATED TRUE)
127         if (UNIX)
128                 set (PP_CONFIG ${CMAKE_SOURCE_DIR}/cpptoxml/parser/rpp/pp-qt-configuration)
129         else()
130                 set (PP_CONFIG ${CMAKE_SOURCE_DIR}/cpptoxml/parser/rpp/pp-qt-configuration-win)
131         endif()
133         if(NOT REUSE_FILES)
134                 set (GEN_XML ${LQT_GEN_DIR}/${BINDING_NAME}.xml)
135                 add_custom_target(generate_${BINDING_NAME}_xml  COMMAND cpptoxml 
136                                                                 ${BINDING_HEADER} 
137                                                                 -C ${PP_CONFIG}
138                                                                 -Q ${QT_INCLUDE_DIR} 
139                                                                 -o ${GEN_XML}
140                                                         COMMENT "Generating XML: running cpptoxml on ${BINDING_NAME} "
141                                                         VERBATIM)
144                 math(EXPR MAX ${ARGC}-1)
145                 if(MAX)
146                         foreach(I RANGE 1 ${MAX})
147                                 string(TOLOWER ${ARGV${I}} DEPNAME)
148                                 set(${BINDING_NAME}_TYPES ${${BINDING_NAME}_TYPES} -t ${DEPNAME}_src/${DEPNAME}_types.lua)
149                                 set(${BINDING_NAME}_DEPENDS ${${BINDING_NAME}_DEPENDS} generate_${DEPNAME}_cpp)
150                         endforeach()
151                 endif()
152                 
153                 add_custom_target(generate_${BINDING_NAME}_cpp
154                                                         COMMAND ${LUA_CMD}
155                                                                 "${CMAKE_SOURCE_DIR}/generator/generator.lua" 
156                                                                 ${GEN_XML} 
157                                                                 -i ${BINDING_HEADER} -i lqt_qt.hpp 
158                                                                 -n ${BINDING_NAME} 
159                                                                 -t ${CMAKE_SOURCE_DIR}/generator/qtypes.lua
160                                                                 ${${BINDING_NAME}_TYPES}
161                                                                 -f ${CMAKE_SOURCE_DIR}/generator/qt_internal.lua
162                                                         COMMENT "Generating binding code with Lua"
163                                                         VERBATIM)
164         else()
165                 add_custom_target(generate_${BINDING_NAME}_xml  COMMAND
166                                                         COMMENT "Reusing old XML on ${BINDING_NAME} "
167                                                         VERBATIM)
168                 add_custom_target(generate_${BINDING_NAME}_cpp
169                                                         COMMENT "Reusing old binding code with Lua"
170                                                         VERBATIM)
171         endif()
173         set(COMMON COMMON_${BINDING_NAME})
174         file(GLOB ${COMMON}_SRC ${CMAKE_SOURCE_DIR}/common/*.cpp)
175         file(GLOB ${COMMON}_HPP ${CMAKE_SOURCE_DIR}/common/*.hpp)
178         set(${BINDING_NAME}_GENERATED ${LQT_GEN_DIR}/${BINDING_NAME}_enum.cpp
179                                                                         ${LQT_GEN_DIR}/${BINDING_NAME}_meta.cpp
180                                                                         ${LQT_GEN_DIR}/${BINDING_NAME}_slot.cpp)
181         set_source_files_properties(${${BINDING_NAME}_GENERATED} PROPERTIES GENERATED TRUE)
183         if(nomerge)
184                 #TODO fix this build process:
185                 #       1. cmake ../lqt -Dnomerge=1
186                 #       2. make -> will generate cpp files but they are not part of the Makefile (GLOB was at 1.)
187                 #       3. cmake ../lqt -Dnomerge=1 -> GLOB now finds the generated cpp files
188                 #       4. make
189                 file(GLOB BINDING_SRC ${LQT_GEN_DIR}/*.cpp) 
190                 set(${COMMON}_SRC)
191                 list(REMOVE_ITEM BINDING_SRC ${LQT_GEN_DIR}/${BINDING_NAME}_merged_build.cpp)
192         else()                          
193                 set(${COMMON}_SRC ${${COMMON}_SRC}      ${${BINDING_NAME}_GENERATED})
194         endif()
196         qt4_wrap_cpp(${COMMON}_MOC ${LQT_GEN_DIR}/${BINDING_NAME}_slot.hpp)
197         
198         include_directories(${CMAKE_SOURCE_DIR}/common ${LUA_INCLUDE_DIRS} ${QT_INCLUDES})
200         add_library(${BINDING_NAME} SHARED  ${BINDING_SRC}
201                                                                                         ${${COMMON}_SRC}
202                                                                                         ${${COMMON}_HPP} 
203                                                                                         ${${COMMON}_MOC})
204                                                                                         
205         target_link_libraries(${BINDING_NAME} ${QT_LIBRARIES} ${LUA_LIBRARIES})         
206         set_target_properties(${BINDING_NAME} PROPERTIES PREFIX "")
208         if(LQT_BUILDIN_CPPTOXML)
209                 add_dependencies(generate_${BINDING_NAME}_xml  cpptoxml)
210         endif()
212         add_dependencies(generate_${BINDING_NAME}_cpp  generate_${BINDING_NAME}_xml ${${BINDING_NAME}_DEPENDS})
213         add_dependencies(${BINDING_NAME} generate_${BINDING_NAME}_cpp)
214         if(NOT SYSTEM_LUA)
215                 add_dependencies(generate_${BINDING_NAME}_cpp luaexec)
216         endif()
217         
218         install(TARGETS ${BINDING_NAME} LIBRARY DESTINATION /usr/lib/lua/5.1)
219 endfunction()
221 if(noqt)
222         include_directories(${CMAKE_CURRENT_SOURCE_DIR}/test/noqt)
223         build_qt_lib_binding(noqt)
224 else()
225         build_qt_lib_binding(QtCore)
226         build_qt_lib_binding(QtNetwork QtCore)
227         build_qt_lib_binding(QtGui QtNetwork QtCore)
228         build_qt_lib_binding(QtScript QtGui QtNetwork QtCore)
229         build_qt_lib_binding(QtOpenGL QtGui QtNetwork QtCore)
230         build_qt_lib_binding(QtSvg QtScript QtGui QtNetwork QtCore)
231         build_qt_lib_binding(QtXml QtSvg QtScript QtGui QtNetwork QtCore)
232         build_qt_lib_binding(QtXmlPatterns QtCore QtXml)
233         build_qt_lib_binding(QtWebKit QtXmlPatterns QtSvg QtScript QtOpenGL QtGui QtNetwork QtCore QtXml)
234         # TODO
235         #build_qt_lib_binding(QtSql)
236         #build_qt_lib_binding(QtScriptTools) # 4.5 only
237         #build_qt_lib_binding(Phonon)
238 endif()