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