-
Notifications
You must be signed in to change notification settings - Fork 1
/
CMakeLists.txt
195 lines (151 loc) · 6.02 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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
cmake_minimum_required(VERSION 3.24)
# Macro
macro(add_feature_option OPTION_NAME FEATURE_NAME DESCRIPTION DEFAULT_VALUE)
option(${OPTION_NAME} ${DESCRIPTION} ${DEFAULT_VALUE})
if (${OPTION_NAME})
list(APPEND VCPKG_MANIFEST_FEATURES "${FEATURE_NAME}")
endif ()
endmacro()
# Lesma features
add_feature_option(LESMA_BUILD_CLI "cli" "Build CLI" ON)
add_feature_option(LESMA_BUILD_TESTS "tests" "Build Tests" OFF)
add_feature_option(LESMA_BUILD_BENCHMARKS "benchmarks" "Build Benchmarks" OFF)
add_feature_option(LESMA_BUILD_DIST "dist" "Build Dist" OFF)
add_feature_option(LESMA_BUILD_LLVM "build-llvm" "Build LLVM" OFF)
# Get version from vcpkg
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/vcpkg.json VCPKG_MANIFEST)
string(JSON LESMA_VERSION GET ${VCPKG_MANIFEST} version)
set(VERSION ${LESMA_VERSION})
# Set the vcpkg toolchain file
set(VCPKG_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/vcpkg")
set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake")
# Project
project(Lesma VERSION ${VERSION} DESCRIPTION "Lesma Compiler")
# C++ Flags and settings
if (CMAKE_BUILD_TYPE MATCHES Debug)
message(STATUS "Debug mode")
elseif (CMAKE_BUILD_TYPE MATCHES Release)
message(STATUS "Release mode")
endif ()
set(CMAKE_CXX_STANDARD 17)
add_definitions(${CMAKE_CXX_FLAGS} -Wall -Wextra -Wpedantic -frtti)
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
# External dependencies
find_package(fmt CONFIG REQUIRED)
find_package(nameof CONFIG REQUIRED)
find_path(PLF_NANOTIMER_INCLUDE_DIRS "plf_nanotimer.h")
# Directories
get_filename_component(ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR} ABSOLUTE)
get_filename_component(SRC_DIR ${ROOT_DIR}/src ABSOLUTE)
get_filename_component(LIB_DIR ${ROOT_DIR}/lib ABSOLUTE)
get_filename_component(STDLIB_DIR ${SRC_DIR}/stdlib ABSOLUTE)
get_filename_component(BUILD_DIR ${CMAKE_BINARY_DIR} ABSOLUTE)
# Version configuration
configure_file(
"${SRC_DIR}/liblesma/Common/LesmaVersion.h.in"
"${SRC_DIR}/liblesma/Common/LesmaVersion.h"
@ONLY
)
# Include directories
include_directories(${SRC_DIR})
include_directories(${LIB_DIR})
# Look for local dependencies
if (EXISTS "${LLVM_DIR}" AND IS_DIRECTORY "${LLVM_DIR}") # Prefer local LLVM installation
message(STATUS "Found local installation of LLVM and Clang")
set(LLVM_DIR ./llvm/build-release/lib/cmake/llvm)
set(Clang_DIR ./llvm/build-release/lib/cmake/clang)
endif ()
# LLVM configuration
find_package(LLVM 15 CONFIG REQUIRED)
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake from ${LLVM_DIR}")
list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_DIR}")
include(HandleLLVMOptions)
add_definitions(${LLVM_DEFINITIONS})
llvm_map_components_to_libnames(LLVM_LIBS core support demangle native orcjit)
# LLD configuration
find_package(LLD CONFIG REQUIRED)
message(STATUS "Found LLDConfig.cmake in ${LLD_CMAKE_DIR}")
include_directories(SYSTEM ${LLD_INCLUDE_DIRS})
set(LLD_LIBS lldCommon lldELF lldCOFF lldMachO)
# Clang
find_package(Clang CONFIG REQUIRED)
include_directories(SYSTEM ${CLANG_INCLUDE_DIRS})
add_definitions(${CLANG_DEFINITIONS})
set(CLANG_LIBS clangTooling)
# Executable configuration
set(LIB_NAME lesma)
set(COMMON_SOURCES
src/liblesma/Common/Utils.cpp
src/liblesma/Frontend/Lexer.cpp
src/liblesma/Frontend/Parser.cpp
src/liblesma/Token/Token.cpp
src/liblesma/Backend/Codegen.cpp
src/liblesma/Symbol/SymbolTable.cpp
src/liblesma/Driver/Driver.cpp
)
# Move Lesma Standard Library
file(COPY ${STDLIB_DIR} DESTINATION $ENV{HOME}/.lesma/)
# Libraries required for the compiler itself
set(COMMON_LIBS ${LLVM_LIBS} ${LLD_LIBS} ${CLANG_LIBS} fmt::fmt nameof::nameof)
set(COMMON_INCLUDE ${PLF_NANOTIMER_INCLUDE_DIRS})
# Lesma Library
## Create Library
add_library(${LIB_NAME} ${COMMON_SOURCES})
target_link_libraries(${LIB_NAME} ${COMMON_LIBS})
target_include_directories(${LIB_NAME} PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>"
${COMMON_INCLUDE}
${LLD_INCLUDE_DIRS}
${CLANG_INCLUDE_DIRS}
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>")
# CLI
if (LESMA_BUILD_CLI)
message(STATUS "Building Lesma CLI")
find_package(CLI11 CONFIG REQUIRED)
set(CLI_NAME lesmac)
set(CLI_SOURCES src/cli/main.cpp)
add_executable(${CLI_NAME} ${CLI_SOURCES})
target_link_libraries(${CLI_NAME} PRIVATE ${LIB_NAME} CLI11::CLI11)
set_target_properties(${CLI_NAME} PROPERTIES OUTPUT_NAME ${LIB_NAME})
endif ()
# Tests
if (LESMA_BUILD_TESTS)
message(STATUS "Building Lesma Tests")
enable_testing()
find_package(GTest CONFIG REQUIRED)
set(TESTS_NAME tests)
set(TEST_SOURCES tests/test.cpp)
add_executable(${TESTS_NAME} ${TEST_SOURCES})
target_link_libraries(${TESTS_NAME} PRIVATE ${LIB_NAME} GTest::gtest GTest::gtest_main GTest::gmock GTest::gmock_main)
find_program(BASH_PROGRAM bash)
if (BASH_PROGRAM)
add_test(test_lesma_sources ${BASH_PROGRAM} ${CMAKE_CURRENT_SOURCE_DIR}/scripts/run_tests.sh ${CMAKE_CURRENT_BINARY_DIR}/lesma)
endif (BASH_PROGRAM)
add_test(AllTestsInMain ${TESTS_NAME})
endif ()
# Benchmarks
if (LESMA_BUILD_BENCHMARKS)
message(STATUS "Building Lesma Benchmarks")
find_package(benchmark CONFIG REQUIRED)
set(BENCHMARKS_NAME benchmark)
set(BENCHMARK_SOURCES benchmark/benchmark.cpp)
add_executable(${BENCHMARKS_NAME} ${BENCHMARK_SOURCES})
target_link_libraries(${BENCHMARKS_NAME} PRIVATE ${LIB_NAME} benchmark::benchmark benchmark::benchmark_main)
endif ()
# CPack
if (LESMA_BUILD_DIST)
include(InstallRequiredSystemLibraries)
install(TARGETS ${CLI_NAME} RUNTIME DESTINATION bin)
install(DIRECTORY ${SRC_DIR}/stdlib DESTINATION .)
set(CPACK_GENERATOR "TGZ")
set(CPACK_PACKAGE_VENDOR Lesma)
set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH})
set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
set(CPACK_PACKAGE_HOMEPAGE_URL "https://lesma.org/")
set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}/docs/static/img/logo.svg")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt")
include(CPack)
endif ()