generated from TheLartians/ModernCppStarter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
158 lines (131 loc) · 5.76 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)
# ---- Project ----
# Note: update this to your new project's name and version
project(
ZRegex
VERSION 1.0
LANGUAGES CXX
)
# ---- Include guards ----
if (PROJECT_SOURCE_DIR STREQUAL PROJECT_BINARY_DIR)
message(
FATAL_ERROR
"In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there."
)
endif ()
# ---- Add dependencies via CPM ----
# see https://github.com/TheLartians/CPM.cmake for more info
include(cmake/CPM.cmake)
# PackageProject.cmake will be used to make our target installable
CPMAddPackage("gh:TheLartians/[email protected]")
# Google Re2 as fallback
#CPMAddPackage(
# NAME re2
# GIT_TAG 2021-11-01
# GITHUB_REPOSITORY google/re2
#)
#CPMAddPackage(
# NAME fmt
# GIT_TAG 7.1.3
# GITHUB_REPOSITORY fmtlib/fmt
# OPTIONS "FMT_INSTALL YES" # create an installable target
#)
# logging
CPMAddPackage(
NAME spdlog
GIT_TAG v1.9.2
GITHUB_REPOSITORY gabime/spdlog
OPTIONS "SPDLOG_INSTALL YES" # create an installable target
)
# SET (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
# json
#CPMAddPackage("gh:nlohmann/[email protected]")
#micro-benchmark
#CPMAddPackage(
# NAME benchmark
# GIT_TAG v1.6.0
# GITHUB_REPOSITORY google/benchmark
# OPTIONS "BENCHMARK_ENABLE_TESTING NO"
#)
set(CXX_STANDARD 17)
#antlr4 parser
add_definitions(-DANTLR4CPP_STATIC)
# using /MD flag for antlr4_runtime (for Visual C++ compilers only)
set(ANTLR4_WITH_STATIC_CRT OFF)
# add external build for antlrcpp
include(cmake/antlr/ExternalAntlr4Cpp.cmake)
message("ANTLR_ROOT ${ANTLR4_ROOT}")
message("ANTLR4_INCLUDE_DIRS ${ANTLR4_INCLUDE_DIRS}")
# add antrl4cpp artifacts to project environment
include_directories(${ANTLR4_INCLUDE_DIRS})
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/../cmake/antlr/")
find_package(ANTLR REQUIRED)
# Call macro to add lexer and grammar to your build dependencies.
message("prr ${PROJECT_BINARY_DIR}")
set(GRAMMAR_SRC ${PROJECT_SOURCE_DIR}/include/parser/grammar)
antlr_target(RegexGrammarParser ${PROJECT_SOURCE_DIR}/include/parser/grammar/Regex.g4 VISITOR OUTPUT_DIRECTORY ${GRAMMAR_SRC})
include_directories(${PROJECT_SOURCE_DIR} ${GRAMMAR_SRC})
message("RegexGrammarParser ${ANTLR_RegexGrammarParser_CXX_OUTPUTS}")
# llvm
if (APPLE)
list(APPEND CMAKE_PREFIX_PATH "/opt/homebrew/opt/llvm@13/lib/cmake")
endif (APPLE)
find_package(LLVM 13 REQUIRED CONFIG)
message(STATUS "LLVM_INCLUDE_DIRS = ${LLVM_INCLUDE_DIRS}")
message(STATUS "LLVM_INSTALL_PREFIX = ${LLVM_INSTALL_PREFIX}")
message(STATUS "LLVM_DEFINITIONS = ${LLVM_DEFINITIONS}")
message(STATUS "LLVM_TARGETS_TO_BUILD = ${LLVM_TARGETS_TO_BUILD}")
separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS})
message(STATUS "LLVM_DEFINITIONS_LIST = ${LLVM_DEFINITIONS_LIST}")
add_definitions(${LLVM_DEFINITIONS_LIST})
# add_definitions(${LLVM_DEFINITIONS})
llvm_map_components_to_libnames(LLVM_LIBS core support irreader x86codegen orcjit ${LLVM_TARGETS_TO_BUILD})
# llvm_map_components_to_libnames(LLVM_LIBS orcjit support core irreader x86codegen )
message(STATUS "LLVMLIBS: ${LLVM_LIBS}")
# ---- Add source files ----
# Note: globbing sources is considered bad practice as CMake's generators may not detect new files
# automatically. Keep that in mind when changing files, or explicitly mention them here.
file(GLOB_RECURSE headers CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/include/*.h")
file(GLOB_RECURSE sources CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/source/*.cpp")
# ---- Create library ----
# Note: for header-only libraries change all PUBLIC flags to INTERFACE and create an interface
# target: add_library(${PROJECT_NAME} INTERFACE)
add_library(${PROJECT_NAME} ${headers} ${sources} ${ANTLR_RegexGrammarParser_CXX_OUTPUTS})
set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 17)
# being a cross-platform target, we enforce standards conformance on MSVC
target_compile_options(${PROJECT_NAME} PUBLIC "$<$<COMPILE_LANG_AND_ID:CXX,MSVC>:/permissive->")
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
# Link dependencies
#target_link_libraries(${PROJECT_NAME} PRIVATE fmt::fmt)
#target_link_libraries(${PROJECT_NAME} PUBLIC re2)
target_link_libraries(${PROJECT_NAME} PUBLIC spdlog)
#target_link_libraries(${PROJECT_NAME} PUBLIC benchmark)
#target_link_libraries(${PROJECT_NAME} PRIVATE nlohmann_json::nlohmann_json)
target_link_libraries(${PROJECT_NAME} PRIVATE ${LLVM_LIBS})
target_link_libraries(${PROJECT_NAME} PUBLIC antlr4_static)
message("ANTLR4_STATIC_LIBRARIES ${ANTLR4_STATIC_LIBRARIES}")
target_include_directories(
${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include/${PROJECT_NAME}-${PROJECT_VERSION}>
)
target_include_directories(
${PROJECT_NAME} PUBLIC $<BUILD_INTERFACE:${ANTLR4_INCLUDE_DIRS}>
$<INSTALL_INTERFACE:include/${PROJECT_NAME}-${PROJECT_VERSION}>
)
target_include_directories(${PROJECT_NAME} PUBLIC ${LLVM_INCLUDE_DIRS})
# ---- Create an installable target ----
# this allows users to install and find the library via `find_package()`.
# the location where the project's version header will be placed should match the project's regular
# header paths
string(TOLOWER ${PROJECT_NAME}/version.h VERSION_HEADER_LOCATION)
packageProject(
NAME ${PROJECT_NAME}
VERSION ${PROJECT_VERSION}
NAMESPACE ${PROJECT_NAME}
BINARY_DIR ${PROJECT_BINARY_DIR}
INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include
INCLUDE_DESTINATION include/${PROJECT_NAME}-${PROJECT_VERSION}
VERSION_HEADER "${VERSION_HEADER_LOCATION}"
COMPATIBILITY SameMajorVersion
DEPENDENCIES "fmt 7.1.3"
)