]>
Commit | Line | Data |
---|---|---|
9f5d99f5 | 1 | # |
33bba784 | 2 | # Copyright (C) 2003-2023 Sébastien Helleu <flashcode@flashtux.org> |
6562d676 SH |
3 | # Copyright (C) 2007-2008 Julien Louis <ptitlouis@sysif.net> |
4 | # Copyright (C) 2008-2009 Emmanuel Bouthenot <kolter@openics.org> | |
5 | # | |
6 | # This file is part of WeeChat, the extensible chat client. | |
7 | # | |
8 | # WeeChat is free software; you can redistribute it and/or modify | |
9f5d99f5 | 9 | # it under the terms of the GNU General Public License as published by |
f1a39ce7 | 10 | # the Free Software Foundation; either version 3 of the License, or |
9f5d99f5 SH |
11 | # (at your option) any later version. |
12 | # | |
6562d676 | 13 | # WeeChat is distributed in the hope that it will be useful, |
9f5d99f5 SH |
14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | # GNU General Public License for more details. | |
17 | # | |
18 | # You should have received a copy of the GNU General Public License | |
4712d0bb | 19 | # along with WeeChat. If not, see <https://www.gnu.org/licenses/>. |
9f5d99f5 SH |
20 | # |
21 | ||
9b4fa109 | 22 | cmake_minimum_required(VERSION 3.0) |
1f787ddc | 23 | |
7618fdd2 SH |
24 | project(weechat C) |
25 | ||
33450ddb | 26 | # CMake options |
7618fdd2 SH |
27 | set(CMAKE_VERBOSE_MAKEFILE OFF) |
28 | set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH}) | |
29 | set(CMAKE_SKIP_RPATH ON) | |
27a480c7 SH |
30 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsigned-char -fms-extensions -Wall -Wextra -Werror-implicit-function-declaration") |
31 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsigned-char -fms-extensions -Wall -Wextra") | |
7618fdd2 | 32 | |
33450ddb | 33 | # version |
cfc1f397 SH |
34 | execute_process(COMMAND ${CMAKE_SOURCE_DIR}/version.sh devel-major OUTPUT_VARIABLE VERSION_MAJOR) |
35 | execute_process(COMMAND ${CMAKE_SOURCE_DIR}/version.sh devel-minor OUTPUT_VARIABLE VERSION_MINOR) | |
36 | execute_process(COMMAND ${CMAKE_SOURCE_DIR}/version.sh devel-patch OUTPUT_VARIABLE VERSION_PATCH) | |
37 | string(REGEX REPLACE "\n" "" VERSION_MAJOR "${VERSION_MAJOR}") | |
38 | string(REGEX REPLACE "\n" "" VERSION_MINOR "${VERSION_MINOR}") | |
39 | string(REGEX REPLACE "\n" "" VERSION_PATCH "${VERSION_PATCH}") | |
33450ddb SH |
40 | if(VERSION_PATCH STREQUAL "") |
41 | set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}) | |
42 | else() | |
43 | set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) | |
44 | endif() | |
45 | ||
46 | # license | |
7618fdd2 | 47 | set(LICENSE "GPL3") |
33450ddb | 48 | |
26f415f5 SH |
49 | # add definitions for version and license |
50 | if(COMMAND cmake_policy) | |
51 | cmake_policy(SET CMP0005 NEW) | |
52 | add_definitions(-DWEECHAT_VERSION="${VERSION}" -DWEECHAT_LICENSE="${LICENSE}") | |
53 | else() | |
54 | add_definitions(-DWEECHAT_VERSION='"${VERSION}"' -DWEECHAT_LICENSE='"${LICENSE}"') | |
55 | endif() | |
56 | ||
33450ddb | 57 | # package string |
7618fdd2 SH |
58 | set(PKG_STRING "${PROJECT_NAME} ${VERSION}") |
59 | string(REPLACE "\";\"" "\ " PKG_STRING ${PKG_STRING}) | |
60 | ||
8df3ad3d RF |
61 | if(NOT DEFINED LIBDIR) |
62 | set(LIBDIR ${CMAKE_INSTALL_PREFIX}/lib) | |
63 | endif() | |
64 | ||
65 | if(NOT DEFINED WEECHAT_LIBDIR) | |
66 | set(WEECHAT_LIBDIR ${LIBDIR}/${PROJECT_NAME}) | |
7618fdd2 SH |
67 | endif() |
68 | ||
68346462 ES |
69 | if(NOT DEFINED DATAROOTDIR) |
70 | set(DATAROOTDIR ${CMAKE_INSTALL_PREFIX}/share) | |
7618fdd2 SH |
71 | endif() |
72 | ||
973a4b2e | 73 | if(NOT DEFINED WEECHAT_SHAREDIR) |
b907f6b6 | 74 | set(WEECHAT_SHAREDIR ${DATAROOTDIR}/weechat) |
973a4b2e ES |
75 | endif() |
76 | ||
7618fdd2 | 77 | if(NOT DEFINED MANDIR) |
68346462 | 78 | set(MANDIR ${DATAROOTDIR}/man) |
7618fdd2 SH |
79 | endif() |
80 | ||
81 | if(NOT DEFINED LOCALEDIR) | |
68346462 | 82 | set(LOCALEDIR ${DATAROOTDIR}/locale) |
7618fdd2 SH |
83 | endif() |
84 | ||
85 | if(DEFINED INCLUDEDIR) | |
86 | set(INCLUDEDIR ${INCLUDEDIR}/${PROJECT_NAME}) | |
87 | else() | |
88 | set(INCLUDEDIR ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}) | |
89 | endif() | |
90 | ||
2612adf8 SH |
91 | option(ENABLE_NCURSES "Compile the Ncurses interface" ON) |
92 | option(ENABLE_HEADLESS "Compile the headless binary (required for tests)" ON) | |
93 | option(ENABLE_NLS "Enable Native Language Support" ON) | |
2612adf8 SH |
94 | option(ENABLE_LARGEFILE "Enable Large File Support" ON) |
95 | option(ENABLE_ALIAS "Enable Alias plugin" ON) | |
96 | option(ENABLE_BUFLIST "Enable Buflist plugin" ON) | |
97 | option(ENABLE_CHARSET "Enable Charset plugin" ON) | |
98 | option(ENABLE_EXEC "Enable Exec plugin" ON) | |
99 | option(ENABLE_FIFO "Enable FIFO plugin" ON) | |
100 | option(ENABLE_FSET "Enable Fast Set plugin" ON) | |
101 | option(ENABLE_IRC "Enable IRC plugin" ON) | |
102 | option(ENABLE_LOGGER "Enable Logger plugin" ON) | |
103 | option(ENABLE_RELAY "Enable Relay plugin" ON) | |
104 | option(ENABLE_SCRIPT "Enable Script plugin (script manager)" ON) | |
105 | option(ENABLE_SCRIPTS "Enable script plugins (perl, python, ...)" ON) | |
106 | option(ENABLE_PERL "Enable Perl scripting language" ON) | |
107 | option(ENABLE_PYTHON "Enable Python scripting language" ON) | |
2612adf8 SH |
108 | option(ENABLE_RUBY "Enable Ruby scripting language" ON) |
109 | option(ENABLE_LUA "Enable Lua scripting language" ON) | |
110 | option(ENABLE_TCL "Enable Tcl scripting language" ON) | |
111 | option(ENABLE_GUILE "Enable Scheme (guile) scripting language" ON) | |
340d6646 | 112 | option(ENABLE_JAVASCRIPT "Enable JavaScript scripting language" OFF) |
2612adf8 SH |
113 | option(ENABLE_PHP "Enable PHP scripting language" ON) |
114 | option(ENABLE_SPELL "Enable Spell checker plugin" ON) | |
115 | option(ENABLE_ENCHANT "Enable Enchant lib for Spell checker plugin" OFF) | |
116 | option(ENABLE_TRIGGER "Enable Trigger plugin" ON) | |
bd21b25b | 117 | option(ENABLE_TYPING "Enable Typing plugin" ON) |
2612adf8 SH |
118 | option(ENABLE_XFER "Enable Xfer plugin" ON) |
119 | option(ENABLE_MAN "Enable build of man page" OFF) | |
120 | option(ENABLE_DOC "Enable build of documentation" OFF) | |
121 | option(ENABLE_TESTS "Enable tests" OFF) | |
122 | option(ENABLE_CODE_COVERAGE "Enable code coverage" OFF) | |
123 | ||
124 | # code coverage | |
125 | add_library(coverage_config INTERFACE) | |
126 | if(ENABLE_CODE_COVERAGE) | |
127 | target_compile_options(coverage_config INTERFACE -O0 -g --coverage) | |
128 | target_link_libraries(coverage_config INTERFACE --coverage) | |
129 | endif() | |
9f5d99f5 | 130 | |
805717e9 SH |
131 | # headless mode is required for tests |
132 | if(ENABLE_TESTS AND NOT ENABLE_HEADLESS) | |
133 | message(FATAL_ERROR "Headless mode is required for tests.") | |
134 | endif() | |
135 | ||
87e342dd | 136 | # option WEECHAT_HOME |
7618fdd2 | 137 | set(WEECHAT_HOME "${WEECHAT_HOME}" CACHE |
53617226 | 138 | STRING "Force a single WeeChat home directory for config, logs, scripts, etc." |
34e0226e | 139 | FORCE) |
7618fdd2 | 140 | mark_as_advanced(CLEAR WEECHAT_HOME) |
34e0226e | 141 | |
91ce4017 SH |
142 | if(COMMAND cmake_policy) |
143 | if(POLICY CMP0003) | |
144 | cmake_policy(SET CMP0003 NEW) | |
145 | endif() | |
146 | if(POLICY CMP0017) | |
147 | cmake_policy(SET CMP0017 NEW) | |
148 | endif() | |
149 | endif() | |
150 | ||
151 | add_definitions(-DHAVE_CONFIG_H) | |
152 | ||
57c0a825 SH |
153 | include(FindPkgConfig) |
154 | ||
91ce4017 SH |
155 | include(CheckIncludeFiles) |
156 | include(CheckFunctionExists) | |
157 | include(CheckSymbolExists) | |
158 | ||
159 | check_include_files("langinfo.h" HAVE_LANGINFO_CODESET) | |
160 | check_include_files("sys/resource.h" HAVE_SYS_RESOURCE_H) | |
161 | ||
162 | check_function_exists(mallinfo HAVE_MALLINFO) | |
b222e750 | 163 | check_function_exists(mallinfo2 HAVE_MALLINFO2) |
91ce4017 SH |
164 | |
165 | check_symbol_exists("eat_newline_glitch" "term.h" HAVE_EAT_NEWLINE_GLITCH) | |
166 | ||
167 | # Check for Large File Support | |
168 | if(ENABLE_LARGEFILE) | |
169 | add_definitions(-D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -D_LARGE_FILES) | |
170 | endif() | |
171 | ||
172 | # Check for Gettext | |
173 | if(ENABLE_NLS) | |
174 | find_package(Gettext) | |
175 | if(GETTEXT_FOUND) | |
176 | add_definitions(-DENABLE_NLS) | |
0678e0c9 KS |
177 | find_package(Intl) |
178 | if(Intl_FOUND) | |
179 | list(APPEND EXTRA_LIBS "${Intl_LIBRARIES}") | |
180 | endif() | |
bff40e4c SH |
181 | else() |
182 | message(SEND_ERROR "Gettext not found") | |
91ce4017 SH |
183 | endif() |
184 | endif() | |
185 | ||
186 | # Check for libgcrypt | |
187 | find_package(GCRYPT REQUIRED) | |
188 | add_definitions(-DHAVE_GCRYPT) | |
189 | list(APPEND EXTRA_LIBS ${GCRYPT_LDFLAGS}) | |
190 | ||
191 | # Check for GnuTLS | |
e130ee73 SH |
192 | find_package(GnuTLS REQUIRED) |
193 | string(REGEX REPLACE "/[^/]*$" "" GNUTLS_LIBRARY_PATH "${GNUTLS_LIBRARY}") | |
194 | include_directories(${GNUTLS_INCLUDE_PATH}) | |
195 | set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -L${GNUTLS_LIBRARY_PATH}") | |
196 | list(APPEND EXTRA_LIBS gnutls) | |
91ce4017 SH |
197 | |
198 | # Check for zlib | |
199 | find_package(ZLIB REQUIRED) | |
498194f6 SH |
200 | |
201 | # Check for zstd | |
498194f6 | 202 | pkg_check_modules(LIBZSTD REQUIRED libzstd) |
91ce4017 SH |
203 | |
204 | # Check for iconv | |
205 | find_package(Iconv) | |
206 | if(ICONV_FOUND) | |
d0b95b68 | 207 | add_definitions(-DHAVE_ICONV) |
91ce4017 SH |
208 | endif() |
209 | ||
210 | # Check for CURL | |
211 | find_package(CURL REQUIRED) | |
212 | ||
213 | # weechat_gui_common MUST be the first lib in the list | |
214 | set(STATIC_LIBS weechat_gui_common) | |
215 | ||
216 | find_library(DL_LIBRARY | |
217 | NAMES dl | |
218 | PATHS /lib /usr/lib /usr/libexec /usr/local/lib /usr/local/libexec | |
219 | ) | |
220 | list(APPEND STATIC_LIBS weechat_plugins) | |
221 | if(DL_LIBRARY) | |
222 | string(REGEX REPLACE "/[^/]*$" "" DL_LIBRARY_PATH "${DL_LIBRARY}") | |
223 | set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} -L${DL_LIBRARY_PATH}") | |
224 | list(APPEND EXTRA_LIBS dl) | |
225 | endif() | |
226 | ||
7aa24ecd SH |
227 | add_subdirectory(icons) |
228 | ||
7618fdd2 | 229 | if(ENABLE_NLS) |
d0b95b68 | 230 | add_subdirectory(po) |
7618fdd2 | 231 | endif() |
2487d8a5 | 232 | |
d0b95b68 SH |
233 | add_subdirectory(src) |
234 | add_subdirectory(doc) | |
9f5d99f5 | 235 | |
bff40e4c SH |
236 | if(ENABLE_TESTS) |
237 | find_package(CppUTest) | |
238 | if(CPPUTEST_FOUND) | |
239 | enable_testing() | |
240 | add_subdirectory(tests) | |
241 | else() | |
242 | message(SEND_ERROR "CppUTest not found") | |
243 | endif() | |
bff143dc SH |
244 | else() |
245 | enable_testing() | |
246 | add_test(NAME notests COMMAND true) | |
db9a8e7b SH |
247 | endif() |
248 | ||
7618fdd2 | 249 | configure_file(config.h.cmake config.h @ONLY) |
07d9deaf | 250 | |
2b78673a | 251 | # set the git version in "config-git.h" |
7618fdd2 | 252 | add_custom_target(version_git ALL |
30ad9ca6 | 253 | COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/set_git_version.sh" "${CMAKE_CURRENT_SOURCE_DIR}" "${VERSION}" "config-git.h" |
baf8f635 SH |
254 | WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" |
255 | ) | |
2b78673a | 256 | |
7618fdd2 | 257 | configure_file( |
07d9deaf JL |
258 | "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in" |
259 | "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" | |
baf8f635 SH |
260 | IMMEDIATE @ONLY |
261 | ) | |
07d9deaf | 262 | |
7618fdd2 | 263 | add_custom_target(uninstall |
baf8f635 SH |
264 | "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" |
265 | ) | |
07d9deaf | 266 | |
7618fdd2 | 267 | add_custom_target(dist |
5cc40052 | 268 | "${CMAKE_CURRENT_SOURCE_DIR}/tools/makedist.sh" "${VERSION}" "HEAD" "${CMAKE_CURRENT_BINARY_DIR}" |
baf8f635 SH |
269 | WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} |
270 | ) | |
07d9deaf | 271 | |
55aa9dd0 | 272 | # pkgconfig file |
7618fdd2 SH |
273 | set(PACKAGE "${PROJECT_NAME}") |
274 | set(prefix "${CMAKE_INSTALL_PREFIX}") | |
275 | set(exec_prefix "\${prefix}") | |
2712f099 | 276 | string(REPLACE "${CMAKE_INSTALL_PREFIX}" "\${prefix}" libdir "${LIBDIR}") |
7618fdd2 SH |
277 | set(includedir "\${prefix}/include") |
278 | configure_file(${CMAKE_CURRENT_SOURCE_DIR}/weechat.pc.in ${CMAKE_CURRENT_BINARY_DIR}/weechat.pc @ONLY) | |
8df3ad3d | 279 | install(FILES ${CMAKE_CURRENT_BINARY_DIR}/weechat.pc DESTINATION ${LIBDIR}/pkgconfig) |
55aa9dd0 | 280 | |
1466a565 | 281 | # cygport file (used to build Cygwin packages) |
7618fdd2 | 282 | configure_file(${CMAKE_CURRENT_SOURCE_DIR}/weechat.cygport.in ${CMAKE_CURRENT_BINARY_DIR}/weechat-${VERSION}-1.cygport @ONLY) |
1466a565 | 283 | |
8c3b85a0 SH |
284 | # install some files (only on Cygwin) |
285 | if(CYGWIN) | |
286 | install(FILES | |
b7bdbbdc SH |
287 | ${CMAKE_CURRENT_SOURCE_DIR}/AUTHORS.adoc |
288 | ${CMAKE_CURRENT_SOURCE_DIR}/ChangeLog.adoc | |
289 | ${CMAKE_CURRENT_SOURCE_DIR}/Contributing.adoc | |
290 | ${CMAKE_CURRENT_SOURCE_DIR}/README.adoc | |
291 | ${CMAKE_CURRENT_SOURCE_DIR}/ReleaseNotes.adoc | |
68346462 | 292 | DESTINATION ${DATAROOTDIR}/doc/${PROJECT_NAME} |
baf8f635 | 293 | ) |
8c3b85a0 SH |
294 | endif() |
295 | ||
8054cb0e | 296 | # desktop file |
68346462 | 297 | install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/weechat.desktop DESTINATION ${DATAROOTDIR}/applications) |
8054cb0e | 298 | |
1f67c879 | 299 | # packages |
7618fdd2 SH |
300 | set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Fast, light and extensible chat client") |
301 | set(CPACK_PACKAGE_VENDOR "Sébastien Helleu") | |
b7bdbbdc | 302 | set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.adoc") |
7618fdd2 SH |
303 | set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") |
304 | set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR}) | |
305 | set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR}) | |
306 | set(CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH}) | |
1f67c879 SH |
307 | |
308 | # binary package | |
7618fdd2 SH |
309 | set(CPACK_GENERATOR "STGZ;TGZ;TBZ2") |
310 | set(CPACK_PACKAGE_FILE_NAME weechat-binary-${VERSION}) | |
1f67c879 SH |
311 | |
312 | # source package | |
7618fdd2 SH |
313 | set(CPACK_SOURCE_GENERATOR "TGZ;TBZ2") |
314 | set(CPACK_SOURCE_PACKAGE_FILE_NAME weechat-${VERSION}) | |
baf8f635 SH |
315 | set(CPACK_SOURCE_IGNORE_FILES |
316 | "/\\\\.git" "/build/" "/m4/" | |
1f67c879 SH |
317 | "/autom4te\\\\.cache/" "/ABOUT-NLS$" "/config\\\\.guess$" "/config\\\\.h$" |
318 | "/config\\\\.h.in$" "/config\\\\.log$" "/config\\\\.rpath$" | |
319 | "/config\\\\.status$" "/config\\\\.sub$" "/configure$" "/depcomp$" | |
320 | "/install-sh$" "/missing$" "/intl/" "/libtool$" "/\\\\.libs/" | |
cf500946 SH |
321 | "/ltmain\\\\.sh$" "/\\\\.deps/" "/html/" "/html1/" "/Makefile$" |
322 | "/Makefile\\\\.in$" "stamp" "/po/.*\\\\.header$" "\\\\.gmo$" "~$" "\\\\.o$" | |
996da2f6 | 323 | "\\\\.lo$" "\\\\.a$" "\\\\.la$" "\\\\.lai$" "\\\\.Plo$" "/weechat$" |
1f67c879 SH |
324 | ) |
325 | ||
7618fdd2 | 326 | include(CPack) |