-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCMakeLists.txt
261 lines (226 loc) · 9.65 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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
# Copyright © 2004-2013 Roger Leigh <[email protected]>
#
# schroot is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version.
#
# schroot is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
cmake_minimum_required(VERSION 3.16.0)
cmake_policy(VERSION 3.16.0)
cmake_policy(SET CMP0067 NEW)
# Require C++17 support
set(CMAKE_CXX_STANDARD 17)
project(schroot
VERSION "1.7.3"
DESCRIPTION "Lightweight virtualisation tool"
HOMEPAGE_URL "https://gitlab.com/codelibre/schroot"
LANGUAGES CXX )
if("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}")
message(FATAL_ERROR "In-tree builds are not supported; please run cmake from a separate build directory.")
endif("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}")
set(RELEASE_DATE 1609012261)
set(RELEASE_DATE_S "unreleased")
set(RELEASE_DATE_SHORT "unreleased")
message(STATUS "Configuring ${PROJECT_NAME} ${PROJECT_VERSION} (${RELEASE_DATE_SHORT})")
include(GNUInstallDirs)
include(CheckIncludeFileCXX)
include(CheckCXXCompilerFlag)
include(CheckCXXSourceCompiles)
include("cmake/CompilerChecks.cmake")
find_package(Threads REQUIRED)
find_package(GTest)
# HEADER CHECKS
include(CheckIncludeFileCXX)
# LIBRARY CHECKS
include (CheckLibraryExists)
include (CheckFunctionExists)
include (CheckSymbolExists)
include("cmake/BoostChecks.cmake")
include("cmake/RegexChecks.cmake")
# Configure debugging
option(debug "Enable debugging messages" OFF)
set(SCHROOT_DEBUG 0)
if(debug)
set(SCHROOT_DEBUG 1)
endif(debug)
# Configure debugging
set(BUILD_TESTS OFF)
if(GTEST_FOUND)
set(BUILD_TESTS ON)
endif(GTEST_FOUND)
option(test "Enable unit tests" ${BUILD_TESTS})
set(BUILD_TESTS ${test})
# Environment filter default
set(default_environment_filter "^(BASH_ENV|CDPATH|ENV|HOSTALIASES|IFS|KRB5_CONFIG|KRBCONFDIR|KRBTKFILE|KRB_CONF|LD_.*|LOCALDOMAIN|NLSPATH|PATH_LOCALE|RES_OPTIONS|TERMINFO|TERMINFO_DIRS|TERMPATH)\$"
CACHE STRING "Default environment filter")
set(SCHROOT_DEFAULT_ENVIRONMENT_FILTER ${default_environment_filter})
# Distributor
set(distributor "Unknown"
CACHE STRING "Distributor of this build")
set(DISTRIBUTOR "${distributor}")
if(distributor STREQUAL Unknown)
set(DISTRIBUTOR_UNSET ON)
endif(distributor STREQUAL Unknown)
# bash completion directory
set(bash_completion_dir "${CMAKE_INSTALL_SYSCONFDIR}/bash_completion.d"
CACHE PATH "bash shell completion directory")
#==> bashcompletiondir (use cache val directly)
# schroot directories
set(SCHROOT_LOCALE_DIR "${CMAKE_INSTALL_FULL_LOCALEDIR}"
CACHE PATH "Locale directory")
set(SCHROOT_MOUNT_DIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/${PROJECT_NAME}/mount"
CACHE PATH "Directory under which mount chroots")
set(SCHROOT_SESSION_DIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/${PROJECT_NAME}/session"
CACHE PATH "Directory for storing session metadata")
set(SCHROOT_FILE_UNPACK_DIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/${PROJECT_NAME}/unpack"
CACHE PATH "Directory for unpacking chroot file archives under")
set(SCHROOT_OVERLAY_DIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/${PROJECT_NAME}/union/overlay"
CACHE PATH "Directory for union filesystem writable overlays")
set(SCHROOT_UNDERLAY_DIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}/lib/${PROJECT_NAME}/union/underlay"
CACHE PATH "Directory for union filesystem read-only underlays")
set(SCHROOT_MODULE_DIR "${CMAKE_INSTALL_FULL_LIBDIR}/${PROJECT_NAME}/${PROJECT_VERSION}/modules"
CACHE PATH "Directory for loadable modules")
set(SCHROOT_DATA_DIR "${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME}"
CACHE PATH "Directory for schroot data files")
set(SCHROOT_LIBEXEC_DIR "${CMAKE_INSTALL_FULL_LIBEXECDIR}/${PROJECT_NAME}"
CACHE PATH "Directory for schroot helper programs")
set(SCHROOT_SYSCONF_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}/${PROJECT_NAME}"
CACHE PATH "Directory for configuration files")
set(SCHROOT_CONF_CHROOT_D "${SCHROOT_SYSCONF_DIR}/chroot.d"
CACHE PATH "Directory for chroot configuration fragments")
set(SCHROOT_CONF_SETUP_D "${SCHROOT_SYSCONF_DIR}/setup.d"
CACHE PATH "Directory for chroot setup scripts")
set(SCHROOT_SETUP_DATA_DIR "${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME}/setup"
CACHE PATH "Directory for common setup script data")
mark_as_advanced(SCHROOT_LOCALE_DIR SCHROOT_MOUNT_DIR
SCHROOT_SESSION_DIR SCHROOT_FILE_UNPACK_DIR
SCHROOT_OVERLAY_DIR SCHROOT_UNDERLAY_DIR
SCHROOT_MODULE_DIR SCHROOT_DATA_DIR
SCHROOT_LIBEXEC_DIR SCHROOT_SYSCONF_DIR
SCHROOT_CONF_CHROOT_D SCHROOT_CONF_SETUP_D
SCHROOT_SETUP_DATA_DIR)
set(TESTDATADIR "${PROJECT_BINARY_DIR}/test/testdata")
# schroot files
set(SCHROOT_CONF "${SCHROOT_SYSCONF_DIR}/schroot.conf")
# Platform
string(TOLOWER ${CMAKE_SYSTEM_NAME} SCHROOT_PLATFORM)
# Global environ
check_symbol_exists(environ unistd.h HAVE_UNISTD_ENVIRON)
# Localisation with gettext
include(FindGettext)
find_package(Gettext)
find_package(Intl)
set(NLS_DEFAULT OFF)
if(GETTEXT_FOUND)
set(NLS_DEFAULT ON)
endif(GETTEXT_FOUND)
option(nls "Enable national language support (requires gettext)" ${NLS_DEFAULT})
set(BUILD_NLS ${nls})
set(SCHROOT_FEATURE_NLS ${pam})
# PAM authentication feature
check_include_file_cxx (security/pam_appl.h PAM_HEADER)
check_library_exists(pam pam_authenticate "" PAM_FUNC)
check_include_file_cxx (security/openpam.h OPENPAM_HEADER)
check_library_exists(pam openpam_ttyconv "" OPENPAM_FUNC)
check_include_file_cxx (security/pam_misc.h LINUXPAM_MISC_HEADER)
check_library_exists(pam misc_conv "" LINUXPAM_MISC_FUNC)
set(PAM_DEFAULT OFF)
set(PAM_TYPE None)
if(PAM_HEADER AND PAM_FUNC)
set(PAM_DEFAULT ON)
if(CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU)$")
set(PAM_TYPE Linux-PAM)
else()
set(PAM_TYPE OpenPAM)
endif()
endif(PAM_HEADER AND PAM_FUNC)
option(pam "Enable support for PAM authentication (requires libpam)" ${PAM_DEFAULT})
set(BUILD_PAM ${pam})
set(SCHROOT_FEATURE_PAM ${pam})
set(pam-type "${PAM_TYPE}"
CACHE STRING "PAM implementation type (OpenPAM or Linux-PAM)")
if(BUILD_PAM)
set(PAM_LIBRARY pam)
endif(BUILD_PAM)
# Filesystem union mount feature
set(UNION_DEFAULT ON)
option(union "Enable support for union mounts" ${UNION_DEFAULT})
set(BUILD_UNION ${union})
set(SCHROOT_FEATURE_UNION ${union})
# Doxygen documentation
include(FindDoxygen)
find_package(Doxygen)
set(DOXYGEN_DEFAULT OFF)
if (DOXYGEN_EXECUTABLE)
set (DOXYGEN_DEFAULT ON)
endif (DOXYGEN_EXECUTABLE)
option(doxygen "Enable doxygen documentation" ${DOXYGEN_DEFAULT})
set(BUILD_DOXYGEN ${doxygen})
# Linux and BSD fstab and mount parsing and querying
check_include_file_cxx(fstab.h FSTAB_HEADER)
check_function_exists(setfstab FSTAB_FUNC)
if (FSTAB_HEADER AND FSTAB_FUNC)
set(HAVE_FSTAB_FUNCTIONS TRUE)
else (FSTAB_HEADER AND FSTAB_FUNC)
check_include_file_cxx(mntent.h MNTENT_HEADER)
check_function_exists(setmntent MNTENT_FUNC)
if (MNTENT_HEADER AND MNTENT_FUNC)
set(HAVE_MNTENT_FUNCTIONS TRUE)
else (MNTENT_HEADER AND MNTENT_FUNC)
message(FATAL_ERROR "No fstab parser available for this platform.")
endif (MNTENT_HEADER AND MNTENT_FUNC)
endif (FSTAB_HEADER AND FSTAB_FUNC)
check_function_exists(getmntinfo HAVE_GETMNTINFO_FUNC)
# Namespace unshare feature
# sched.h ==> UNSHARE_HEADER
check_include_file_cxx (sched.h UNSHARE_HEADER)
check_function_exists(unshare UNSHARE_FUNC)
set(UNSHARE_DEFAULT OFF)
if (UNSHARE_HEADER AND UNSHARE_FUNC)
set (UNSHARE_DEFAULT ON)
endif (UNSHARE_HEADER AND UNSHARE_FUNC)
option(unshare "Enable unshare support (Linux only)" ${UNSHARE_DEFAULT})
set(BUILD_UNSHARE ${unshare})
set(SCHROOT_FEATURE_UNSHARE ${unshare})
# Kernel personality feature
# sys/personality.h ==> PERSONALITY_HEADER
check_include_file_cxx (sys/personality.h PERSONALITY_HEADER)
check_function_exists(personality PERSONALITY_FUNC)
set(PERSONALITY_DEFAULT OFF)
if (PERSONALITY_HEADER AND PERSONALITY_FUNC)
set (PERSONALITY_DEFAULT ON)
endif (PERSONALITY_HEADER AND PERSONALITY_FUNC)
option(personality "Enable personality support (Linux only)" ${PERSONALITY_DEFAULT})
set(BUILD_PERSONALITY ${personality})
set(SCHROOT_FEATURE_PERSONALITY ${personality})
# GENERATED FILES:
configure_file(${PROJECT_SOURCE_DIR}/config.h.cmake ${PROJECT_BINARY_DIR}/config.h)
include_directories(${Boost_INCLUDE_DIRS}
${Intl_INCLUDE_DIRS}
${PROJECT_BINARY_DIR}/lib
${PROJECT_SOURCE_DIR}/lib
${PROJECT_BINARY_DIR}
${PROJECT_SOURCE_DIR})
enable_testing()
add_subdirectory(lib/schroot)
add_subdirectory(lib/bin-common)
add_subdirectory(lib/test)
add_subdirectory(bin/schroot)
add_subdirectory(libexec/listmounts)
add_subdirectory(libexec/mount)
add_subdirectory(test)
add_subdirectory(doc)
add_subdirectory(etc)
add_subdirectory(po)
add_subdirectory(man)
add_custom_target(check-news
COMMAND if grep -q "Welcome to ${PROJECT_NAME} ${PROJECT_VERSION}" "${PROJECT_SOURCE_DIR}/NEWS" \; then echo "NEWS current version ${PROJECT_VERSION}" \; else echo "NEWS current version does not match release version ${PROJECT_VERSION}" \; exit 1 \; fi
COMMAND if grep -q "Major changes in ${PROJECT_VERSION}:" "${PROJECT_SOURCE_DIR}/NEWS" \; then echo "NEWS contains changes for version ${PROJECT_VERSION}" \; else echo "NEWS version does not contain changes for version ${PROJECT_VERSION}" \; exit 1 \; fi
)