Mercurial > irccd
annotate cmake/IrccdSystem.cmake @ 95:1125d90b3b44
Misc: switch to .hpp, #477
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 20 Apr 2016 19:45:00 +0200 |
parents | c67e734c9241 |
children | 113d909fdfe1 |
rev | line source |
---|---|
0 | 1 # |
2 # Config.cmake -- CMake build system for irccd | |
3 # | |
4 # Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> | |
5 # | |
6 # Permission to use, copy, modify, and/or distribute this software for any | |
7 # purpose with or without fee is hereby granted, provided that the above | |
8 # copyright notice and this permission notice appear in all copies. | |
9 # | |
10 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 # | |
18 | |
19 include(CheckFunctionExists) | |
20 include(CheckIncludeFile) | |
21 include(CheckStructHasMember) | |
22 include(CheckSymbolExists) | |
23 include(CheckTypeSize) | |
24 | |
25 # --------------------------------------------------------- | |
26 # Global compile flags | |
27 # --------------------------------------------------------- | |
28 | |
29 # | |
30 # Recent versions of CMake has nice C++ feature detection for modern | |
31 # C++ but they are still a bit buggy so we use this | |
32 # instead. | |
33 # | |
34 if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") | |
35 # | |
36 # For GCC, we require at least GCC 5.1 | |
37 # | |
38 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "5.1") | |
39 message(FATAL_ERROR "You need at least GCC 5.1") | |
40 endif () | |
41 | |
42 set(CMAKE_CXX_FLAGS "-Wall -Wextra -std=c++14 ${CMAKE_CXX_FLAGS}") | |
43 elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") | |
44 # | |
45 # LLVM/clang implemented C++14 starting from version 3.4 but the | |
46 # switch -std=c++14 was not available. | |
47 # | |
48 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.4") | |
49 message(FATAL_ERROR "You need at least Clang 3.4") | |
50 endif () | |
51 | |
52 if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.5") | |
53 set(CMAKE_CXX_FLAGS "-Wall -Wextra -std=c++1y ${CMAKE_CXX_FLAGS}") | |
54 else () | |
55 set(CMAKE_CXX_FLAGS "-Wall -Wextra -std=c++14 ${CMAKE_CXX_FLAGS}") | |
56 endif () | |
57 else () | |
58 message(WARNING "Unsupported ${CMAKE_CXX_COMPILER_ID}, may not build correctly.") | |
59 endif () | |
60 | |
61 if (WIN32) | |
62 set(CMAKE_CXX_FLAGS "-D_WIN32_WINNT=0x0600 ${CMAKE_CXX_FLAGS}") | |
63 endif () | |
64 | |
65 if (CMAKE_SIZEOF_VOID_P MATCHES "8") | |
66 set(IRCCD_64BITS TRUE) | |
67 else () | |
68 set(IRCCD_64BITS FALSE) | |
69 endif () | |
70 | |
71 # --------------------------------------------------------- | |
72 # System identification | |
73 # --------------------------------------------------------- | |
74 | |
75 if (WIN32) | |
76 set(IRCCD_SYSTEM_WINDOWS TRUE) | |
77 elseif (APPLE) | |
78 set(IRCCD_SYSTEM_MAC TRUE) | |
79 elseif (CMAKE_SYSTEM_NAME MATCHES "FreeBSD") | |
80 set(IRCCD_SYSTEM_FREEBSD TRUE) | |
81 elseif (CMAKE_SYSTEM_NAME MATCHES "NetBSD") | |
82 set(IRCCD_SYSTEM_NETBSD TRUE) | |
83 elseif (CMAKE_SYSTEM_NAME MATCHES "OpenBSD") | |
84 set(IRCCD_SYSTEM_OPENBSD TRUE) | |
85 elseif (CMAKE_SYSTEM_NAME MATCHES "Linux") | |
86 set(IRCCD_SYSTEM_LINUX TRUE) | |
87 endif () | |
88 | |
89 # --------------------------------------------------------- | |
90 # Portability requirements | |
91 # --------------------------------------------------------- | |
92 | |
93 check_type_size(int8_t HAVE_INT8) | |
94 check_type_size(uint8_t HAVE_UINT8) | |
95 check_type_size(int16_t HAVE_INT16) | |
96 check_type_size(uint16_t HAVE_UINT16) | |
97 check_type_size(int32_t HAVE_INT32) | |
98 check_type_size(uint32_t HAVE_UINT32) | |
99 check_type_size(int64_t HAVE_INT64) | |
100 check_type_size(uint64_t HAVE_UINT64) | |
101 | |
102 if (NOT HAVE_STDINT_H) | |
103 message("irccd requires stdint.h or cstdint header") | |
104 endif () | |
105 | |
106 # | |
84
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
107 # Where any of these function / feature is required, include the <irccd/sysconfig.h> file. |
0 | 108 # |
84
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
109 # The following variables are defined in irccd/sysconfig.h |
0 | 110 # |
111 # HAVE_ACCESS - True if has access(2) function (and sys/types.h and sys/stat.h), | |
112 # HAVE_DAEMON - True if daemon(3), | |
113 # HAVE_GETPID - True if has getpid(2) function (and sys/types.h and unistd.h and grp.h), | |
114 # HAVE_POPEN - True if has popen(3) function (in stdio.h) | |
115 # HAVE_SETGID - True if has setgid(2) function and getgrnam(3) (and sys/types.h and unistd.h and pwd.h), | |
116 # HAVE_SETPROGNAME - True if setprogname(3) is available from C library, | |
117 # HAVE_SETUID - True if has setuid(2) function and getpwnam(3) (and sys/types.h and unistd.h and pwd.h), | |
118 # HAVE_STAT - True if has stat(2) function (and sys/types.h and sys/stat.h), | |
119 # HAVE_STAT_ST_DEV - The struct stat has st_dev field, | |
120 # HAVE_STAT_ST_INO - The struct stat has st_ino field, | |
121 # HAVE_STAT_ST_NLINK - The struct stat has st_nlink field, | |
122 # HAVE_STAT_ST_UID - The struct stat has st_uid field, | |
123 # HAVE_STAT_ST_GID - The struct stat has st_gid field, | |
124 # HAVE_STAT_ST_ATIME - The struct stat has st_atime field, | |
125 # HAVE_STAT_ST_MTIME - The struct stat has st_mtime field, | |
126 # HAVE_STAT_ST_CTIME - The struct stat has st_ctime field, | |
127 # HAVE_STAT_ST_SIZE - The struct stat has st_size field, | |
128 # HAVE_STAT_ST_BLKSIZE - The struct stat has st_blksize field, | |
129 # HAVE_STAT_ST_BLOCKS - The struct stat has st_blocks field, | |
130 # HAVE_SYSLOG - True if syslog functions are available (and syslog.h), | |
131 # | |
132 | |
133 # Check for unistd.h | |
134 check_include_file(unistd.h HAVE_UNISTD_H) | |
135 | |
136 # Check for sys/types.h | |
137 check_include_file(sys/types.h HAVE_SYS_TYPES_H) | |
138 | |
139 # Check for daemon(3) function, include: | |
140 # | |
141 # #include <cstdlib> | |
142 check_function_exists(daemon HAVE_DAEMON) | |
143 | |
144 # Check of setprogname(3) function, include: | |
145 # | |
146 # #include <cstdlib> | |
147 check_function_exists(setprogname HAVE_SETPROGNAME) | |
148 | |
149 # access() POSIX function | |
150 # | |
151 # If HAVE_ACCESS is defined, include: | |
152 # | |
153 # #include <unistd.h> | |
154 check_function_exists(access HAVE_ACCESS) | |
155 | |
156 if (NOT HAVE_UNISTD_H) | |
157 set(HAVE_ACCESS FALSE) | |
158 endif () | |
159 | |
160 # getpid() function | |
161 # | |
162 # If HAVE_GETPID is defined, include: | |
163 # | |
164 # #include <sys/types.h> | |
165 # #include <unistd.h> | |
166 check_function_exists(getpid HAVE_GETPID) | |
167 | |
168 if (NOT HAVE_UNISTD_H OR NOT HAVE_SYS_TYPES_H) | |
169 set(HAVE_GETPID FALSE) | |
170 endif () | |
171 | |
172 # setgid() function (and getgrnam) | |
173 # | |
174 # If HAVE_SETGID is defined, include: | |
175 # | |
176 # #include <sys/types.h> | |
177 # #include <unistd.h> | |
178 # #include <grp.h> // only for getgrnam | |
179 check_include_file(grp.h HAVE_GRP_H) | |
180 check_function_exists(getgrnam HAVE_GETGRNAM) | |
181 check_function_exists(setgid HAVE_SETGID) | |
182 | |
183 if (NOT HAVE_UNISTD_H OR NOT HAVE_SYS_TYPES_H OR NOT HAVE_GETGRNAM OR NOT HAVE_GRP_H) | |
184 set(HAVE_SETGID FALSE) | |
185 endif () | |
186 | |
187 # popen() function | |
188 # | |
189 # If HAVE_POPEN is defined, include; | |
190 # | |
191 # #include <cstdio> | |
192 check_function_exists(popen HAVE_POPEN) | |
193 | |
194 # setuid() function (and getpwnam) | |
195 # | |
196 # If HAVE_SETUID is defined, include: | |
197 # | |
198 # #include <sys/types.h> | |
199 # #include <unistd.h> | |
200 # #include <pwd.h> // only for getpwnam | |
201 check_include_file(pwd.h HAVE_PWD_H) | |
202 check_function_exists(getpwnam HAVE_GETPWNAM) | |
203 check_function_exists(setuid HAVE_SETUID) | |
204 | |
205 if (NOT HAVE_UNISTD_H OR NOT HAVE_SYS_TYPES_H OR NOT HAVE_GETPWNAM OR NOT HAVE_PWD_H) | |
206 set(HAVE_SETUID FALSE) | |
207 endif () | |
208 | |
209 # stat(2) function | |
210 # | |
211 # If HAVE_STAT is defined, include: | |
212 # | |
213 # #include <sys/types.h> | |
214 # #include <sys/stat.h> | |
215 check_include_file(sys/stat.h HAVE_SYS_STAT_H) | |
216 check_function_exists(stat HAVE_STAT) | |
217 | |
218 # If the sys/stat.h is not found, we disable stat(2) | |
219 if (NOT HAVE_SYS_STAT_H OR NOT HAVE_SYS_TYPES_H) | |
220 set(HAVE_STAT FALSE) | |
221 endif () | |
222 | |
223 # syslog functions | |
224 # | |
225 # If HAVE_SYSLOG is defined, include: | |
226 # | |
227 # #include <syslog.h> | |
228 check_include_file(syslog.h HAVE_SYSLOG_H) | |
229 check_function_exists(openlog HAVE_OPENLOG) | |
230 check_function_exists(syslog HAVE_SYSLOG) | |
231 check_function_exists(closelog HAVE_CLOSELOG) | |
232 | |
233 if (NOT HAVE_SYSLOG_H OR NOT HAVE_OPENLOG OR NOT HAVE_CLOSELOG) | |
234 set(HAVE_SYSLOG FALSE) | |
235 endif () | |
236 | |
237 # Check for struct stat fields. | |
238 check_struct_has_member("struct stat" st_atime sys/stat.h HAVE_STAT_ST_ATIME) | |
239 check_struct_has_member("struct stat" st_blksize sys/stat.h HAVE_STAT_ST_BLKSIZE) | |
240 check_struct_has_member("struct stat" st_blocks sys/stat.h HAVE_STAT_ST_BLOCKS) | |
241 check_struct_has_member("struct stat" st_ctime sys/stat.h HAVE_STAT_ST_CTIME) | |
242 check_struct_has_member("struct stat" st_dev sys/stat.h HAVE_STAT_ST_DEV) | |
243 check_struct_has_member("struct stat" st_gid sys/stat.h HAVE_STAT_ST_GID) | |
244 check_struct_has_member("struct stat" st_ino sys/stat.h HAVE_STAT_ST_INO) | |
245 check_struct_has_member("struct stat" st_mode sys/stat.h HAVE_STAT_ST_MODE) | |
246 check_struct_has_member("struct stat" st_mtime sys/stat.h HAVE_STAT_ST_MTIME) | |
247 check_struct_has_member("struct stat" st_nlink sys/stat.h HAVE_STAT_ST_NLINK) | |
248 check_struct_has_member("struct stat" st_rdev sys/stat.h HAVE_STAT_ST_RDEV) | |
249 check_struct_has_member("struct stat" st_size sys/stat.h HAVE_STAT_ST_SIZE) | |
250 check_struct_has_member("struct stat" st_uid sys/stat.h HAVE_STAT_ST_UID) | |
251 | |
84
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
252 # Configuration file. |
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
253 file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/irccd) |
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
254 |
0 | 255 configure_file( |
95
1125d90b3b44
Misc: switch to .hpp, #477
David Demelier <markand@malikania.fr>
parents:
84
diff
changeset
|
256 ${CMAKE_CURRENT_LIST_DIR}/internal/sysconfig.hpp.in |
1125d90b3b44
Misc: switch to .hpp, #477
David Demelier <markand@malikania.fr>
parents:
84
diff
changeset
|
257 ${CMAKE_BINARY_DIR}/irccd/sysconfig.hpp |
84
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
258 ) |
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
259 |
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
260 install( |
95
1125d90b3b44
Misc: switch to .hpp, #477
David Demelier <markand@malikania.fr>
parents:
84
diff
changeset
|
261 FILES ${CMAKE_BINARY_DIR}/irccd/sysconfig.hpp |
84
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
262 DESTINATION include/irccd |
0 | 263 ) |
84
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
264 |
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
265 # Also copy to fakedir if possible |
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
266 if (IRCCD_RELOCATABLE) |
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
267 file( |
95
1125d90b3b44
Misc: switch to .hpp, #477
David Demelier <markand@malikania.fr>
parents:
84
diff
changeset
|
268 COPY ${CMAKE_BINARY_DIR}/irccd/sysconfig.hpp |
84
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
269 DESTINATION ${IRCCD_FAKEDIR}/include/irccd |
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
270 ) |
c67e734c9241
CMake: rename irccd-config.h to irccd/sysconfig.h, #452
David Demelier <markand@malikania.fr>
parents:
0
diff
changeset
|
271 endif () |