1 # This file is part of LyX, the document processor.
2 # Licence details can be found in the file COPYING.
4 # Copyright (c) 2006, Peter Kümmel, <syntheticpp@gmx.net>
7 cmake_minimum_required(VERSION 2.4)
9 if(COMMAND cmake_policy)
10 cmake_policy(SET CMP0003 OLD)
11 cmake_policy(SET CMP0005 OLD)
12 endif(COMMAND cmake_policy)
14 set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
18 # where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/
20 set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/modules")
21 set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
23 # Supress regeneration
24 set(CMAKE_SUPPRESS_REGENERATION TRUE)
26 set(VERSION_INFO "CMake Build")
28 # Try to get some informations from configure.ac
30 include(LyXPaths) #called here to define the needed TOP_SRC_DIR-variable
31 file(STRINGS "${TOP_SRC_DIR}/configure.ac" _config_lines)
34 set(USE_WINDOWS_PACKAGING 1)
36 set(USE_MACOSX_PACKAGING 1)
38 set(USE_POSIX_PACKAGING 1)
41 macro(setstripped _varname _value)
42 string(STRIP ${_value} _v)
43 if(USE_POSIX_PACKAGING)
44 string(TOLOWER ${_v} ${_varname})
46 set(${_varname} ${_v})
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}")
63 if(_c_l MATCHES "^AC_SUBST\\( *LYX_DATE *, *\\[\\\"(.*)\\\"\\].*")
64 set(LYX_DATE "${CMAKE_MATCH_1}")
69 message("-- Using versioned PACKAGE. Disable with -DUseVersionSuffix=0")
70 set(PACKAGE ${PACKAGE_BASE}${LYX_INSTALL_SUFFIX})
71 set(PROGRAM_SUFFIX "${LYX_INSTALL_SUFFIX}")
73 message("-- PACKAGE not versioned, to enable use -DUseVersionSuffix=1")
74 set(PACKAGE ${PACKAGE_BASE})
75 set(PROGRAM_SUFFIX "")
78 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
79 # see http://www.cmake.org/pipermail/cmake/2006-October/011559.html
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)
87 SET(CMAKE_INSTALL_PREFIX
88 ${CMAKE_INSTALL_PREFIX}/${LYX_INSTALL_SUFFIX} CACHE PATH "LyX install prefix" FORCE)
90 endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
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}")
99 #set(GROUP_CODE "The Golden Code")
104 set(LYX_CPP_FILES *.cpp)
105 set(LYX_HPP_FILES *.h)
108 include(ProjectSourceGroup)
110 if(merge OR merge_rebuild)
111 set(merge 1 CACHE TYPE STRING FORCE)
112 set(MERGE_FILES 1 CACHE TYPE STRING FORCE)
114 message(STATUS "All *.cpp files of a project are merged into two files, disable with -Dmerge=0")
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")
123 set(CMAKE_BUILD_TYPE Release)
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)
133 set(CMAKE_BUILD_TYPE Release CACHE TYPE STRING FORCE)
134 set(release TRUE CACHE TYPE STRING FORCE)
139 set(CMAKE_BUILD_TYPE Debug CACHE TYPE STRING FORCE)
140 set(debug TRUE CACHE TYPE STRING FORCE)
145 set(library_type SHARED)
146 message(STATUS "building shared libraries")
148 set(library_type STATIC)
153 set(CMAKE_VERBOSE_MAKEFILE ON CACHE TYPE STRING FORCE)
154 message(STATUS "verbose Makefile, disable with -Dquiet=1")
157 set(CMAKE_VERBOSE_MAKEFILE OFF CACHE TYPE STRING FORCE)
159 set(LYX_CXX_FLAGS -Wall)
161 set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC")
164 set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCPP_CONCEPT_CHECKS")
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)
169 set(CMAKE_CXX_FLAGS_RELEASE "${LYX_CXX_FLAGS} -O2 -DNDEBUG" CACHE TYPE STRING FORCE)
171 set(CMAKE_CXX_FLAGS_RELEASE "${LYX_CXX_FLAGS} -O3 -DNDEBUG" CACHE TYPE STRING FORCE)
173 set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE} -pg" CACHE TYPE STRING FORCE)
177 find_package(Qt4 REQUIRED)
178 add_definitions(-DQT_NO_STL -DQT_NO_KEYWORDS)
180 find_package(ZLIB REQUIRED)
183 set(aspell TRUE CACHE TYPE STRING)
184 find_package(ASPELL REQUIRED)
190 set(use_external_libintl TRUE)
192 if(use_external_libintl)
193 find_package(Libintl REQUIRED)
194 add_definitions(-DHAVE_GETTEXT)
199 set(nls TRUE CACHE TYPE STRING)
200 add_definitions(-DENABLE_NLS=1)
201 message("----- Building with ENABLE_NLS")
203 message("----- No nls, to enable use -Dnls=1")
207 add_definitions(-DUSE_ASPELL=1)
208 message("----- Building with USE_ASPELL")
210 message("----- No aspell, to get more information use -Daspell=1")
216 set(noconsole TRUE CACHE TYPE STRING)
217 set(WIN32_CONSOLE WIN32)
218 set(LYX_QTMAIN_LIBRARY ${QT_QTMAIN_LIBRARY})
219 message("----- Console disabled")
221 message("----- Console enabled, disable it with -Dnoconsole=1")
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")
228 add_definitions(-DWINVER=0x0500)
233 foreach(_v PACKAGE PACKAGE_VERSION
234 PROGRAM_SUFFIX LYX_DATE LYX_DIR_VER LYX_USERDIR_VER
236 LYX_ABS_INSTALLED_DATADIR LYX_ABS_INSTALLED_LOCALEDIR LYX_INSTALL_SUFFIX)
237 if(NOT DEFINED ${_v})
238 message(FATAL_ERROR "${_v} not defined")
240 string(SUBSTRING "${_v} " 0 28 _v1)
241 message("----- ${_v1}: ${${_v}}")
246 add_definitions(-DBOOST_USER_CONFIG="<config.h>")
248 if(MSVC AND NOT disable-pch AND NOT MERGE_FILES)
250 message("----- using precompiled headers, disable with -Ddisable-pch=1")
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")
274 message("----- precompiled headers disabled, enable with -Ddisable-pch=0")
277 set(disable-pch TRUE CACHE TYPE STRING)
278 macro(lyx_add_msvc_pch)
279 endmacro(lyx_add_msvc_pch)
284 set(vld 1 CACHE TYPE STRING FORCE)
285 set(LYX_LEAK_DETECTION 1 CACHE TYPE STRING FORCE)
287 message(STATUS "Leak detection enabled, disable with -Dvld=0")
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)
293 set(vld 0 CACHE TYPE STRING FORCE)
294 set(LYX_LEAK_DETECTION 0 CACHE TYPE STRING FORCE)
296 message(STATUS "Enable leak detection with -Dvld=1")
301 set(WALL 1 CACHE TYPE STRING FORCE)
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)")
307 if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
308 string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
310 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
313 if(CMAKE_C_FLAGS MATCHES "/W[0-4]")
314 string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
316 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
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")
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}")
332 set(WALL 0 CACHE TYPE STRING FORCE)
334 set(CMAKE_CXX_WARNING_LEVEL 3 CACHE TYPE STRING FORCE)
335 set(WARNING_LEVEL_MESSAGE "(switch to warning level 4 with -DWALL=1)")
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")
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}")
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}")
360 find_package(LyXGettext REQUIRED)
361 include_directories(${TOP_SRC_DIR}/po)
365 # compiler tests, config.h generation
366 if(MSVC AND NOT CONFIGURECHECKS)
367 configure_file(configCompiler.h.msvc ${CMAKE_BINARY_DIR}/configCompiler.h)
369 include(ConfigureChecks.cmake)
370 configure_file(configCompiler.h.cmake ${CMAKE_BINARY_DIR}/configCompiler.h)
372 configure_file(config.h.cmake ${CMAKE_BINARY_DIR}/config.h)
375 find_package(ICONV REQUIRED)
376 add_definitions(-DHAVE_ICONV=1)
381 ${TOP_SRC_DIR}/boost)
383 add_subdirectory(boost)
384 if(NOT use_external_libintl)
385 add_subdirectory(intl)
387 add_subdirectory(src)
389 add_subdirectory(man)
390 add_subdirectory(doc)
391 add_subdirectory(lyx2lyx)
392 add_subdirectory(scripts)
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")
400 SET(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${LYX_INSTALL_SUFFIX}")
403 SET(CPACK_SET_DESTDIR "ON")
404 SET(CPACK_RPM_PACKAGE_LICENSE "GPL")
405 SET(CPACK_RPM_PACKAGE_GROUP "Applications/Publishing")
406 SET(CPACK_RPM_PACKAGE_VENDOR "The LyX team")
408 # the next ones are needed by deb
409 SET(CPACK_PACKAGE_CONTACT "${PACKAGE_BUGREPORT}")
410 SET(CPACK_SOURCE_PACKAGE_FILE_NAME "lyx-${LYX_INSTALL_SUFFIX}")
411 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "LyX is a document processor that encourages an approach to writing\n based on the structure of your documents, not their appearance. It\n is released under a Free Software/Open Source license (GPL v.2).\n \n LyX is for people that write and want their writing to look great,\n right out of the box. No more endless tinkering with formatting\n details, 'finger painting' font attributes or futzing around with\n page boundaries. You just write. In the background, Prof. Knuth's\n legendary TeX typesetting engine makes you look good.\n \n On screen, LyX looks like any word processor; its printed output --\n or richly cross-referenced PDF, just as readily produced -- looks\n like nothing else. Gone are the days of industrially bland .docs,\n all looking similarly not-quite-right, yet coming out unpredictably\n different on different printer drivers. Gone are the crashes\n 'eating' your dissertation the evening before going to press.\n \n LyX is stable and fully featured. It is a multi-platform, fully\n internationalized application running natively on Unix/Linux, the\n Macintosh and modern Windows platforms.")
414 #Now it is possible to create some packages
417 ############################## rpm ################################### deb ##################
418 # create # cpack -G RPM --config CPackConfig.cmake # cpack -G DEB --config CPackConfig.cmake
419 # creates =># lyx-2.0.1-Linux.rpm # ==> lyx-2.0.1-Linux.deb
420 # list # rpm -qlp lyx-2.0.1-Linux.rpm # dpkg-deb -c lyx-2.0.1-Linux.deb
421 # install # rpm -U lyx-2.0.1-Linux.rpm # dpkg -i lyx-2.0.1-Linux.deb