]> git.lyx.org Git - features.git/blob - CMakeLists.txt
Whitespace: correct whitespace after r38779 and r38789.
[features.git] / 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-2011 Peter Kümmel, <syntheticpp@gmx.net>
5 # Copyright (c) 2008-2011 Kornel Benko, <Kornel.Benko@berlin.de>
6
7 cmake_minimum_required(VERSION 2.6.4)
8
9
10 set(LYX_PROJECT lyx)
11
12 set(LYX_CMAKE_DIR "development/cmake")
13 set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/${LYX_CMAKE_DIR}/modules")
14
15 get_filename_component(lyx_dir_readme ${CMAKE_SOURCE_DIR}/README ABSOLUTE)
16 get_filename_component(TOP_SRC_DIR ${lyx_dir_readme} PATH)
17
18 set(CMAKE_PROJECT_NAME ${LYX_PROJECT})
19
20 message(STATUS)
21 if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) 
22         message(STATUS "Building in-source")
23         set(TOP_BINARY_DIR "${CMAKE_BINARY_DIR}/build")
24 else()
25         message(STATUS "Building out-of-source")
26         set(TOP_BINARY_DIR "${CMAKE_BINARY_DIR}")
27 endif()
28
29
30 if(COMMAND cmake_policy)
31         cmake_policy(SET CMP0003 OLD)
32         cmake_policy(SET CMP0005 OLD)
33 endif()
34
35 set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
36
37 # Supress regeneration
38 set(CMAKE_SUPPRESS_REGENERATION FALSE)
39
40 if(NOT help AND NOT HELP)
41         # 'project' triggers the searching for a compiler
42         project(${LYX_PROJECT})
43 endif()
44
45 include(LyXMacros)
46
47 # Usage LYX_OPTION
48 # 1. parameter: option name without prefix 'LYX_'
49 # 2. parameter: description
50 # 3. parameter: default value, ON or OFF
51 # 4. parameter: system on which option is used: ALL, GCC, MSVC, ...
52
53
54 LYX_OPTION_INIT()
55
56 # Options for all compilers/systems
57 LYX_OPTION(CPACK            "Use the CPack management (Implies LYX_INSTALL option)" OFF ALL)
58 LYX_OPTION(INSTALL          "Build install projects/rules (implies a bunch of other options)" OFF ALL)
59 LYX_OPTION(NLS              "Enable Native Language Support (NLS)" ON ALL)
60 LYX_OPTION(ASPELL           "Require aspell" OFF ALL)
61 LYX_OPTION(ENCHANT          "Require Enchant" OFF ALL)
62 LYX_OPTION(HUNSPELL         "Require Hunspell" OFF ALL)
63 LYX_OPTION(DEVEL_VERSION    "Build developer version" OFF ALL) 
64 LYX_OPTION(RELEASE          "Build release version, build debug when disabled" OFF ALL)
65 LYX_OPTION(DEBUG            "Enforce debug build"  OFF ALL)
66 LYX_OPTION(NO_OPTIMIZE      "Don't use any optimization/debug flags"  OFF ALL)
67 LYX_OPTION(PACKAGE_SUFFIX   "Use version suffix for packaging" ON ALL)
68 LYX_OPTION(PCH              "Use precompiled headers" OFF ALL)
69 LYX_OPTION(MERGE_FILES      "Merge source files into one compilation unit" OFF ALL)
70 LYX_OPTION(MERGE_REBUILD    "Rebuild generated files from merged files build" OFF ALL)
71 LYX_OPTION(QUIET            "Don't generate verbose makefiles" OFF ALL)
72 LYX_OPTION(INSTALL_PREFIX   "Install path for LyX" OFF ALL)
73 LYX_OPTION(EXTERNAL_LIBINTL "Use external libintl" ON ALL)
74 LYX_OPTION(BUNDLE           "Build bundle  (experimental) " OFF ALL)
75
76 # GCC specific
77 LYX_OPTION(PROFILE              "Build profile version" OFF GCC)
78 LYX_OPTION(EXTERNAL_BOOST       "Use external boost" OFF GCC)
79 LYX_OPTION(PROGRAM_SUFFIX       "Append version suffix to binaries" ON GCC)
80 LYX_OPTION(DEBUG_GLIBC          "Enable libstdc++ debug mode" OFF GCC)
81 LYX_OPTION(DEBUG_GLIBC_PEDANTIC "Enable libstdc++pedantic debug mode" OFF GCC)
82 LYX_OPTION(STDLIB_DEBUG         "Use debug stdlib" OFF GCC)
83 LYX_OPTION(CONCEPT_CHECKS       "Enable concept-checks" OFF GCC)
84
85 # MSVC specific
86 LYX_OPTION(CONSOLE               "Show console on Windows" ON MSVC)
87 LYX_OPTION(VLD                   "Use VLD with MSVC" OFF MSVC)
88 LYX_OPTION(WALL                  "Enable all warnings" OFF MSVC)
89 LYX_OPTION(CONFIGURE_CHECKS      "Also run configure checks for MSVC" OFF MSVC)
90 LYX_OPTION(DEPENDENCIES_DOWNLOAD "Download dependencies for MSVC 10" OFF MSVC)
91
92 # APPLE specific
93 LYX_OPTION(DMG                   "Build as Mac bundle, needed for .dmg  (experimental) " OFF MAC)
94 LYX_OPTION(COCOA                 "Use Cocoa on Mac" OFF MAC)
95
96
97 if(help OR HELP)
98         message(STATUS)
99         message(STATUS "Available options: (dis/enable with -D=0/1)")
100         message(STATUS)
101         LYX_OPTION_LIST_ALL(help)       
102         message(STATUS)
103 else()
104
105
106 # Check option dependencies
107
108 if(LYX_CPACK)
109         set(LYX_INSTALL ON)
110 endif()
111
112 if(LYX_DMG)
113         set(LYX_BUNDLE 1)
114         set(LYX_CPACK 1)
115 endif()
116
117 if(LYX_INSTALL)
118         set(LYX_NLS ON)
119         if (WIN32)
120                 set(LYX_HUNSPELL ON)
121                 set(LYX_BUNDLE ON)
122         endif()
123         set(LYX_CONSOLE OFF)
124         set(LYX_PACKAGE_SUFFIX ON)
125         set(LYX_RELEASE ON)
126         set(LYX_PROFILE OFF)
127 endif()
128
129
130 if(LYX_MERGE_FILES)
131         set(LYX_PCH OFF)
132 else()
133         set(LYX_MERGE_REBUILD OFF)
134 endif()
135
136 if(LYX_DEPENDENCIES_DOWNLOAD)
137         message(STATUS)
138         set(LYX_DEPENDENCIES_DIR ${TOP_BINARY_DIR}/msvc2010-deps)
139         message(STATUS "Using downloaded dependencies in ${LYX_DEPENDENCIES_DIR}")
140         set(deps_files lyx20-deps-msvc2010-x86.zip)
141         foreach(it ${deps_files})
142                 set(already_downloaded already_downloaded-NOTFOUND CACHE PATH "downloaded" FORCE)
143                 find_file(already_downloaded ${it} "${LYX_DEPENDENCIES_DIR}/download")
144                 if(NOT already_downloaded)
145                         message(STATUS "Downloading ${it} ...")
146                         file(DOWNLOAD ftp://ftp.devel.lyx.org/pub/contrib/windows/${it} ${LYX_DEPENDENCIES_DIR}/download/${it} SHOW_PROGRESS)
147                         execute_process(COMMAND ${CMAKE_COMMAND} -E tar xzf ${LYX_DEPENDENCIES_DIR}/download/${it}
148                                       WORKING_DIRECTORY ${LYX_DEPENDENCIES_DIR})
149                 endif()
150         endforeach()
151         set(GNUWIN32_DIR ${LYX_DEPENDENCIES_DIR}/deps20)
152 endif()
153
154
155
156 message(STATUS)
157
158 set(EXECUTABLE_OUTPUT_PATH  ${TOP_BINARY_DIR}/bin)
159 set(LIBRARY_OUTPUT_PATH  ${TOP_BINARY_DIR}/lib)
160
161
162
163 if(UNIX OR MINGW)
164         execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
165         message(STATUS "Using GCC version ${GCC_VERSION}")
166         if(NOT GCC_VERSION VERSION_LESS 4.4)
167                 set(LYX_USE_TR1 1)
168                 # GCC <= 4.5 does not support regex: there are linker errors
169                 # http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.tr1
170                 set(LYX_USE_TR1_REGEX 0)
171         endif()
172 else()
173         if(MSVC10)
174                 set(LYX_USE_TR1 1)
175                 #set(LYX_USE_TR1_REGEX 1) #TODO should we use it in ECMAScript mode?
176         endif()
177 endif()
178
179
180 set(VERSION_INFO "CMake Build")
181
182 # Try to get some informations from configure.ac
183
184 include(LyXPaths)
185 file(STRINGS "${TOP_SRC_DIR}/configure.ac" _config_lines)
186
187 if(WIN32)
188         set(USE_WINDOWS_PACKAGING 1)
189 elseif(APPLE)
190         set(USE_MACOSX_PACKAGING 1)
191 else()
192         set(USE_POSIX_PACKAGING 1)
193 endif()
194
195 macro(setstripped _varname _value)
196         string(STRIP ${_value} _v)
197         if(USE_POSIX_PACKAGING)
198                 string(TOLOWER ${_v} ${_varname})
199         else()
200                 set(${_varname} ${_v})
201         endif()
202 endmacro(setstripped)
203
204 foreach(_c_l ${_config_lines} )
205         if(_c_l MATCHES "^AC_INIT\\(\([^,]+\),\([^,]+\), *\\[\([^,]+\)\\] *,\(.*\)")
206                 setstripped(PACKAGE_BASE ${CMAKE_MATCH_1})
207                 setstripped(PACKAGE_VERSION ${CMAKE_MATCH_2})
208                 setstripped(PACKAGE_BUGREPORT ${CMAKE_MATCH_3})
209                 if(PACKAGE_VERSION MATCHES "^\([0-9]+\)\\.\([0-9]+\).*$")
210                         set(LYX_MAJOR_VERSION ${CMAKE_MATCH_1})
211                         set(LYX_MINOR_VERSION ${CMAKE_MATCH_2})
212                         set(LYX_PATCH_VERSION 0) # TODO 2.1.0svn, LYX_PATCH_VERSION == 0
213                         set(LYX_DIR_VER "LYX_DIR_${CMAKE_MATCH_1}${CMAKE_MATCH_2}x")
214                         set(LYX_USERDIR_VER "LYX_USERDIR_${CMAKE_MATCH_1}${CMAKE_MATCH_2}x")
215                         set(LYX_INSTALL_SUFFIX "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}")
216                 endif()
217         endif()
218         if(_c_l MATCHES "^AC_SUBST\\( *LYX_DATE *, *\\[\\\"(.*)\\\"\\].*")
219                 set(LYX_DATE "${CMAKE_MATCH_1}")
220         endif()
221 endforeach(_c_l)
222
223
224 if(LYX_PROGRAM_SUFFIX)
225         set(PROGRAM_SUFFIX "${LYX_INSTALL_SUFFIX}")
226 else()
227         set(PROGRAM_SUFFIX "")
228 endif()
229
230
231 if(LYX_BUNDLE)
232         if(APPLE)
233                 set(LYX_BUILD_BUNDLE MACOSX_BUNDLE)
234                 set(LYX_DATA_SUBDIR ${PACKAGE_BASE}${PROGRAM_SUFFIX}.app/Contents/Resources/ CACHE STRING "Bundle Contents dir" FORCE)
235                 set(MACOSX_BUNDLE_STARTUP_COMMAND ${PACKAGE_BASE}${PROGRAM_SUFFIX}.app)
236                 if(NOT LYX_INSTALL_PREFIX)
237                         set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/LyX CACHE PATH "Mac bundle dir" FORCE)
238                         set(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
239                 endif()
240         endif()
241
242         message(STATUS)
243         message(STATUS "Bundle creation is enabled (experimental):")
244         message(STATUS "    make")
245         message(STATUS "    make install/strip")
246         message(STATUS "    make package")
247         message(STATUS "To increase turn around speed use:")
248         message(STATUS "    cmake -DLYX_MERGE_FILES=1 -DLYX_NO_OPTIMIZE=1 -DLYX_INSTALL=1 -DLYX_DMG=1 ../trunk")
249         message(STATUS "or use the shell script 'development/cmake/dmg'")
250         message(STATUS)
251 endif()
252
253
254 if(LYX_INSTALL_PREFIX)
255         set(CMAKE_INSTALL_PREFIX ${LYX_INSTALL_PREFIX} CACHE PATH "LyX user's choice install prefix" FORCE)
256         set(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
257 endif()
258 set(LYX_INSTALL_PREFIX ${LYX_INSTALL_PREFIX} CACHE PATH "LyX user's choice install prefix" FORCE)
259
260 if(LYX_PACKAGE_SUFFIX)
261         set(PACKAGE ${PACKAGE_BASE}${LYX_INSTALL_SUFFIX})
262 else()  
263         set(PACKAGE ${PACKAGE_BASE})
264 endif()
265
266
267
268 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
269         # see http://www.cmake.org/pipermail/cmake/2006-October/011559.html
270         if (UNIX)
271                 # don't use the default "/usr/local"
272                 # but respect the user-choice on the command-line
273                 if(LYX_INSTALL_SUFFIX)
274                         set(CMAKE_INSTALL_PREFIX "/usr/local/lyx${LYX_INSTALL_SUFFIX}" CACHE PATH "LyX default install prefix" FORCE)
275                 else()
276                         set(CMAKE_INSTALL_PREFIX "/usr/local/${LYX_PROJECT}" CACHE PATH "LyX default install prefix" FORCE)
277                 endif()
278         endif()
279         if(WIN32)
280                 set(CMAKE_INSTALL_PREFIX LYX_INSTALLED CACHE PATH "LyX default install prefix" FORCE)
281         endif()
282 endif()
283 if(IS_ABSOLUTE)
284         set(CMAKE_INSTALL_PREFIX_ABSOLUTE ${CMAKE_INSTALL_PREFIX})
285 else()
286         set(CMAKE_INSTALL_PREFIX_ABSOLUTE ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_PREFIX})
287 endif()
288
289
290
291 if(NOT LYX_DATA_SUBDIR)
292         if (WIN32)
293                 set(LYX_DATA_SUBDIR "Resources/" CACHE STRING "Subdirectory for all lyx-system-data" FORCE)
294         else()
295                 set(LYX_DATA_SUBDIR "" CACHE STRING "Subdirectory for all lyx-system-data" FORCE)
296         endif()
297 endif()
298
299 set(LYX_ABS_INSTALLED_DATADIR "${CMAKE_INSTALL_PREFIX}")
300 set(LYX_LOCALEDIR "locale")
301 set(LYX_ABS_INSTALLED_LOCALEDIR "${LYX_ABS_INSTALLED_DATADIR}/${LYX_DATA_SUBDIR}${LYX_LOCALEDIR}")
302 set(LYX_ABS_TOP_SRCDIR "${TOP_SRC_DIR}")
303
304
305
306 if(NOT GROUP_CODE)
307         #set(GROUP_CODE "The Golden Code")
308         set(GROUP_CODE flat)
309 endif()
310
311 # lyx's source files
312 set(LYX_CPP_FILES *.cpp)
313 set(LYX_HPP_FILES *.h)
314 set(LYX_MOC_FILES moc_*.cpp)
315
316 include(ProjectSourceGroup)
317
318
319 if(LYX_PROFILE)
320         set(CMAKE_BUILD_TYPE Profile CACHE TYPE STRING FORCE)
321         set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg" CACHE TYPE STRING FORCE)
322 endif()
323
324
325 if(LYX_NO_OPTIMIZE)
326         set(CMAKE_BUILD_TYPE None)
327         set(LYX_DEBUG OFF)
328         set(LYX_RELEASE OFF)
329 elseif(LYX_RELEASE)
330         set(CMAKE_BUILD_TYPE Release)
331         set(LYX_DEBUG OFF)
332 else()
333         set(CMAKE_BUILD_TYPE Debug)
334 endif()
335
336
337 # When shared libs are supported enable this option
338 #LYX_OPTION(SHARED_LIBRARIES "Build shared libraries" OFF ALL)
339 if(LYX_SHARED_LIBRARIES)
340         set(library_type SHARED)
341 else()
342         set(library_type STATIC)
343 endif()
344
345 if(NOT MSVC)
346         if(NOT LYX_QUIET)
347                 set(CMAKE_VERBOSE_MAKEFILE ON)
348         endif()
349         set(LYX_CXX_FLAGS "-Wall -Wunused-parameter")
350         if(LYX_STDLIB_DEBUG)
351                 set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC")
352         endif()
353         if(LYX_CONCEPT_CHECKS)
354                 set(LYX_CXX_FLAGS "${LYX_CXX_FLAGS} -D_GLIBCPP_CONCEPT_CHECKS")
355         endif()
356         set(CMAKE_CXX_FLAGS       "${LYX_CXX_FLAGS} -fno-strict-aliasing " CACHE TYPE STRING FORCE)
357         set(CMAKE_CXX_FLAGS_DEBUG "${LYX_CXX_FLAGS} -fno-strict-aliasing -O0 -g -D_DEBUG" CACHE TYPE STRING FORCE)
358         if(MINGW)
359                 set(CMAKE_CXX_FLAGS_RELEASE "${LYX_CXX_FLAGS} -O2 -DNDEBUG" CACHE TYPE STRING FORCE)
360         else()
361                 set(CMAKE_CXX_FLAGS_RELEASE "${LYX_CXX_FLAGS} -O3 -DNDEBUG" CACHE TYPE STRING FORCE)
362         endif()
363         set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE} -pg" CACHE TYPE STRING FORCE)
364 endif()
365
366
367 find_package(Qt4 REQUIRED)
368
369
370 include_directories(${TOP_BINARY_DIR} ${TOP_SRC_DIR}/src)
371   
372 if(LYX_ASPELL)
373         find_package(ASPELL)
374         include_directories(${ASPELL_INCLUDE_DIR})
375 endif()
376
377 if(LYX_ENCHANT)
378         find_package(Enchant REQUIRED)
379         include_directories(${ENCHANT_INCLUDE_DIR})
380 endif()
381
382 if(LYX_HUNSPELL)
383         find_package(Hunspell REQUIRED)
384         include_directories(${HUNSPELL_INCLUDE_DIR})
385 endif()
386
387 if(LYX_NLS)
388         FIND_PROGRAM(LYX_PYTHON_EXECUTABLE python HINTS ${GNUWIN32_DIR}/python)
389         if(${LYX_PYTHON_EXECUTABLE} MATCHES "-NOTFOUND")
390                 message(FATAL_ERROR "Python 2.6 needed!")
391         endif()
392         find_package(LyXGettext REQUIRED)
393         include_directories(${TOP_SRC_DIR}/po)
394         add_subdirectory(po "${TOP_BINARY_DIR}/po")
395 endif()
396
397 if(LYX_NLS)
398         if(LYX_EXTERNAL_LIBINTL)
399                 find_package(Libintl REQUIRED)  
400                 if(DEFINED LIBINTL_LIBRARIES)
401                         # find getext when configuring
402                         list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBINTL_LIBRARIES})      
403                         # on mac use iconv also form ports
404                         get_filename_component(ICONV_RELATIVE_TO_LIBINTL ${LIBINTL_LIBRARIES} PATH)
405                 endif()
406         else()
407                 add_subdirectory(intl "${TOP_BINARY_DIR}/intl")
408         endif()
409 endif()
410
411 find_package(ICONV REQUIRED)
412 find_package(ZLIB REQUIRED)
413
414 if(LYX_EXTERNAL_BOOST)
415         message(STATUS "Searching for boost")
416         find_package(Boost COMPONENTS signals regex) #TODO could REQUIRED be used
417         if(Boost_FOUND)
418                 message(STATUS "Boost found")
419                 message(STATUS "Boost-libs = ${Boost_LIBRARIES}")
420                 set(Lyx_Boost_Libraries ${Boost_LIBRARIES})
421         else()
422                 message(FATAL_ERROR "Boost not found" ${Boost_ERROR_REASON})
423         endif()
424 else()
425         if(LYX_USE_TR1_REGEX)
426                 set(Lyx_Boost_Libraries boost_signals)
427         else()
428                 set(Lyx_Boost_Libraries boost_signals boost_regex)
429         endif()
430         add_definitions(-DBOOST_USER_CONFIG="<config.h>")
431         include_directories(${TOP_SRC_DIR}/boost)
432         add_subdirectory(boost "${TOP_BINARY_DIR}/boost")
433 endif()
434
435
436
437
438 if(WIN32)
439         if(NOT LYX_CONSOLE)
440                 set(WIN32_CONSOLE WIN32)
441                 set(LYX_QTMAIN_LIBRARY ${QT_QTMAIN_LIBRARY})
442         endif()
443         if(MSVC)
444                 add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DNOMINMAX)
445                 # disable checked iterators for msvc release builds to get maximum speed
446                 set(CMAKE_CXX_FLAGS_RELEASE  "${CMAKE_CXX_FLAGS_RELEASE} /D_SECURE_SCL=0")
447         else()
448                 add_definitions(-DWINVER=0x0500)
449         endif()
450 endif()
451
452 message(STATUS "")
453 foreach(_v PACKAGE PACKAGE_VERSION
454         PROGRAM_SUFFIX LYX_DATE LYX_DIR_VER LYX_USERDIR_VER
455         LYX_ABS_TOP_SRCDIR
456         LYX_ABS_INSTALLED_DATADIR LYX_ABS_INSTALLED_LOCALEDIR LYX_INSTALL_SUFFIX)
457         if(NOT DEFINED ${_v})
458                 message(FATAL_ERROR "${_v} not defined")
459         endif()
460         string(SUBSTRING "${_v}                            " 0 28 _v1)
461         message(STATUS "----- ${_v1}: ${${_v}}")
462 endforeach(_v)
463 message(STATUS "")
464
465
466 if(LYX_PCH)
467         # PCHs not supported by cmake: http://www.cmake.org/Bug/view.php?id=1260
468         # Not sure if it works for all non-msvc compilers
469         include(PCHSupport_26)
470         configure_file(${TOP_SRC_DIR}/${LYX_CMAKE_DIR}/pcheaders.h      ${TOP_BINARY_DIR}/pcheaders.h)
471         configure_file(${TOP_SRC_DIR}/${LYX_CMAKE_DIR}/config.cpp.cmake ${TOP_BINARY_DIR}/config_pch.cpp)
472         add_definitions(-DLYX_ENABLE_PCH)
473
474         if(MSVC)
475                 macro(lyx_add_msvc_pch name_)
476                         set_source_files_properties(${${name_}_sources} PROPERTIES
477                                 COMPILE_FLAGS "/Yuconfig.h /Fp\$(IntDir)/config.pch")
478                         set_source_files_properties(${TOP_BINARY_DIR}/config_pch.cpp PROPERTIES
479                                 COMPILE_FLAGS "/Ycconfig.h /Fp\$(IntDir)/config.pch")
480                         set(${name_}_sources ${${name_}_sources} ${TOP_BINARY_DIR}/config_pch.cpp
481                                 ${TOP_BINARY_DIR}/pcheaders.h)
482                         set(CMAKE_CXX_FLAGS_DEBUG       "${CMAKE_CXX_FLAGS_DEBUG} /DLYX_PCH_STL /DLYX_PCH_BOOST /DLYX_PCH_QT4")
483                         set(CMAKE_CXX_FLAGS_RELEASE     "${CMAKE_CXX_FLAGS_RELEASE} /DLYX_PCH_STL /DLYX_PCH_BOOST /DLYX_PCH_QT4")
484                         set(CMAKE_CXX_FLAGS_MINSIZEREL  "${CMAKE_CXX_FLAGS_MINSIZEREL} /DLYX_PCH_STL /DLYX_PCH_BOOST")                  
485                 endmacro(lyx_add_msvc_pch)
486                 macro(lyx_add_gcc_pch name_)
487                 endmacro()
488         else()
489                 macro(lyx_add_msvc_pch name_)
490                 endmacro()
491                 macro(lyx_add_gcc_pch name_)
492                         add_definitions(-DLYX_PCH_STL -DLYX_PCH_BOOST -DLYX_PCH_QT4)
493                         ADD_PRECOMPILED_HEADER(${name_} ${TOP_BINARY_DIR}/config_pch.cpp ${TOP_BINARY_DIR}/config.h.gch)
494                 endmacro()
495         endif()
496 else()
497         macro(lyx_add_msvc_pch)
498         endmacro(lyx_add_msvc_pch)
499         macro(lyx_add_gcc_pch name_)
500         endmacro()
501 endif()
502
503 if(MSVC)
504         if(LYX_VLD)
505                 set(LYX_LEAK_DETECTION 1 CACHE TYPE STRING FORCE)
506                 set(LIBRARY_OUTPUT_PATH  ${EXECUTABLE_OUTPUT_PATH})
507                 set(LYX_VLD_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../Win32/vld)
508                 include(${LYX_VLD_PATH}/tools/cmake/vld.cmake)
509         endif()
510
511         if(LYX_WALL)
512                 # Use the highest warning level
513                 set(CMAKE_CXX_WARNING_LEVEL 4 CACHE TYPE STRING FORCE)
514
515                 if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
516                         string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
517                 else()
518                         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
519                 endif()
520
521                 if(CMAKE_C_FLAGS MATCHES "/W[0-4]")
522                         string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
523                 else()
524                         set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4")
525                 endif()
526
527                 # add here warnings which should produce an error /weXXXX
528                 set(MSVC_W_ERROR   "/we4101 /we4189")
529                 # add here warnings which should be disabled /wdXXXX
530                 set(MSVC_W_DISABLE "/wd4288 /wd4355 /wd4800 /wd4996 /wd4311 /wd4312 /wd4505 /wd4267 /wd4512 /wd4245 /wd4127 /wd4180 /wd4231")
531
532                 set(CMAKE_CXX_FLAGS_DEBUG      "${CMAKE_CXX_FLAGS_DEBUG} /Wp64 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
533                 set(CMAKE_CXX_FLAGS_RELEASE    "${CMAKE_CXX_FLAGS_RELEASE} /Wp64 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
534                 set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /Wp64 ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
535
536         else()
537                 set(CMAKE_CXX_WARNING_LEVEL 3 CACHE TYPE STRING FORCE)
538
539                 # add here warnings which should produce an error /weXXXX
540                 set(MSVC_W_ERROR   "/we4101 /we4189")
541                 # add here warnings which should be disabled /wdXXXX
542                 set(MSVC_W_DISABLE "/wd4288 /wd4355 /wd4800 /wd4996 /wd4267 /wd4180 /wd4231")
543
544                 set(CMAKE_CXX_FLAGS_DEBUG      "${CMAKE_CXX_FLAGS_DEBUG} ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
545                 set(CMAKE_CXX_FLAGS_RELEASE    "${CMAKE_CXX_FLAGS_RELEASE} ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
546                 set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} ${MSVC_W_ERROR} ${MSVC_W_DISABLE}")
547
548         endif()
549         set(CMAKE_CXX_FLAGS_DEBUG      "${CMAKE_CXX_FLAGS_DEBUG} /Zc:wchar_t-")
550         set(CMAKE_CXX_FLAGS_RELEASE    "${CMAKE_CXX_FLAGS_RELEASE} /Zc:wchar_t-")
551         set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL} /Zc:wchar_t-")
552
553         message(STATUS "----- Warning level      : ${CMAKE_CXX_WARNING_LEVEL}  ${WARNING_LEVEL_MESSAGE}")
554         message(STATUS "----- Warnings as errors : ${MSVC_W_ERROR}")
555         message(STATUS "----- Warnings disabled  : ${MSVC_W_DISABLE}")
556         message(STATUS "")
557 endif()
558
559
560 if(LYX_DEBUG_GLIBC)
561         set(_GLIBCXX_DEBUG 1)
562 endif()
563
564 if(LYX_DEBUG_GLIBC_PEDANTIC)
565         set(_GLIBCXX_DEBUG_PEDANTIC 1)
566 endif()
567
568 # compiler tests, config.h generation
569 if(MSVC AND NOT LYX_CONFIGURE_CHECKS)
570         configure_file(${LYX_CMAKE_DIR}/configCompiler.h.msvc ${TOP_BINARY_DIR}/configCompiler.h)
571 else()
572         include(${LYX_CMAKE_DIR}/ConfigureChecks.cmake)
573         configure_file(${LYX_CMAKE_DIR}/configCompiler.h.cmake ${TOP_BINARY_DIR}/configCompiler.h)
574 endif()
575
576 configure_file(${LYX_CMAKE_DIR}/config.h.cmake ${TOP_BINARY_DIR}/config.h)
577
578
579 add_subdirectory(src "${TOP_BINARY_DIR}/src")
580 add_subdirectory(lib/lyx2lyx "${TOP_BINARY_DIR}/lyx2lyx")
581 add_subdirectory(lib/scripts "${TOP_BINARY_DIR}/scripts")
582
583
584 if(LYX_INSTALL)
585         #FIND_PROGRAM(LYX_PERL_EXECUTABLE perl)
586         if(${LYX_PYTHON_EXECUTABLE} MATCHES "-NOTFOUND")
587                 message(STATUS "Python required to create doc!")
588         else()
589                 add_subdirectory(${LYX_CMAKE_DIR}/man "${TOP_BINARY_DIR}/man")
590                 add_subdirectory(${LYX_CMAKE_DIR}/doc "${TOP_BINARY_DIR}/doc")
591         endif()
592         include(../Install)
593 endif()
594
595 add_subdirectory(sourcedoc "${TOP_BINARY_DIR}/sourcedoc")
596
597 message(STATUS)
598 message(STATUS "Build options, switch LYX_* variables by -DLYX_*=1 or 0:")
599 message(STATUS)
600 LYX_OPTION_LIST_ALL(used)
601
602
603 if(LYX_NLS)
604         message(STATUS)
605         message(STATUS "Building Native Language Support (LYX_NLS is set), used libraries:")
606         message(STATUS)
607         message(STATUS "  * intl")
608         message(STATUS "     - header : ${LIBINTL_HEADER}")
609         message(STATUS "     - library: ${LIBINTL_LIBRARIES}")
610         message(STATUS "  * iconv")
611         message(STATUS "     - header : ${ICONV_HEADER}")
612         message(STATUS "     - library: ${ICONV_LIBRARY}")
613         message(STATUS "  * zlib")
614         message(STATUS "     - header : ${ZLIB_HEADER}")
615         message(STATUS "     - library: ${ZLIB_LIBRARY}")
616         message(STATUS)
617 endif()
618
619
620 # CPack packaging
621 #
622 # http://cmake.org/cmake/help/cmake-2-8-docs.html#module:CPack
623
624 set(CPACK_PACKAGE_VERSION_MAJOR "${LYX_MAJOR_VERSION}")
625 set(CPACK_PACKAGE_VERSION_MINOR "${LYX_MINOR_VERSION}")
626 FILE(STRINGS "${TOP_SRC_DIR}/${LYX_CMAKE_DIR}/LyX_summary.txt" CPACK_PACKAGE_DESCRIPTION_SUMMARY)
627
628 set(CPACK_SOURCE_GENERATOR TGZ ZIP TBZ2)
629 set(CPACK_SOURCE_INSTALLED_DIRECTORIES "${TOP_SRC_DIR};/") # http://www.mail-archive.com/cmake@cmake.org/msg33720.html
630
631 set(CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${LYX_INSTALL_SUFFIX}")
632
633 set(CPACK_SOURCE_GENERATOR TGZ ZIP TBZ2)
634 set(CPACK_SOURCE_INSTALLED_DIRECTORIES "${TOP_SRC_DIR};/") # http://www.mail-archive.com/cmake@cmake.org/msg33720.html
635 #
636 # needed by rpm
637 set(CPACK_SET_DESTDIR "ON")
638 FILE(READ "${TOP_SRC_DIR}/${LYX_CMAKE_DIR}/LyX_license.txt" CPACK_RPM_PACKAGE_LICENSE)
639 set(CPACK_RPM_PACKAGE_GROUP "Applications/Publishing")
640 set(CPACK_RPM_PACKAGE_VENDOR "The LyX team")
641 #
642 # the next ones are needed by deb
643 set(CPACK_PACKAGE_CONTACT "${PACKAGE_BUGREPORT}")
644 set(CPACK_SOURCE_PACKAGE_FILE_NAME "${LYX_PROJECT}-${LYX_INSTALL_SUFFIX}")
645
646 # This is experimental, valid on _my_ system (Kornel)
647 set(CPACK_DEBIAN_PACKAGE_DEPENDS "libqtgui4 (>= 4.4.3-0)")
648 if(ASPELL_FOUND)
649         set(CPACK_DEBIAN_PACKAGE_DEPENDS "libaspell15 (>= 0.60.6-1),${CPACK_DEBIAN_PACKAGE_DEPENDS}")
650 endif()
651 if(ENCHANT_FOUND)
652         set(CPACK_DEBIAN_PACKAGE_DEPENDS "libenchant1c2a (>= 1.6.0-0),${CPACK_DEBIAN_PACKAGE_DEPENDS}")
653 endif()
654 if(LYX_EXTERNAL_BOOST)
655         if(Boost_FOUND)
656                 set(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-regex1.40.0 (>= 1.40.0-4),libboost-signals1.40.0 (>= 1.40.0-4),${CPACK_DEBIAN_PACKAGE_DEPENDS}")
657         endif()
658 endif()
659 #
660 # for the next ones, cpack insists on data with values in some file
661 set(CPACK_PACKAGE_DESCRIPTION_FILE "${TOP_SRC_DIR}/${LYX_CMAKE_DIR}/LyX_description.txt")
662 set(CPACK_RESOURCE_FILE_LICENSE "${TOP_SRC_DIR}/${LYX_CMAKE_DIR}/LyX_license.txt")
663
664 # Find the revision number and use it as the release in rpm-package-build.
665 # This way we may omit the otherwise needed "--force" parameter when
666 # installing from that rpm package.
667 FIND_PROGRAM(LYX_SVNVERSION svnversion)
668 #message(STATUS "svnversion = ${LYX_SVNVERSION}")
669 if(LYX_SVNVERSION)
670         EXECUTE_PROCESS(COMMAND ${LYX_SVNVERSION} WORKING_DIRECTORY "${TOP_SRC_DIR}" OUTPUT_VARIABLE CPACK_RPM_PACKAGE_RELEASE OUTPUT_STRIP_TRAILING_WHITESPACE)
671         # We use this value also to set the package-patch-value
672         if(CPACK_RPM_PACKAGE_RELEASE MATCHES "^\([0-9]+\)")
673                 set(CPACK_PACKAGE_VERSION_PATCH ${CMAKE_MATCH_1}) # TODO this is not the patch level
674                 set(LYX_REVISION_VERSION ${CMAKE_MATCH_1})
675         endif()
676 else()
677         set(LYX_REVISION_VERSION svn) #TODO use date
678 endif()
679
680
681 # we do not have a readme or welcome data,
682 # so we do not provide infofiles for
683 # CPACK_RESOURCE_FILE_README and CPACK_RESOURCE_FILE_WELCOME
684
685 if(UNIX)
686         set(CPACK_GENERATOR STGZ)
687         set(CPACK_SOURCE_GENERATOR TGZ TBZ2)
688 elseif(WIN32)
689         set(CPACK_GENERATOR NSIS ZIP)
690         set(CPACK_BINARY_ZIP 1)
691         set(CPACK_SOURCE_GENERATOR ZIP)
692 endif()
693
694
695 set(CPACK_STRIP_FILES 1)
696
697 # sources
698 set(CPACK_SOURCE_INSTALLED_DIRECTORIES "${TOP_SRC_DIR};/") # http://www.mail-archive.com/cmake@cmake.org/msg33720.html
699
700
701
702 if(LYX_CPACK)
703         set(CPACK_PACKAGE_NAME LyX)
704         if(APPLE)
705                 set(CPACK_GENERATOR DragNDrop)  
706         elseif(WIN32)
707                 message(STATUS "Configuring NSIS files")
708                 configure_file(development/Win32/packaging/installer/lyx.nsi.cmake ${CMAKE_BINARY_DIR}/installer/lyx.nsi @ONLY)
709                 configure_file(development/Win32/packaging/installer/settings.nsh.cmake ${CMAKE_BINARY_DIR}/installer/settings-cmake.nsh @ONLY)
710                 configure_file(development/Win32/packaging/installer/include/declarations.nsh.cmake ${CMAKE_BINARY_DIR}/installer/declarations-cmake.nsh @ONLY)
711                 set(CPACK_GENERATOR ZIP)
712                 message(STATUS "NSIS files are created in ${CMAKE_BINARY_DIR}/installer")
713                 message(STATUS "A zipped only release could be created by building the 'PACKAGE' project")
714         else()
715                 message(STATUS "Building self extracting binary bundle.")
716                 message(STATUS "To embed Qt in this bundle don't build with your system Qt:")
717                 message(STATUS "  - fix PATH so a other qmake is found by cmake")
718                 message(STATUS "  - fix LD_LIBRARY_PATH so lyx doesn't use system's Qt")
719         endif()
720
721         include(CPack)
722 endif()
723
724
725 #Now it is possible to create some packages
726 # cd <BuildDir>
727 # make package
728 #############################################################################################
729 # So, e.g. for variables
730 #    CMAKE_PROJECT_NAME                     : lyx
731 #    CPACK_PACKAGE_VERSION_MAJOR            : 2
732 #    CPACK_PACKAGE_VERSION_MINOR            : 0
733 #    CPACK_PACKAGE_VERSION_PATCH            : 1
734 #    CMAKE_SYSTEM_NAME                      : Linux
735 #    CPACK_BINARY_DEB:BOOL                  : ON
736 #
737 # the package name builds as "lyx-2.0.1-Linux.deb"
738 #
739 ############################## rpm ################################### deb ##################
740 # create    # cpack -G RPM --config CPackConfig.cmake   # cpack -G DEB --config CPackConfig.cmake
741 # creates =># lyx-2.0.1-Linux.rpm                       # lyx-2.0.1-Linux.deb
742 # list      # rpm -qlp lyx-2.0.1-Linux.rpm              # dpkg-deb -c lyx-2.0.1-Linux.deb
743 # install   # rpm -U lyx-2.0.1-Linux.rpm                # dpkg -i lyx-2.0.1-Linux.deb
744 #
745 message(STATUS)
746
747 endif() #help
748