]> gitweb.ps.run Git - toc/blob - antlr4-cpp-runtime-4.9.2-source/CMakeLists.txt
add antlr source code and ReadMe
[toc] / antlr4-cpp-runtime-4.9.2-source / CMakeLists.txt
1 # -*- mode:cmake -*-
2 cmake_minimum_required (VERSION 2.8)
3 # 2.8 needed because of ExternalProject
4
5 # Detect build type, fallback to release and throw a warning if use didn't specify any
6 if(NOT CMAKE_BUILD_TYPE)
7   message(WARNING "Build type not set, falling back to Release mode.
8  To specify build type use:
9  -DCMAKE_BUILD_TYPE=<mode> where <mode> is Debug or Release.")
10   set(CMAKE_BUILD_TYPE "Release" CACHE STRING
11        "Choose the type of build, options are: Debug Release."
12        FORCE)
13 endif(NOT CMAKE_BUILD_TYPE)
14
15 if(NOT WITH_DEMO)
16   message(STATUS "Building without demo. To enable demo build use: -DWITH_DEMO=True")
17   set(WITH_DEMO False CACHE STRING
18     "Chose to build with or without demo executable"
19     FORCE)
20 endif(NOT WITH_DEMO)
21
22 option(WITH_LIBCXX "Building with clang++ and libc++(in Linux). To enable with: -DWITH_LIBCXX=On" Off)
23 option(WITH_STATIC_CRT "(Visual C++) Enable to statically link CRT, which avoids requiring users to install the redistribution package.
24  To disable with: -DWITH_STATIC_CRT=Off" On)
25
26 project(LIBANTLR4)
27
28 if(CMAKE_VERSION VERSION_EQUAL "3.0.0" OR
29    CMAKE_VERSION VERSION_GREATER "3.0.0")
30   CMAKE_POLICY(SET CMP0026 NEW)
31   CMAKE_POLICY(SET CMP0054 OLD)
32   CMAKE_POLICY(SET CMP0045 OLD)
33   CMAKE_POLICY(SET CMP0042 OLD)
34 endif()
35
36 if(CMAKE_VERSION VERSION_EQUAL "3.3.0" OR
37    CMAKE_VERSION VERSION_GREATER "3.3.0")
38   CMAKE_POLICY(SET CMP0059 OLD)
39   CMAKE_POLICY(SET CMP0054 OLD)
40 endif()
41
42 if(CMAKE_SYSTEM_NAME MATCHES "Linux")
43   find_package(PkgConfig REQUIRED)
44   pkg_check_modules(UUID REQUIRED uuid)
45 endif()
46 if(APPLE)
47   find_library(COREFOUNDATION_LIBRARY CoreFoundation)
48 endif()
49
50 file(STRINGS "VERSION" ANTLR_VERSION)
51
52 if(WITH_DEMO)
53   # Java is not necessary if building without demos.
54   find_package(Java COMPONENTS Runtime REQUIRED)
55
56   if(NOT ANTLR_JAR_LOCATION)
57     message(FATAL_ERROR "Missing antlr4.jar location. You can specify it's path using: -DANTLR_JAR_LOCATION=<path>")
58   else()
59     get_filename_component(ANTLR_NAME ${ANTLR_JAR_LOCATION} NAME_WE)
60     if(NOT EXISTS "${ANTLR_JAR_LOCATION}")
61       message(FATAL_ERROR "Unable to find ${ANTLR_NAME} in ${ANTLR_JAR_LOCATION}")
62     else()
63       message(STATUS "Found ${ANTLR_NAME}: ${ANTLR_JAR_LOCATION}")
64     endif()
65   endif()
66 endif(WITH_DEMO)
67
68 if(MSVC_VERSION)
69   set(MY_CXX_WARNING_FLAGS "  /W4")
70 else()
71   set(MY_CXX_WARNING_FLAGS "  -Wall -pedantic -W")
72 endif()
73
74 # Define USE_UTF8_INSTEAD_OF_CODECVT macro.
75 # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_UTF8_INSTEAD_OF_CODECVT")
76
77 # Initialize CXXFLAGS.
78 if("${CMAKE_VERSION}" VERSION_GREATER 3.1.0)
79   if(NOT DEFINED CMAKE_CXX_STANDARD)
80     # only set CMAKE_CXX_STANDARD if not already set
81     # this allows the standard to be set by the caller, for example with -DCMAKE_CXX_STANDARD:STRING=17
82     set(CMAKE_CXX_STANDARD 11)
83   endif()
84   set(CMAKE_CXX_STANDARD_REQUIRED ON)
85   set(CMAKE_CXX_EXTENSIONS OFF)
86 else()
87   set(CMAKE_CXX_FLAGS                "${CMAKE_CXX_FLAGS} -std=c++11")
88   set(CMAKE_CXX_FLAGS_DEBUG          "${CMAKE_CXX_FLAGS_DEBUG} -std=c++11")
89   set(CMAKE_CXX_FLAGS_MINSIZEREL     "${CMAKE_CXX_FLAGS_MINSIZEREL} -std=c++11")
90   set(CMAKE_CXX_FLAGS_RELEASE        "${CMAKE_CXX_FLAGS_RELEASE} -std=c++11")
91   set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -std=c++11")
92 endif()
93
94 set(CMAKE_CXX_FLAGS                  "${CMAKE_CXX_FLAGS} ${MY_CXX_WARNING_FLAGS}")
95 if(MSVC_VERSION)
96   set(CMAKE_CXX_FLAGS_DEBUG          "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MP ${MY_CXX_WARNING_FLAGS}")
97   set(CMAKE_CXX_FLAGS_MINSIZEREL     "${CMAKE_CXX_FLAGS_MINSIZEREL} /O1 /Oi /Ob2 /Gy /MP /DNDEBUG ${MY_CXX_WARNING_FLAGS}")
98   set(CMAKE_CXX_FLAGS_RELEASE        "${CMAKE_CXX_FLAGS_RELEASE} /O2 /Oi /Ob2 /Gy /MP /DNDEBUG ${MY_CXX_WARNING_FLGAS}")
99   set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /O2 /Oi /Ob2 /Gy /MP /Zi ${MY_CXX_WARNING_FLAGS}")
100 else()
101   set(CMAKE_CXX_FLAGS_DEBUG          "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g ${MY_CXX_WARNING_FLAGS}")
102   set(CMAKE_CXX_FLAGS_MINSIZEREL     "${CMAKE_CXX_FLAGS_MINSIZEREL} -Os -DNDEBUG ${MY_CXX_WARNING_FLAGS}")
103   set(CMAKE_CXX_FLAGS_RELEASE        "${CMAKE_CXX_FLAGS_RELEASE} -O3 -DNDEBUG ${MY_CXX_WARNING_FLGAS}")
104   set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O2 -g ${MY_CXX_WARNING_FLAGS}")
105 endif()
106
107 # Compiler-specific C++11 activation.
108 if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Intel")
109     execute_process(
110         COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
111     # Just g++-5.0 and greater contain <codecvt> header. (test in ubuntu)
112     if(NOT (GCC_VERSION VERSION_GREATER 5.0 OR GCC_VERSION VERSION_EQUAL 5.0))
113         message(FATAL_ERROR "${PROJECT_NAME} requires g++ 5.0 or greater.")
114     endif ()
115 elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND ANDROID) 
116         # Need -Os cflag and cxxflags here to work with exception handling on armeabi.
117         # see  https://github.com/android-ndk/ndk/issues/573
118         # and without -stdlib=libc++ cxxflags
119 elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND APPLE)
120     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
121 elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" AND ( CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "FreeBSD") )
122     execute_process(
123         COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE CLANG_VERSION)
124     if(NOT (CLANG_VERSION VERSION_GREATER 4.2.1 OR CLANG_VERSION VERSION_EQUAL 4.2.1))
125         message(FATAL_ERROR "${PROJECT_NAME} requires clang 4.2.1 or greater.")
126     endif()
127     # You can use libc++ to compile this project when g++ is NOT greater than or equal to 5.0.
128     if(WITH_LIBCXX)
129         set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
130     endif()
131 elseif(MSVC_VERSION GREATER 1800 OR MSVC_VERSION EQUAL 1800)
132   # Visual Studio 2012+ supports c++11 features 
133 elseif(CMAKE_SYSTEM_NAME MATCHES "Emscripten")
134     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -stdlib=libc++")
135 else()
136     message(FATAL_ERROR "Your C++ compiler does not support C++11.")
137 endif()
138
139
140 add_subdirectory(runtime)
141 if(WITH_DEMO)
142  add_subdirectory(demo)
143 endif(WITH_DEMO)
144
145 # Generate CMake Package Files only if install is active
146 if (ANTLR4_INSTALL)
147
148   include(GNUInstallDirs)
149   include(CMakePackageConfigHelpers)
150
151   if(NOT ANTLR4_CMAKE_DIR)
152     set(ANTLR4_CMAKE_DIR ${CMAKE_INSTALL_LIBDIR}/cmake CACHE STRING
153       "Installation directory for cmake files." FORCE )
154   endif(NOT ANTLR4_CMAKE_DIR)
155
156   set(version_runtime_config ${PROJECT_BINARY_DIR}/antlr4-runtime-config-version.cmake)
157   set(version_generator_config ${PROJECT_BINARY_DIR}/antlr4-generator-config-version.cmake)
158   set(project_runtime_config ${PROJECT_BINARY_DIR}/antlr4-runtime-config.cmake)
159   set(project_generator_config ${PROJECT_BINARY_DIR}/antlr4-generator-config.cmake)
160   set(targets_export_name antlr4-targets)
161
162   set(ANTLR4_LIB_DIR ${CMAKE_INSTALL_LIBDIR} CACHE STRING
163       "Installation directory for libraries, relative to ${CMAKE_INSTALL_PREFIX}.")
164   
165   set(ANTLR4_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}/antlr4-runtime CACHE STRING
166       "Installation directory for include files, relative to ${CMAKE_INSTALL_PREFIX}.")
167
168   configure_package_config_file(
169     cmake/antlr4-runtime.cmake.in
170     ${project_runtime_config}
171     INSTALL_DESTINATION ${ANTLR4_CMAKE_DIR}/antlr4-runtime
172     PATH_VARS 
173     ANTLR4_INCLUDE_DIR
174     ANTLR4_LIB_DIR )
175   
176   configure_package_config_file(
177     cmake/antlr4-generator.cmake.in
178     ${project_generator_config}
179     INSTALL_DESTINATION ${ANTLR4_CMAKE_DIR}/antlr4-generator
180     PATH_VARS 
181     ANTLR4_INCLUDE_DIR
182     ANTLR4_LIB_DIR )
183   
184   write_basic_package_version_file(
185     ${version_runtime_config}
186     VERSION ${ANTLR_VERSION}
187     COMPATIBILITY SameMajorVersion )
188
189   write_basic_package_version_file(
190     ${version_generator_config}
191     VERSION ${ANTLR_VERSION}
192     COMPATIBILITY SameMajorVersion )
193
194   install(EXPORT ${targets_export_name}
195           DESTINATION ${ANTLR4_CMAKE_DIR}/antlr4-runtime )
196
197   install(FILES ${project_runtime_config}
198                 ${version_runtime_config}
199           DESTINATION ${ANTLR4_CMAKE_DIR}/antlr4-runtime )
200
201   install(FILES ${project_generator_config}
202                 ${version_generator_config}
203           DESTINATION ${ANTLR4_CMAKE_DIR}/antlr4-generator )
204
205 endif(ANTLR4_INSTALL)
206
207 if(EXISTS LICENSE.txt)
208 install(FILES LICENSE.txt
209         DESTINATION "share/doc/libantlr4")
210 elseif(EXISTS ../../LICENSE.txt) 
211 install(FILES ../../LICENSE.txt
212     DESTINATION "share/doc/libantlr4")
213 endif()
214
215 install(FILES README.md VERSION 
216     DESTINATION "share/doc/libantlr4")
217
218 set(CPACK_PACKAGE_CONTACT "antlr-discussion@googlegroups.com")
219 set(CPACK_PACKAGE_VERSION ${ANTLR_VERSION})
220 include(CPack)