-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCMakeLists.txt
154 lines (142 loc) · 4.11 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
cmake_minimum_required(VERSION 3.0.0)
project(cplr)
include(CheckIncludeFile)
include(ExternalProject)
find_package(PkgConfig)
# TODO detect libm, libdl, libreadline, libpthread
set(CPLR_VERSION_STRING "0.1")
# build directory for dependencies
set(DEPBLD ${CMAKE_BINARY_DIR}/depbld)
# stage directory for dependencies
set(STAGE ${CMAKE_BINARY_DIR}/stage)
# Build optional BDW garbage collector
#
# We must build the collector ourselves because we want replace-malloc.
#
option(CPLR_ENABLE_BDWGC "Enable BDW garbage collector as malloc replacement" ON)
if(CPLR_ENABLE_BDWGC)
set(BDWGC_CONFIG --prefix=/bdwgc --enable-static --disable-shared --enable-replace-malloc)
set(BDWGC_SOURCE_DIR ${CMAKE_SOURCE_DIR}/deps/bdwgc)
# build bdwgc and install to stage
ExternalProject_Add(bdwgc
PREFIX ${DEPBLD}
SOURCE_DIR ${BDWGC_SOURCE_DIR}
DOWNLOAD_COMMAND true
PATCH_COMMAND autoreconf -vi ${BDWGC_SOURCE_DIR}
CONFIGURE_COMMAND ${BDWGC_SOURCE_DIR}/configure ${BDWGC_CONFIG} && make clean
BUILD_COMMAND make all
INSTALL_COMMAND make install DESTDIR=${STAGE}
)
# determine includes and libs
set(BDWGC_INCLUDE_DIRS ${STAGE}/bdwgc/include)
set(BDWGC_LDFLAGS ${STAGE}/bdwgc/lib/libgc.a)
endif()
# Build TinyCC or find using pkg-config
#
# We prefer building our own libtcc to prevent issues with stale versions.
#
# Use of external libtcc builds requires yet-unmerged pkg-config support.
#
option(CPLR_ENABLE_TINYCC "Enable TinyCC backend" ON)
if(CPLR_ENABLE_TINYCC)
option(CPLR_TINYCC_EXTERNAL "TinyCC: use system libtcc" OFF)
if(CPLR_TINYCC_EXTERNAL)
pkg_search_module(LIBTCC libtcc)
if(NOT LIBTCC_FOUND)
check_include_file(libtcc.h LIBTCC_INCLUDE_DIRS)
find_library(LIBTCC_LDFLAGS tcc RERQUIRED)
endif()
else()
set(TINYCC_CONFIG --prefix=/tinycc --enable-static)
set(TINYCC_SOURCE_DIR ${CMAKE_SOURCE_DIR}/deps/tinycc)
# build tinycc and install to stage
ExternalProject_Add(tinycc
PREFIX ${DEPBLD}
SOURCE_DIR ${TINYCC_SOURCE_DIR}
DOWNLOAD_COMMAND true
CONFIGURE_COMMAND ${TINYCC_SOURCE_DIR}/configure ${TINYCC_CONFIG} && make clean
BUILD_COMMAND make all
INSTALL_COMMAND make install DESTDIR=${STAGE}
)
# determine includes and libs
set(LIBTCC_INCLUDE_DIRS ${STAGE}/tinycc/include)
set(LIBTCC_LDFLAGS ${STAGE}/tinycc/lib/libtcc.a)
# install tcc libdir
set(CPLR_TINYCC_LIBDIR ${CMAKE_INSTALL_PREFIX}/lib/cplr/tcc)
install(
DIRECTORY ${CMAKE_BINARY_DIR}/stage/tinycc/lib/tcc
DESTINATION lib/cplr)
endif()
endif()
# Generate config header
configure_file(source/cplr_config.h.in source/cplr_config.h)
# Compatibility defines
add_compile_definitions(
_GNU_SOURCE _POSIX_C_SOURCE=200809L
)
# Main executable
add_executable(
cplr
source/cext_abort.c
source/cext_list.c
source/cext_memory.c
source/cext_string.c
source/cext_value.c
source/cpkg.c
source/cplr_command.c
source/cplr_compile.c
source/cplr_defaults.c
source/cplr_execute.c
source/cplr_generate.c
source/cplr_interact.c
source/cplr_main.c
source/cplr_optparse.c
source/cplr_package.c
source/cplr_prepare.c
source/cplr_run.c
source/cplr_state.c
source/cplr_symbols.c
)
# Include internal headers
target_include_directories(
cplr PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_include_directories(
cplr PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/source
)
target_include_directories(
cplr PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/source
)
# Take care of bdwgc
if(CPLR_ENABLE_BDWGC)
target_include_directories(
cplr PUBLIC ${BDWGC_INCLUDE_DIRS}
)
target_link_libraries(
cplr PUBLIC ${BDWGC_LDFLAGS}
)
if(NOT CPLR_BDWGC_EXTERNAL)
add_dependencies(cplr bdwgc)
endif()
endif()
# Take care of tinycc
if(CPLR_ENABLE_TINYCC)
target_include_directories(
cplr PUBLIC ${LIBTCC_INCLUDE_DIRS}
)
target_link_libraries(
cplr PUBLIC ${LIBTCC_LDFLAGS}
)
if(NOT CPLR_TINYCC_EXTERNAL)
add_dependencies(cplr tinycc)
endif()
endif()
# Required system libraries
target_link_libraries(
cplr PUBLIC -pthread -lm -ldl -lreadline
)
# Install the binary
install(
TARGETS cplr
RUNTIME DESTINATION bin
)