1 # Copyright (c) 2008 Peter Kuemmel
2 # Copyright (c) 2008 Mauro Iazzi
3 # Copyright (c) 2011 Michal Kottman
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
14 # The above copyright notice and this permission notice shall be
15 # included in all copies or substantial portions of the Software.
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)
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)
37 set(QT_USE_QTNETWORK 1)
38 set(QT_USE_QTWEBKIT 1)
39 set(QT_USE_QTOPENGL 1)
40 set(QT_USE_QTSCRIPT 1)
42 set(QT_USE_QTUITOOLS 1)
45 set(QT_USE_QTXMLPATTERNS 1)
46 include(${QT_USE_FILE})
49 set(QT_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/test)
53 find_package(Lua51 REQUIRED)
54 find_program(LUA_CMD NAMES luajit lua lua5.1 lua51)
58 set(CMAKE_SUPPRESS_REGENERATION TRUE)
59 add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS -DLUA_BUILD_AS_DLL /bigobj)
60 set(CMAKE_DEBUG_POSTFIX)
63 set(CMAKE_SHARED_LINKER_FLAGS "-Wl,-add-stdcall-alias")
65 set(LUA_LIBS_FOR_MODULE ${LUA_LIBRARIES})
67 set(LUA_LIBS_FOR_MODULE )
71 set(CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS
72 "${CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS} -flat_namespace -undefined dynamic_lookup")
75 add_subdirectory(cpptoxml)
77 function(build_qt_lib_binding BINDING_HEADER)
79 string(TOLOWER ${BINDING_HEADER} BINDING_NAME)
81 # hardcoded in generator.lua
82 set (LQT_GEN_DIR ${CMAKE_BINARY_DIR}/${BINDING_NAME}_src)
83 file(MAKE_DIRECTORY ${LQT_GEN_DIR})
85 set (BINDING_SRC ${LQT_GEN_DIR}/${BINDING_NAME}_merged_build.cpp)
86 set_source_files_properties(${BINDING_SRC} PROPERTIES GENERATED TRUE)
89 set (PP_CONFIG ${CMAKE_SOURCE_DIR}/cpptoxml/parser/rpp/pp-qt-configuration)
91 set (PP_CONFIG ${CMAKE_SOURCE_DIR}/cpptoxml/parser/rpp/pp-qt-configuration-win)
95 set (GEN_XML ${LQT_GEN_DIR}/${BINDING_NAME}.xml)
96 add_custom_target(generate_${BINDING_NAME}_xml
102 COMMENT "Generating XML: running cpptoxml on ${BINDING_NAME} "
105 math(EXPR MAX ${ARGC}-1)
107 foreach(I RANGE 1 ${MAX})
108 string(TOLOWER ${ARGV${I}} DEPNAME)
109 set(${BINDING_NAME}_TYPES ${${BINDING_NAME}_TYPES} -t ${DEPNAME}_src/${DEPNAME}_types.lua)
110 set(${BINDING_NAME}_DEPENDS ${${BINDING_NAME}_DEPENDS} generate_${DEPNAME}_cpp)
114 add_custom_target(generate_${BINDING_NAME}_cpp
116 "${CMAKE_SOURCE_DIR}/generator/generator.lua"
118 -i ${BINDING_HEADER} -i lqt_qt.hpp
120 -t ${CMAKE_SOURCE_DIR}/generator/qtypes.lua
121 ${${BINDING_NAME}_TYPES}
122 -f ${CMAKE_SOURCE_DIR}/generator/qt_internal.lua
123 COMMENT "Generating binding code with Lua"
126 add_custom_target(generate_${BINDING_NAME}_xml COMMAND
127 COMMENT "Reusing old XML on ${BINDING_NAME} "
129 add_custom_target(generate_${BINDING_NAME}_cpp
130 COMMENT "Reusing old binding code with Lua"
134 set(COMMON COMMON_${BINDING_NAME})
135 file(GLOB ${COMMON}_SRC ${CMAKE_SOURCE_DIR}/common/*.cpp)
136 file(GLOB ${COMMON}_HPP ${CMAKE_SOURCE_DIR}/common/*.hpp)
139 set(${BINDING_NAME}_GENERATED ${LQT_GEN_DIR}/${BINDING_NAME}_enum.cpp
140 ${LQT_GEN_DIR}/${BINDING_NAME}_meta.cpp
141 ${LQT_GEN_DIR}/${BINDING_NAME}_slot.cpp)
142 set_source_files_properties(${${BINDING_NAME}_GENERATED} PROPERTIES GENERATED TRUE)
145 #TODO fix this build process:
146 # 1. cmake ../lqt -Dnomerge=1
147 # 2. make -> will generate cpp files but they are not part of the Makefile (GLOB was at 1.)
148 # 3. cmake ../lqt -Dnomerge=1 -> GLOB now finds the generated cpp files
150 file(GLOB BINDING_SRC ${LQT_GEN_DIR}/*.cpp)
152 list(REMOVE_ITEM BINDING_SRC ${LQT_GEN_DIR}/${BINDING_NAME}_merged_build.cpp)
154 set(${COMMON}_SRC ${${COMMON}_SRC} ${${BINDING_NAME}_GENERATED})
157 qt4_wrap_cpp(${COMMON}_MOC ${LQT_GEN_DIR}/${BINDING_NAME}_slot.hpp)
159 include_directories(${CMAKE_SOURCE_DIR}/common ${LUA_INCLUDE_DIR} ${QT_INCLUDES})
161 add_library(${BINDING_NAME} MODULE ${BINDING_SRC}
166 target_link_libraries(${BINDING_NAME} ${QT_LIBRARIES} ${LUA_LIBS_FOR_MODULE})
167 set_target_properties(${BINDING_NAME} PROPERTIES PREFIX "" COMPILE_DEFINITIONS "MODULE_${BINDING_NAME}")
169 if(LQT_BUILDIN_CPPTOXML)
170 add_dependencies(generate_${BINDING_NAME}_xml cpptoxml)
173 add_dependencies(generate_${BINDING_NAME}_cpp generate_${BINDING_NAME}_xml ${${BINDING_NAME}_DEPENDS})
174 add_dependencies(${BINDING_NAME} generate_${BINDING_NAME}_cpp)
178 include_directories(${CMAKE_CURRENT_SOURCE_DIR}/test/noqt)
179 build_qt_lib_binding(noqt)
181 build_qt_lib_binding(QtCore)
182 build_qt_lib_binding(QtNetwork QtCore)
183 build_qt_lib_binding(QtGui QtNetwork QtCore)
184 build_qt_lib_binding(QtScript QtGui QtNetwork QtCore)
185 build_qt_lib_binding(QtOpenGL QtGui QtNetwork QtCore)
186 build_qt_lib_binding(QtSvg QtScript QtGui QtNetwork QtCore)
187 build_qt_lib_binding(QtXml QtSvg QtScript QtGui QtNetwork QtCore)
188 build_qt_lib_binding(QtXmlPatterns QtCore QtXml)
189 build_qt_lib_binding(QtUiTools QtCore QtGui QtXml)
190 build_qt_lib_binding(QtWebKit QtXmlPatterns QtSvg QtScript QtOpenGL QtGui QtNetwork QtCore QtXml)
191 build_qt_lib_binding(QtSql QtCore)
193 #build_qt_lib_binding(QtScriptTools) # 4.5 only
194 #build_qt_lib_binding(Phonon)