]> git.lyx.org Git - lyx.git/blob - development/cmake/CMakeLists.txt
cmake: Kornel's package versions
[lyx.git] / development / cmake / CMakeLists.txt
1 # This file is part of LyX, the document processor.
2 # Licence details can be found in the file COPYING.
3 #
4 # Copyright (c) 2006, Peter Kümmel, <syntheticpp@gmx.net>
5 #
6
7 cmake_minimum_required(VERSION 2.4)
8
9 if(COMMAND cmake_policy)
10         cmake_policy(SET CMP0003 OLD)
11         cmake_policy(SET CMP0005 OLD)
12 endif(COMMAND cmake_policy)
13
14 set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
15
16 project(lyx)
17
18 # where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/
19 # is checked
20 set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/modules")
21 set(EXECUTABLE_OUTPUT_PATH  ${CMAKE_BINARY_DIR}/bin)
22
23 # Supress regeneration
24 set(CMAKE_SUPPRESS_REGENERATION TRUE)
25
26 set(VERSION_INFO "CMake Build")
27
28 # Try to get some informations from configure.ac
29
30 include(LyXPaths)               #called here to define the needed TOP_SRC_DIR-variable
31 file(STRINGS "${TOP_SRC_DIR}/configure.ac" _config_lines)
32
33 macro(setstripped _varname _value)
34   string(STRIP ${_value} _v)
35   set(${_varname} ${_v})
36 endmacro(setstripped)
37
38 foreach(_c_l ${_config_lines} )
39   if(_c_l MATCHES "^AC_INIT\\(\([^,]+\),\([^,]+\),\([^,]+\)\(.*\)")
40     setstripped(PACKAGE_tmp ${CMAKE_MATCH_1})
41     setstripped(PACKAGE_VERSION ${CMAKE_MATCH_2})
42     if(PACKAGE_VERSION MATCHES "^\([0-9]+\)\\.\([0-9]+\).*$")
43       set(LYX_DIR_VER "LYX_DIR_${CMAKE_MATCH_1}${CMAKE_MATCH_2}x")
44       set(LYX_USERDIR_VER "LYX_USERDIR_${CMAKE_MATCH_1}${CMAKE_MATCH_2}x")
45       set(LYX_INSTALL_SUFFIX "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}")
46     endif()
47   endif()
48   if(_c_l MATCHES "^AC_SUBST\\( *LYX_DATE *, *\\[\\\"(.*)\\\"\\].*")
49     set(LYX_DATE "${CMAKE_MATCH_1}")
50   endif()
51 endforeach(_c_l)
52
53 if(UseVersionSuffix)
54   message("-- Using versioned PACKAGE. Disable with -DUseVersionSuffix=0")
55   set(PACKAGE ${PACKAGE_tmp}${LYX_INSTALL_SUFFIX})
56 else()
57   message("-- PACKAGE not versioned, to enable use -DUseVersionSuffix=1")
58   set(PACKAGE ${PACKAGE_tmp})
59 endif()
60
61 set(PROGRAM_SUFFIX "\"\"")
62 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
63   # see http://www.cmake.org/pipermail/cmake/2006-October/011559.html
64   if (UNIX)
65     # don't use the default "/usr/local"
66     # but respect the user-choice on the command-line
67     SET(CMAKE_INSTALL_PREFIX
68       "/usr/local/share/lyx${LYX_INSTALL_SUFFIX}" CACHE PATH "LyX install prefix" FORCE)
69   endif()
70   if(WIN32)
71     SET(CMAKE_INSTALL_PREFIX
72       ${CMAKE_INSTALL_PREFIX}/${LYX_INSTALL_SUFFIX} CACHE PATH "LyX install prefix" FORCE)
73   endif()
74 endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
75
76 set(LYX_ABS_INSTALLED_DATADIR "${CMAKE_INSTALL_PREFIX}")
77 set(LYX_LOCALEDIR "locale")
78 set(LYX_ABS_INSTALLED_LOCALEDIR "${LYX_ABS_INSTALLED_DATADIR}/${LYX_LOCALEDIR}")
79 set(LYX_ABS_TOP_SRCDIR "${TOP_SRC_DIR}")
80
81
82 if(WIN32)
83         set(USE_WINDOWS_PACKAGING 1)
84 elseif(APPLE)
85         set(USE_MACOSX_PACKAGING 1)
86 else()
87         set(USE_POSIX_PACKAGING 1)
88 endif()
89
90 if(NOT GROUP_CODE)
91         #set(GROUP_CODE "The Golden Code")
92         set(GROUP_CODE flat)
93 endif()
94
95 # lyx's source files
96 set(LYX_CPP_FILES *.cpp)
97 set(LYX_HPP_FILES *.h)
98
99 include(LyXMacros)
100 include(ProjectSourceGroup)
101
102 if(merge OR merge_rebuild)
103         set(merge 1 CACHE TYPE STRING FORCE)
104         set(MERGE_FILES 1 CACHE TYPE STRING FORCE)
105         message(STATUS "")
106         message(STATUS "All *.cpp files of a project are merged into two files, disable with -Dmerge=0")
107         message(STATUS "")
108 else()
109         set(merge 0 CACHE TYPE STRING FORCE)
110         set(MERGE_FILES 0 CACHE TYPE STRING FORCE)
111         message(STATUS "Enable merging files with -Dmerge=1")
112 endif()
113
114
115 set(CMAKE_BUILD_TYPE Release)
116
117 if(profile)
118         set(CMAKE_BUILD_TYPE Profile CACHE TYPE STRING FORCE)
119         set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg"
120             CACHE TYPE STRING FORCE)
121         set(profile)
122 endif()
123
124 if(release)
125         set(CMAKE_BUILD_TYPE Release CACHE TYPE STRING FORCE)
126         set(release TRUE CACHE TYPE STRING FORCE)
127         set(release)
128 endif()
129
130 if(debug)
131         set(CMAKE_BUILD_TYPE Debug CACHE TYPE STRING FORCE)
132         set(debug TRUE CACHE TYPE STRING FORCE)
133         set(debug)
134 endif()
135
136 if(shared)
137         set(library_type SHARED)
138         message(STATUS "building shared libraries")
139 else()
140         set(library_type STATIC)
141 endif()
142
143 if(NOT MSVC)
144         if(NOT quiet)
145                 set(CMAKE_VERBOSE_MAKEFILE ON CACHE TYPE STRING FORCE)
146                 message(STATUS "verbose Makefile, disable with -Dquiet=1")
147                 message(STATUS "")
148         else()
149                 set(CMAKE_VERBOSE_MAKEFILE OFF CACHE TYPE STRING FORCE)
150         endif()
151         set(LYX_CXX_FLAGS -Wall)
152         if(stdlib-debug)
153                 set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC")
154         endif()
155         if(concept-checks)
156                 set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCPP_CONCEPT_CHECKS")
157         endif()
158         set(CMAKE_CXX_FLAGS          "${LYX_CXX_FLAGS}" CACHE TYPE STRING FORCE)
159         set(CMAKE_CXX_FLAGS_DEBUG    "${LYX_CXX_FLAGS} -O -g -D_DEBUG" CACHE TYPE STRING FORCE)
160         if(MINGW)
161                 set(CMAKE_CXX_FLAGS_RELEASE  "${LYX_CXX_FLAGS} -O2 -DNDEBUG" CACHE TYPE STRING FORCE)
162         else()
163                 set(CMAKE_CXX_FLAGS_RELEASE  "${LYX_CXX_FLAGS} -O3 -DNDEBUG" CACHE TYPE STRING FORCE)
164         endif()
165         set(CMAKE_CXX_FLAGS_PROFILE  "${CMAKE_CXX_FLAGS_RELEASE} -pg" CACHE TYPE STRING FORCE)
166 endif()
167
168
169 find_package(Qt4 REQUIRED)
170 add_definitions(-DQT_NO_STL -DQT_NO_KEYWORDS)
171
172 find_package(ZLIB REQUIRED)
173
174 if(all OR aspell)
175         set(aspell TRUE CACHE TYPE STRING)
176         find_package(ASPELL REQUIRED)
177 else()
178         find_package(ASPELL)
179 endif()
180 set(aspell)
181
182 set(use_external_libintl TRUE)
183
184 if(use_external_libintl)
185         find_package(Libintl REQUIRED)
186         add_definitions(-DHAVE_GETTEXT)
187 endif()
188
189 message("")
190 if(nls OR all)
191         set(nls TRUE CACHE TYPE STRING)
192         add_definitions(-DENABLE_NLS=1)
193         message("----- Building with ENABLE_NLS")
194 else()  
195         message("----- No nls, to enable use -Dnls=1")
196 endif()
197 set(nls)
198 if(ASPELL_FOUND)
199         add_definitions(-DUSE_ASPELL=1)
200         message("----- Building with USE_ASPELL")
201 else()  
202         message("----- No aspell, to get more information use -Daspell=1")
203 endif()
204 set(all)
205
206 if(WIN32)
207         if(noconsole)
208                 set(noconsole TRUE CACHE TYPE STRING)
209                 set(WIN32_CONSOLE WIN32)
210                 set(LYX_QTMAIN_LIBRARY ${QT_QTMAIN_LIBRARY})
211                 message("----- Console disabled")
212         else()
213                 message("----- Console enabled, disable it with -Dnoconsole=1")
214         endif()
215         if(MSVC)
216                 add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DNOMINMAX)      
217                 # disable checked iterators for msvc release builds to get maximum speed
218                 set(CMAKE_CXX_FLAGS_RELEASE  "${CMAKE_CXX_FLAGS_RELEASE} /D_SECURE_SCL=0")
219         else()
220                 add_definitions(-DWINVER=0x0500)
221         endif()
222 endif()
223
224 message("")
225 foreach(_v PACKAGE PACKAGE_VERSION
226     PROGRAM_SUFFIX LYX_DATE LYX_DIR_VER LYX_USERDIR_VER
227     LYX_ABS_TOP_SRCDIR
228     LYX_ABS_INSTALLED_DATADIR LYX_ABS_INSTALLED_LOCALEDIR LYX_INSTALL_SUFFIX)
229   if(NOT DEFINED ${_v})
230     message(FATAL_ERROR "${_v} not defined")
231   endif()
232   string(SUBSTRING "${_v}                            " 0 28 _v1)
233   message("----- ${_v1}: ${${_v}}")
234 endforeach(_v)
235 message("")
236
237
238 add_definitions(-DBOOST_USER_CONFIG="<config.h>")
239         
240 if(MSVC AND NOT disable-pch AND NOT MERGE_FILES)
241         message("-----")
242         message("----- using precompiled headers, disable with -Ddisable-pch=1")
243         message("-----")
244         configure_file(${CMAKE_SOURCE_DIR}/pcheaders.h
245                 ${CMAKE_BINARY_DIR}/pcheaders.h)
246         configure_file(${CMAKE_SOURCE_DIR}/config.cpp.cmake
247                 ${CMAKE_BINARY_DIR}/config_pch.cpp)
248         macro(lyx_add_msvc_pch name_)
249                 set_source_files_properties(${${name_}_sources} PROPERTIES
250                         COMPILE_FLAGS "/Yuconfig.h /Fp\$(IntDir)/config.pch")
251                 set_source_files_properties(${CMAKE_BINARY_DIR}/config_pch.cpp PROPERTIES
252                         COMPILE_FLAGS "/Ycconfig.h /Fp\$(IntDir)/config.pch")
253                 set(${name_}_sources ${${name_}_sources} ${CMAKE_BINARY_DIR}/config_pch.cpp
254                         ${CMAKE_BINARY_DIR}/pcheaders.h)
255                 add_definitions(/DLYX_ENABLE_PCH)
256         endmacro(lyx_add_msvc_pch)
257         set(CMAKE_CXX_FLAGS_DEBUG
258                 "${CMAKE_CXX_FLAGS_DEBUG} /DLYX_PCH_STL /DLYX_PCH_BOOST /DLYX_PCH_QT4")
259         set(CMAKE_CXX_FLAGS_RELEASE
260                 "${CMAKE_CXX_FLAGS_RELEASE} /DLYX_PCH_STL /DLYX_PCH_BOOST /DLYX_PCH_QT4")
261         set(CMAKE_CXX_FLAGS_MINSIZEREL
262                 "${CMAKE_CXX_FLAGS_MINSIZEREL} /DLYX_PCH_STL /DLYX_PCH_BOOST")
263 else()
264         if(MSVC)
265                 message("-----")
266                 message("----- precompiled headers disabled, enable with -Ddisable-pch=0")
267                 message("-----")
268         endif()
269         set(disable-pch TRUE CACHE TYPE STRING)
270         macro(lyx_add_msvc_pch)
271         endmacro(lyx_add_msvc_pch)
272 endif()
273
274 if(MSVC)        
275        if(vld)
276                set(vld 1 CACHE TYPE STRING FORCE)
277                set(LYX_LEAK_DETECTION 1 CACHE TYPE STRING FORCE)
278                message(STATUS "")
279                message(STATUS "Leak detection enabled, disable with -Dvld=0")
280                message(STATUS "")
281                set(LIBRARY_OUTPUT_PATH  ${EXECUTABLE_OUTPUT_PATH})
282                set(vld_path ${CMAKE_CURRENT_SOURCE_DIR}/../Win32/vld)
283                include(${vld_path}/tools/cmake/vld.cmake)
284        else()
285                set(vld 0 CACHE TYPE STRING FORCE)
286                set(LYX_LEAK_DETECTION 0 CACHE TYPE STRING FORCE)
287                message(STATUS "")
288                message(STATUS "Enable leak detection with -Dvld=1")
289                message(STATUS "")
290        endif()
291
292         if(WALL)
293                 set(WALL 1 CACHE TYPE STRING FORCE)
294                 
295                 # Use the highest warning level
296                 set(CMAKE_CXX_WARNING_LEVEL 4 CACHE TYPE STRING FORCE)
297                 set(WARNING_LEVEL_MESSAGE "(switch to warning level 3 with -DWALL=0)")
298                 
299                 if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
300                         string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
301                 else()
302                         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
303                 endif()
304                 
305                 if(CMAKE_C_FLAGS MATCHES "/W[0-4]")
306                         string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
307                 else()
308                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
309                 endif()
310                 
311                 # add here warnings which should produce an error /weXXXX
312                 set(MSVC_W_ERROR   "/we4101 /we4189")
313                 # add here warnings which should be disabled /wdXXXX
314                 set(MSVC_W_DISABLE "/wd4288 /wd4355 /wd4800 /wd4996 /wd4311 /wd4312 /wd4505 /wd4267 /wd4512 /wd4245 /wd4127 /wd4180")
315                 
316                 set(CMAKE_CXX_FLAGS_DEBUG
317                         "${CMAKE_CXX_FLAGS_DEBUG} /Wp64 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
318                 set(CMAKE_CXX_FLAGS_RELEASEs
319                         "${CMAKE_CXX_FLAGS_RELEASE} /Wp64 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
320                 set(CMAKE_CXX_FLAGS_MINSIZEREL
321                         "${CMAKE_CXX_FLAGS_MINSIZEREL} /Wp64 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
322                 
323         else()  
324                 set(WALL 0 CACHE TYPE STRING FORCE)
325                 
326                 set(CMAKE_CXX_WARNING_LEVEL 3 CACHE TYPE STRING FORCE)
327                 set(WARNING_LEVEL_MESSAGE "(switch to warning level 4 with -DWALL=1)")
328         
329                 # add here warnings which should produce an error /weXXXX
330                 set(MSVC_W_ERROR   "/we4101 /we4189")
331                 # add here warnings which should be disabled /wdXXXX
332                 set(MSVC_W_DISABLE "/wd4288 /wd4355 /wd4800 /wd4996 /wd4267 /wd4180")
333                 
334                 set(CMAKE_CXX_FLAGS_DEBUG
335                         "${CMAKE_CXX_FLAGS_DEBUG} ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
336                 set(CMAKE_CXX_FLAGS_RELEASE
337                         "${CMAKE_CXX_FLAGS_RELEASE} ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
338                 set(CMAKE_CXX_FLAGS_MINSIZEREL
339                         "${CMAKE_CXX_FLAGS_MINSIZEREL} ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
340                 
341         endif()
342         
343         message("----- Warning level      : ${CMAKE_CXX_WARNING_LEVEL}  ${WARNING_LEVEL_MESSAGE}")
344         message("----- Warnings as errors : ${MSVC_W_ERROR}")
345         message("----- Warnings disabled  : ${MSVC_W_DISABLE}")
346         message("")
347         
348 endif()
349
350
351 if(nls OR all)
352   find_package(LyXGettext REQUIRED)
353   include_directories(${TOP_SRC_DIR}/po)
354   add_subdirectory(po)
355 endif()
356
357 # compiler tests, config.h generation
358 if(MSVC AND NOT CONFIGURECHECKS)
359         configure_file(configCompiler.h.msvc ${CMAKE_BINARY_DIR}/configCompiler.h)
360 else()
361         include(ConfigureChecks.cmake)
362         configure_file(configCompiler.h.cmake ${CMAKE_BINARY_DIR}/configCompiler.h)
363 endif()
364 configure_file(config.h.cmake ${CMAKE_BINARY_DIR}/config.h)
365
366
367 find_package(ICONV REQUIRED)
368 add_definitions(-DHAVE_ICONV=1)
369
370 include_directories(
371         ${CMAKE_BINARY_DIR}
372         ${TOP_SRC_DIR}/src
373         ${TOP_SRC_DIR}/boost)
374
375 add_subdirectory(boost)
376 if(NOT use_external_libintl)
377         add_subdirectory(intl)
378 endif()
379 add_subdirectory(src)
380
381 add_subdirectory(man)
382 add_subdirectory(doc)
383 add_subdirectory(lyx2lyx)
384 add_subdirectory(scripts)
385
386 include(../Install)
387