2 cmake_minimum_required (VERSION 2.8)
3 # 2.8 needed because of ExternalProject
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."
13 endif(NOT CMAKE_BUILD_TYPE)
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"
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)
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)
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)
42 if(CMAKE_SYSTEM_NAME MATCHES "Linux")
43 find_package(PkgConfig REQUIRED)
44 pkg_check_modules(UUID REQUIRED uuid)
47 find_library(COREFOUNDATION_LIBRARY CoreFoundation)
50 file(STRINGS "VERSION" ANTLR_VERSION)
53 # Java is not necessary if building without demos.
54 find_package(Java COMPONENTS Runtime REQUIRED)
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>")
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}")
63 message(STATUS "Found ${ANTLR_NAME}: ${ANTLR_JAR_LOCATION}")
69 set(MY_CXX_WARNING_FLAGS " /W4")
71 set(MY_CXX_WARNING_FLAGS " -Wall -pedantic -W")
74 # Define USE_UTF8_INSTEAD_OF_CODECVT macro.
75 # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_UTF8_INSTEAD_OF_CODECVT")
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)
84 set(CMAKE_CXX_STANDARD_REQUIRED ON)
85 set(CMAKE_CXX_EXTENSIONS OFF)
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")
94 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MY_CXX_WARNING_FLAGS}")
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}")
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}")
107 # Compiler-specific C++11 activation.
108 if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Intel")
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.")
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") )
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.")
127 # You can use libc++ to compile this project when g++ is NOT greater than or equal to 5.0.
129 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
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++")
136 message(FATAL_ERROR "Your C++ compiler does not support C++11.")
140 add_subdirectory(runtime)
142 add_subdirectory(demo)
145 # Generate CMake Package Files only if install is active
148 include(GNUInstallDirs)
149 include(CMakePackageConfigHelpers)
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)
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)
162 set(ANTLR4_LIB_DIR ${CMAKE_INSTALL_LIBDIR} CACHE STRING
163 "Installation directory for libraries, relative to ${CMAKE_INSTALL_PREFIX}.")
165 set(ANTLR4_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR}/antlr4-runtime CACHE STRING
166 "Installation directory for include files, relative to ${CMAKE_INSTALL_PREFIX}.")
168 configure_package_config_file(
169 cmake/antlr4-runtime.cmake.in
170 ${project_runtime_config}
171 INSTALL_DESTINATION ${ANTLR4_CMAKE_DIR}/antlr4-runtime
176 configure_package_config_file(
177 cmake/antlr4-generator.cmake.in
178 ${project_generator_config}
179 INSTALL_DESTINATION ${ANTLR4_CMAKE_DIR}/antlr4-generator
184 write_basic_package_version_file(
185 ${version_runtime_config}
186 VERSION ${ANTLR_VERSION}
187 COMPATIBILITY SameMajorVersion )
189 write_basic_package_version_file(
190 ${version_generator_config}
191 VERSION ${ANTLR_VERSION}
192 COMPATIBILITY SameMajorVersion )
194 install(EXPORT ${targets_export_name}
195 DESTINATION ${ANTLR4_CMAKE_DIR}/antlr4-runtime )
197 install(FILES ${project_runtime_config}
198 ${version_runtime_config}
199 DESTINATION ${ANTLR4_CMAKE_DIR}/antlr4-runtime )
201 install(FILES ${project_generator_config}
202 ${version_generator_config}
203 DESTINATION ${ANTLR4_CMAKE_DIR}/antlr4-generator )
205 endif(ANTLR4_INSTALL)
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")
215 install(FILES README.md VERSION
216 DESTINATION "share/doc/libantlr4")
218 set(CPACK_PACKAGE_CONTACT "antlr-discussion@googlegroups.com")
219 set(CPACK_PACKAGE_VERSION ${ANTLR_VERSION})