]> git.lyx.org Git - lyx.git/blob - development/cmake/CMakeLists.txt
development/cmake/CMakeLists.txt
[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 if(WIN32)
34   set(USE_WINDOWS_PACKAGING 1)
35 elseif(APPLE)
36   set(USE_MACOSX_PACKAGING 1)
37 else()
38   set(USE_POSIX_PACKAGING 1)
39 endif()
40
41 macro(setstripped _varname _value)
42   string(STRIP ${_value} _v)
43   if(USE_POSIX_PACKAGING)
44     string(TOLOWER ${_v} ${_varname})
45   else()
46     set(${_varname} ${_v})
47   endif()
48 endmacro(setstripped)
49
50 foreach(_c_l ${_config_lines} )
51   if(_c_l MATCHES "^AC_INIT\\(\([^,]+\),\([^,]+\), *\\[\([^,]+\)\\] *,\(.*\)")
52     setstripped(PACKAGE_BASE ${CMAKE_MATCH_1})
53     setstripped(PACKAGE_VERSION ${CMAKE_MATCH_2})
54     setstripped(PACKAGE_BUGREPORT ${CMAKE_MATCH_3})
55     if(PACKAGE_VERSION MATCHES "^\([0-9]+\)\\.\([0-9]+\).*$")
56       set(LYX_MAJOR_VERSION ${CMAKE_MATCH_1})
57       set(LYX_MINOR_VERSION ${CMAKE_MATCH_2})
58       set(LYX_DIR_VER "LYX_DIR_${CMAKE_MATCH_1}${CMAKE_MATCH_2}x")
59       set(LYX_USERDIR_VER "LYX_USERDIR_${CMAKE_MATCH_1}${CMAKE_MATCH_2}x")
60       set(LYX_INSTALL_SUFFIX "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}")
61     endif()
62   endif()
63   if(_c_l MATCHES "^AC_SUBST\\( *LYX_DATE *, *\\[\\\"(.*)\\\"\\].*")
64     set(LYX_DATE "${CMAKE_MATCH_1}")
65   endif()
66 endforeach(_c_l)
67
68 if(UseVersionSuffix)
69   message("-- Using versioned PACKAGE. Disable with -DUseVersionSuffix=0")
70   set(PACKAGE ${PACKAGE_BASE}${LYX_INSTALL_SUFFIX})
71   set(PROGRAM_SUFFIX "${LYX_INSTALL_SUFFIX}")
72 else()
73   message("-- PACKAGE not versioned, to enable use -DUseVersionSuffix=1")
74   set(PACKAGE ${PACKAGE_BASE})
75   set(PROGRAM_SUFFIX "")
76 endif()
77
78 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
79   # see http://www.cmake.org/pipermail/cmake/2006-October/011559.html
80   if (UNIX)
81     # don't use the default "/usr/local"
82     # but respect the user-choice on the command-line
83     SET(CMAKE_INSTALL_PREFIX
84       "/usr/local/share/lyx${LYX_INSTALL_SUFFIX}" CACHE PATH "LyX install prefix" FORCE)
85   endif()
86   if(WIN32)
87     SET(CMAKE_INSTALL_PREFIX
88       ${CMAKE_INSTALL_PREFIX}/${LYX_INSTALL_SUFFIX} CACHE PATH "LyX install prefix" FORCE)
89   endif()
90 endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
91
92 set(LYX_ABS_INSTALLED_DATADIR "${CMAKE_INSTALL_PREFIX}")
93 set(LYX_LOCALEDIR "locale")
94 set(LYX_ABS_INSTALLED_LOCALEDIR "${LYX_ABS_INSTALLED_DATADIR}/${LYX_LOCALEDIR}")
95 set(LYX_ABS_TOP_SRCDIR "${TOP_SRC_DIR}")
96
97
98 if(NOT GROUP_CODE)
99         #set(GROUP_CODE "The Golden Code")
100         set(GROUP_CODE flat)
101 endif()
102
103 # lyx's source files
104 set(LYX_CPP_FILES *.cpp)
105 set(LYX_HPP_FILES *.h)
106
107 include(LyXMacros)
108 include(ProjectSourceGroup)
109
110 if(merge OR merge_rebuild)
111         set(merge 1 CACHE TYPE STRING FORCE)
112         set(MERGE_FILES 1 CACHE TYPE STRING FORCE)
113         message(STATUS "")
114         message(STATUS "All *.cpp files of a project are merged into two files, disable with -Dmerge=0")
115         message(STATUS "")
116 else()
117         set(merge 0 CACHE TYPE STRING FORCE)
118         set(MERGE_FILES 0 CACHE TYPE STRING FORCE)
119         message(STATUS "Enable merging files with -Dmerge=1")
120 endif()
121
122
123 set(CMAKE_BUILD_TYPE Release)
124
125 if(profile)
126         set(CMAKE_BUILD_TYPE Profile CACHE TYPE STRING FORCE)
127         set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg"
128             CACHE TYPE STRING FORCE)
129         set(profile)
130 endif()
131
132 if(release)
133         set(CMAKE_BUILD_TYPE Release CACHE TYPE STRING FORCE)
134         set(release TRUE CACHE TYPE STRING FORCE)
135         set(release)
136 endif()
137
138 if(debug)
139         set(CMAKE_BUILD_TYPE Debug CACHE TYPE STRING FORCE)
140         set(debug TRUE CACHE TYPE STRING FORCE)
141         set(debug)
142 endif()
143
144 if(shared)
145         set(library_type SHARED)
146         message(STATUS "building shared libraries")
147 else()
148         set(library_type STATIC)
149 endif()
150
151 if(NOT MSVC)
152         if(NOT quiet)
153                 set(CMAKE_VERBOSE_MAKEFILE ON CACHE TYPE STRING FORCE)
154                 message(STATUS "verbose Makefile, disable with -Dquiet=1")
155                 message(STATUS "")
156         else()
157                 set(CMAKE_VERBOSE_MAKEFILE OFF CACHE TYPE STRING FORCE)
158         endif()
159         set(LYX_CXX_FLAGS -Wall)
160         if(stdlib-debug)
161                 set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC")
162         endif()
163         if(concept-checks)
164                 set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCPP_CONCEPT_CHECKS")
165         endif()
166         set(CMAKE_CXX_FLAGS          "${LYX_CXX_FLAGS}" CACHE TYPE STRING FORCE)
167         set(CMAKE_CXX_FLAGS_DEBUG    "${LYX_CXX_FLAGS} -O -g -D_DEBUG" CACHE TYPE STRING FORCE)
168         if(MINGW)
169                 set(CMAKE_CXX_FLAGS_RELEASE  "${LYX_CXX_FLAGS} -O2 -DNDEBUG" CACHE TYPE STRING FORCE)
170         else()
171                 set(CMAKE_CXX_FLAGS_RELEASE  "${LYX_CXX_FLAGS} -O3 -DNDEBUG" CACHE TYPE STRING FORCE)
172         endif()
173         set(CMAKE_CXX_FLAGS_PROFILE  "${CMAKE_CXX_FLAGS_RELEASE} -pg" CACHE TYPE STRING FORCE)
174 endif()
175
176
177 find_package(Qt4 REQUIRED)
178 add_definitions(-DQT_NO_STL -DQT_NO_KEYWORDS)
179
180 find_package(ZLIB REQUIRED)
181
182 if(all OR aspell)
183         set(aspell TRUE CACHE TYPE STRING)
184         find_package(ASPELL REQUIRED)
185 else()
186         find_package(ASPELL)
187 endif()
188 set(aspell)
189
190 set(use_external_libintl TRUE)
191
192 if(use_external_libintl)
193         find_package(Libintl REQUIRED)
194         add_definitions(-DHAVE_GETTEXT)
195 endif()
196
197 message("")
198 if(nls OR all)
199         set(nls TRUE CACHE TYPE STRING)
200         add_definitions(-DENABLE_NLS=1)
201         message("----- Building with ENABLE_NLS")
202 else()  
203         message("----- No nls, to enable use -Dnls=1")
204 endif()
205 set(nls)
206 if(ASPELL_FOUND)
207         add_definitions(-DUSE_ASPELL=1)
208         message("----- Building with USE_ASPELL")
209 else()  
210         message("----- No aspell, to get more information use -Daspell=1")
211 endif()
212 set(all)
213
214 if(WIN32)
215         if(noconsole)
216                 set(noconsole TRUE CACHE TYPE STRING)
217                 set(WIN32_CONSOLE WIN32)
218                 set(LYX_QTMAIN_LIBRARY ${QT_QTMAIN_LIBRARY})
219                 message("----- Console disabled")
220         else()
221                 message("----- Console enabled, disable it with -Dnoconsole=1")
222         endif()
223         if(MSVC)
224                 add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DNOMINMAX)      
225                 # disable checked iterators for msvc release builds to get maximum speed
226                 set(CMAKE_CXX_FLAGS_RELEASE  "${CMAKE_CXX_FLAGS_RELEASE} /D_SECURE_SCL=0")
227         else()
228                 add_definitions(-DWINVER=0x0500)
229         endif()
230 endif()
231
232 message("")
233 foreach(_v PACKAGE PACKAGE_VERSION
234     PROGRAM_SUFFIX LYX_DATE LYX_DIR_VER LYX_USERDIR_VER
235     LYX_ABS_TOP_SRCDIR
236     LYX_ABS_INSTALLED_DATADIR LYX_ABS_INSTALLED_LOCALEDIR LYX_INSTALL_SUFFIX)
237   if(NOT DEFINED ${_v})
238     message(FATAL_ERROR "${_v} not defined")
239   endif()
240   string(SUBSTRING "${_v}                            " 0 28 _v1)
241   message("----- ${_v1}: ${${_v}}")
242 endforeach(_v)
243 message("")
244
245
246 add_definitions(-DBOOST_USER_CONFIG="<config.h>")
247         
248 if(MSVC AND NOT disable-pch AND NOT MERGE_FILES)
249         message("-----")
250         message("----- using precompiled headers, disable with -Ddisable-pch=1")
251         message("-----")
252         configure_file(${CMAKE_SOURCE_DIR}/pcheaders.h
253                 ${CMAKE_BINARY_DIR}/pcheaders.h)
254         configure_file(${CMAKE_SOURCE_DIR}/config.cpp.cmake
255                 ${CMAKE_BINARY_DIR}/config_pch.cpp)
256         macro(lyx_add_msvc_pch name_)
257                 set_source_files_properties(${${name_}_sources} PROPERTIES
258                         COMPILE_FLAGS "/Yuconfig.h /Fp\$(IntDir)/config.pch")
259                 set_source_files_properties(${CMAKE_BINARY_DIR}/config_pch.cpp PROPERTIES
260                         COMPILE_FLAGS "/Ycconfig.h /Fp\$(IntDir)/config.pch")
261                 set(${name_}_sources ${${name_}_sources} ${CMAKE_BINARY_DIR}/config_pch.cpp
262                         ${CMAKE_BINARY_DIR}/pcheaders.h)
263                 add_definitions(/DLYX_ENABLE_PCH)
264         endmacro(lyx_add_msvc_pch)
265         set(CMAKE_CXX_FLAGS_DEBUG
266                 "${CMAKE_CXX_FLAGS_DEBUG} /DLYX_PCH_STL /DLYX_PCH_BOOST /DLYX_PCH_QT4")
267         set(CMAKE_CXX_FLAGS_RELEASE
268                 "${CMAKE_CXX_FLAGS_RELEASE} /DLYX_PCH_STL /DLYX_PCH_BOOST /DLYX_PCH_QT4")
269         set(CMAKE_CXX_FLAGS_MINSIZEREL
270                 "${CMAKE_CXX_FLAGS_MINSIZEREL} /DLYX_PCH_STL /DLYX_PCH_BOOST")
271 else()
272         if(MSVC)
273                 message("-----")
274                 message("----- precompiled headers disabled, enable with -Ddisable-pch=0")
275                 message("-----")
276         endif()
277         set(disable-pch TRUE CACHE TYPE STRING)
278         macro(lyx_add_msvc_pch)
279         endmacro(lyx_add_msvc_pch)
280 endif()
281
282 if(MSVC)        
283        if(vld)
284                set(vld 1 CACHE TYPE STRING FORCE)
285                set(LYX_LEAK_DETECTION 1 CACHE TYPE STRING FORCE)
286                message(STATUS "")
287                message(STATUS "Leak detection enabled, disable with -Dvld=0")
288                message(STATUS "")
289                set(LIBRARY_OUTPUT_PATH  ${EXECUTABLE_OUTPUT_PATH})
290                set(vld_path ${CMAKE_CURRENT_SOURCE_DIR}/../Win32/vld)
291                include(${vld_path}/tools/cmake/vld.cmake)
292        else()
293                set(vld 0 CACHE TYPE STRING FORCE)
294                set(LYX_LEAK_DETECTION 0 CACHE TYPE STRING FORCE)
295                message(STATUS "")
296                message(STATUS "Enable leak detection with -Dvld=1")
297                message(STATUS "")
298        endif()
299
300         if(WALL)
301                 set(WALL 1 CACHE TYPE STRING FORCE)
302                 
303                 # Use the highest warning level
304                 set(CMAKE_CXX_WARNING_LEVEL 4 CACHE TYPE STRING FORCE)
305                 set(WARNING_LEVEL_MESSAGE "(switch to warning level 3 with -DWALL=0)")
306                 
307                 if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
308                         string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
309                 else()
310                         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
311                 endif()
312                 
313                 if(CMAKE_C_FLAGS MATCHES "/W[0-4]")
314                         string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
315                 else()
316                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
317                 endif()
318                 
319                 # add here warnings which should produce an error /weXXXX
320                 set(MSVC_W_ERROR   "/we4101 /we4189")
321                 # add here warnings which should be disabled /wdXXXX
322                 set(MSVC_W_DISABLE "/wd4288 /wd4355 /wd4800 /wd4996 /wd4311 /wd4312 /wd4505 /wd4267 /wd4512 /wd4245 /wd4127 /wd4180")
323                 
324                 set(CMAKE_CXX_FLAGS_DEBUG
325                         "${CMAKE_CXX_FLAGS_DEBUG} /Wp64 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
326                 set(CMAKE_CXX_FLAGS_RELEASEs
327                         "${CMAKE_CXX_FLAGS_RELEASE} /Wp64 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
328                 set(CMAKE_CXX_FLAGS_MINSIZEREL
329                         "${CMAKE_CXX_FLAGS_MINSIZEREL} /Wp64 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
330                 
331         else()  
332                 set(WALL 0 CACHE TYPE STRING FORCE)
333                 
334                 set(CMAKE_CXX_WARNING_LEVEL 3 CACHE TYPE STRING FORCE)
335                 set(WARNING_LEVEL_MESSAGE "(switch to warning level 4 with -DWALL=1)")
336         
337                 # add here warnings which should produce an error /weXXXX
338                 set(MSVC_W_ERROR   "/we4101 /we4189")
339                 # add here warnings which should be disabled /wdXXXX
340                 set(MSVC_W_DISABLE "/wd4288 /wd4355 /wd4800 /wd4996 /wd4267 /wd4180")
341                 
342                 set(CMAKE_CXX_FLAGS_DEBUG
343                         "${CMAKE_CXX_FLAGS_DEBUG} ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
344                 set(CMAKE_CXX_FLAGS_RELEASE
345                         "${CMAKE_CXX_FLAGS_RELEASE} ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
346                 set(CMAKE_CXX_FLAGS_MINSIZEREL
347                         "${CMAKE_CXX_FLAGS_MINSIZEREL} ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
348                 
349         endif()
350         
351         message("----- Warning level      : ${CMAKE_CXX_WARNING_LEVEL}  ${WARNING_LEVEL_MESSAGE}")
352         message("----- Warnings as errors : ${MSVC_W_ERROR}")
353         message("----- Warnings disabled  : ${MSVC_W_DISABLE}")
354         message("")
355         
356 endif()
357
358
359 if(nls OR all)
360   find_package(LyXGettext REQUIRED)
361   include_directories(${TOP_SRC_DIR}/po)
362   add_subdirectory(po)
363 endif()
364
365 # compiler tests, config.h generation
366 if(MSVC AND NOT CONFIGURECHECKS)
367         configure_file(configCompiler.h.msvc ${CMAKE_BINARY_DIR}/configCompiler.h)
368 else()
369         include(ConfigureChecks.cmake)
370         configure_file(configCompiler.h.cmake ${CMAKE_BINARY_DIR}/configCompiler.h)
371 endif()
372 configure_file(config.h.cmake ${CMAKE_BINARY_DIR}/config.h)
373
374
375 find_package(ICONV REQUIRED)
376 add_definitions(-DHAVE_ICONV=1)
377
378 include_directories(
379         ${CMAKE_BINARY_DIR}
380         ${TOP_SRC_DIR}/src
381         ${TOP_SRC_DIR}/boost)
382
383 add_subdirectory(boost)
384 if(NOT use_external_libintl)
385         add_subdirectory(intl)
386 endif()
387 add_subdirectory(src)
388
389 add_subdirectory(man)
390 add_subdirectory(doc)
391 add_subdirectory(lyx2lyx)
392 add_subdirectory(scripts)
393
394 include(../Install)
395
396 SET(CPACK_PACKAGE_VERSION_MAJOR "${LYX_MAJOR_VERSION}")
397 SET(CPACK_PACKAGE_VERSION_MINOR "${LYX_MINOR_VERSION}")
398 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A WYSIWYM (What You See Is What You Mean) document processor")
399
400 SET(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${LYX_INSTALL_SUFFIX}")
401 SET(CPACK_SET_DESTDIR "ON")                           # needed by rpm
402 SET(CPACK_PACKAGE_CONTACT "${PACKAGE_BUGREPORT}") # needed by deb
403 SET(CPACK_SOURCE_PACKAGE_FILE_NAME "lyx-${LYX_INSTALL_SUFFIX}")
404 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY
405 "LyX is a document processor that encourages an approach to writing
406 based on the structure of your documents, not their appearance. It
407 is released under a Free Software/Open Source license (GPL v.2).
408
409 LyX is for people that write and want their writing to look great,
410 right out of the box. No more endless tinkering with formatting
411 details, 'finger painting' font attributes or futzing around with
412 page boundaries. You just write. In the background, Prof. Knuth's
413 legendary TeX typesetting engine makes you look good.
414
415 On screen, LyX looks like any word processor; its printed output --
416 or richly cross-referenced PDF, just as readily produced -- looks
417 like nothing else. Gone are the days of industrially bland .docs,
418 all looking similarly not-quite-right, yet coming out unpredictably
419 different on different printer drivers. Gone are the crashes
420 'eating' your dissertation the evening before going to press.
421
422 LyX is stable and fully featured. It is a multi-platform, fully
423 internationalized application running natively on Unix/Linux, the
424 Macintosh and modern Windows platforms.")
425
426 include(CPack)
427 #Now it is possible to create some packages
428 # cd <BuildDir>
429 # make package
430 ############################## rpm ################################### deb ##################
431 # create    # cpack -G RPM --config CPackConfig.cmake   # cpack -G DEB --config CPackConfig.cmake
432 # creates =># lyx-2.0.1-Linux.rpm                       #  ==> lyx-2.0.1-Linux.deb
433 # list      # rpm -qlp lyx-2.0.1-Linux.rpm              # dpkg-deb -c lyx-2.0.1-Linux.deb
434 # install   # rpm -U lyx-2.0.1-Linux.rpm                # dpkg -i lyx-2.0.1-Linux.deb
435 #
436
437