Update BUILD
[lqt/mk.git] / CMakeLists.txt
blob2dead4ee4ec4e695a9178b48f043e1209ff70c01
1 #  Copyright (c) 2008 Peter Kuemmel 
2 #  Copyright (c) 2008 Mauro Iazzi
3 #  Copyright (c) 2011 Michal Kottman
4 #  
5 #  Permission is hereby granted, free of charge, to any person
6 #  obtaining a copy of this software and associated documentation
7 #  files (the "Software"), to deal in the Software without
8 #  restriction, including without limitation the rights to use,
9 #  copy, modify, merge, publish, distribute, sublicense, and/or sell
10 #  copies of the Software, and to permit persons to whom the
11 #  Software is furnished to do so, subject to the following
12 #  conditions:
13 #  
14 #  The above copyright notice and this permission notice shall be
15 #  included in all copies or substantial portions of the Software.
16 #  
17 #  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 #  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
19 #  OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20 #  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21 #  HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22 #  WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 #  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 #  OTHER DEALINGS IN THE SOFTWARE.
26 cmake_minimum_required(VERSION 2.6)
28 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 find_package(Qt4 REQUIRED)
35 set(QT_USE_QTCORE 1)
36 set(QT_USE_QTGUI 1)
37 set(QT_USE_QTNETWORK 1)
38 set(QT_USE_QTWEBKIT 1)
39 set(QT_USE_QTOPENGL 1)
40 set(QT_USE_QTSCRIPT 1)
41 set(QT_USE_QTSVG 1)
42 set(QT_USE_QTUITOOLS 1) 
43 set(QT_USE_QTXML 1)
44 set(QT_USE_QTSQL 1)
45 set(QT_USE_QTXMLPATTERNS 1)
46 include(${QT_USE_FILE})
48 set(EXTRA_LUA_OPTIONS )
49 option(VERBOSE_BUILD "Create a verbose build which logs every binding call" OFF)
50 if(VERBOSE_BUILD)
51         add_definitions(-DVERBOSE_BUILD)
52         set(EXTRA_LUA_OPTIONS -v)
53 endif()
55 if(noqt)
56         set(QT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/test)
57         #set(nomerge TRUE)
58 endif()
60 find_package(Lua51 REQUIRED)
61 find_program(LUA_CMD NAMES luajit lua lua5.1 lua51)
63 if(WIN32)
64         if(MSVC)
65                 set(CMAKE_SUPPRESS_REGENERATION TRUE)
66                 add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS -DLUA_BUILD_AS_DLL /bigobj)
67                 set(CMAKE_DEBUG_POSTFIX)
68         endif()
69         if(MINGW)
70                 set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-add-stdcall-alias")
71         endif()
72         set(LUA_LIBS_FOR_MODULE ${LUA_LIBRARIES})
73 else(WIN32)
74         set(LUA_LIBS_FOR_MODULE )
75 endif(WIN32)
77 if(APPLE)
78    set(CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS
79        "${CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS} -flat_namespace -undefined dynamic_lookup")
80 endif(APPLE)
82 add_subdirectory(cpptoxml)
84 function(build_qt_lib_binding BINDING_HEADER)
86         string(TOLOWER ${BINDING_HEADER} BINDING_NAME)
88         # hardcoded in generator.lua
89         set (LQT_GEN_DIR ${CMAKE_BINARY_DIR}/${BINDING_NAME}_src)
90         file(MAKE_DIRECTORY ${LQT_GEN_DIR})
92         set (BINDING_SRC ${LQT_GEN_DIR}/${BINDING_NAME}_merged_build.cpp)
93         set_source_files_properties(${BINDING_SRC} PROPERTIES  GENERATED TRUE)
95         if (UNIX)
96                 set (PP_CONFIG ${CMAKE_SOURCE_DIR}/cpptoxml/parser/rpp/pp-qt-configuration)
97         else()
98                 set (PP_CONFIG ${CMAKE_SOURCE_DIR}/cpptoxml/parser/rpp/pp-qt-configuration-win)
99         endif()
101         if(NOT REUSE_FILES)
102                 set (GEN_XML ${LQT_GEN_DIR}/${BINDING_NAME}.xml)
103                 add_custom_target(generate_${BINDING_NAME}_xml
104                                                         COMMAND cpptoxml
105                                                                 ${BINDING_HEADER}
106                                                                 -C ${PP_CONFIG}
107                                                                 -Q ${QT_INCLUDE_DIR} 
108                                                                 -o ${GEN_XML}
109                                                         COMMENT "Generating XML: running cpptoxml on ${BINDING_NAME} "
110                                                         VERBATIM)
112                 math(EXPR MAX ${ARGC}-1)
113                 if(MAX)
114                         foreach(I RANGE 1 ${MAX})
115                                 string(TOLOWER ${ARGV${I}} DEPNAME)
116                                 set(${BINDING_NAME}_TYPES ${${BINDING_NAME}_TYPES} -t ${DEPNAME}_src/${DEPNAME}_types.lua)
117                                 set(${BINDING_NAME}_DEPENDS ${${BINDING_NAME}_DEPENDS} generate_${DEPNAME}_cpp)
118                         endforeach()
119                 endif()
120                 
121                 add_custom_target(generate_${BINDING_NAME}_cpp
122                                                         COMMAND ${LUA_CMD}
123                                                                 "${CMAKE_SOURCE_DIR}/generator/generator.lua" 
124                                                                 ${GEN_XML}
125                                                                 ${EXTRA_LUA_OPTIONS}
126                                                                 -i ${BINDING_HEADER} -i lqt_qt.hpp 
127                                                                 -n ${BINDING_NAME} 
128                                                                 -t ${CMAKE_SOURCE_DIR}/generator/qtypes.lua
129                                                                 ${${BINDING_NAME}_TYPES}
130                                                                 -f ${CMAKE_SOURCE_DIR}/generator/qt_internal.lua
131                                                         COMMENT "Generating binding code with Lua"
132                                                         VERBATIM)
133         else()
134                 add_custom_target(generate_${BINDING_NAME}_xml  COMMAND
135                                                         COMMENT "Reusing old XML on ${BINDING_NAME} "
136                                                         VERBATIM)
137                 add_custom_target(generate_${BINDING_NAME}_cpp
138                                                         COMMENT "Reusing old binding code with Lua"
139                                                         VERBATIM)
140         endif()
142         set(COMMON COMMON_${BINDING_NAME})
143         file(GLOB ${COMMON}_SRC ${CMAKE_SOURCE_DIR}/common/*.cpp)
144         file(GLOB ${COMMON}_HPP ${CMAKE_SOURCE_DIR}/common/*.hpp)
147         set(${BINDING_NAME}_GENERATED ${LQT_GEN_DIR}/${BINDING_NAME}_enum.cpp
148                                                                         ${LQT_GEN_DIR}/${BINDING_NAME}_meta.cpp
149                                                                         ${LQT_GEN_DIR}/${BINDING_NAME}_slot.cpp)
150         set_source_files_properties(${${BINDING_NAME}_GENERATED} PROPERTIES GENERATED TRUE)
152         if(nomerge)
153                 #TODO fix this build process:
154                 #       1. cmake ../lqt -Dnomerge=1
155                 #       2. make -> will generate cpp files but they are not part of the Makefile (GLOB was at 1.)
156                 #       3. cmake ../lqt -Dnomerge=1 -> GLOB now finds the generated cpp files
157                 #       4. make
158                 file(GLOB BINDING_SRC ${LQT_GEN_DIR}/*.cpp) 
159                 set(${COMMON}_SRC)
160                 list(REMOVE_ITEM BINDING_SRC ${LQT_GEN_DIR}/${BINDING_NAME}_merged_build.cpp)
161         else()                          
162                 set(${COMMON}_SRC ${${COMMON}_SRC}      ${${BINDING_NAME}_GENERATED})
163         endif()
165         qt4_wrap_cpp(${COMMON}_MOC ${LQT_GEN_DIR}/${BINDING_NAME}_slot.hpp)
166         
167         include_directories(${CMAKE_SOURCE_DIR}/common ${LUA_INCLUDE_DIR} ${QT_INCLUDES})
169         add_library(${BINDING_NAME} MODULE ${BINDING_SRC}
170                                                                                         ${${COMMON}_SRC}
171                                                                                         ${${COMMON}_HPP} 
172                                                                                         ${${COMMON}_MOC})
173                                                                                         
174         target_link_libraries(${BINDING_NAME} ${QT_LIBRARIES} ${LUA_LIBS_FOR_MODULE})
175         set_target_properties(${BINDING_NAME} PROPERTIES PREFIX "" COMPILE_DEFINITIONS "MODULE_${BINDING_NAME}")
177         if(LQT_BUILDIN_CPPTOXML)
178                 add_dependencies(generate_${BINDING_NAME}_xml  cpptoxml)
179         endif()
181         add_dependencies(generate_${BINDING_NAME}_cpp  generate_${BINDING_NAME}_xml ${${BINDING_NAME}_DEPENDS})
182         add_dependencies(${BINDING_NAME} generate_${BINDING_NAME}_cpp)
183 endfunction()
185 if(noqt)
186         include_directories(${CMAKE_CURRENT_SOURCE_DIR}/test/noqt)
187         build_qt_lib_binding(noqt)
188 else()
189         build_qt_lib_binding(QtCore)
190         build_qt_lib_binding(QtNetwork QtCore)
191         build_qt_lib_binding(QtGui QtNetwork QtCore)
192         build_qt_lib_binding(QtScript QtGui QtNetwork QtCore)
193         build_qt_lib_binding(QtOpenGL QtGui QtNetwork QtCore)
194         build_qt_lib_binding(QtSvg QtScript QtGui QtNetwork QtCore)
195         build_qt_lib_binding(QtXml QtSvg QtScript QtGui QtNetwork QtCore)
196         build_qt_lib_binding(QtXmlPatterns QtCore QtXml)
197         build_qt_lib_binding(QtUiTools QtCore QtGui QtXml) 
198         build_qt_lib_binding(QtWebKit QtXmlPatterns QtSvg QtScript QtOpenGL QtGui QtNetwork QtCore QtXml)
199         build_qt_lib_binding(QtSql QtCore)
200         # TODO
201         #build_qt_lib_binding(QtScriptTools) # 4.5 only
202         #build_qt_lib_binding(Phonon)
203 endif()