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