]> granicus.if.org Git - fortune-mod/blob - fortune-mod/CMakeLists.txt
prepare for a release
[fortune-mod] / fortune-mod / CMakeLists.txt
1 cmake_minimum_required(VERSION 3.2)
2
3 project(fortune-mod)
4
5 INCLUDE ("${CMAKE_SOURCE_DIR}/cmake/shlomif_common_bootstrap.cmake")
6 SHLOMIF_COMMON_SETUP("${private_mod_path}")
7
8 CMAKE_POLICY(SET CMP0054 NEW)
9
10 # see: https://cmake.org/cmake/help/latest/variable/CMAKE_CROSSCOMPILING.html
11 SET (IS_CROSS "${CMAKE_CROSSCOMPILING}")
12
13 INCLUDE(FindPkgConfig)
14
15 SET (PKGDATADIR_SUBDIR "fortune-mod")
16 SET (RELATIVE_PKGDATADIR "${RELATIVE_DATADIR}/${PKGDATADIR_SUBDIR}")
17 SET (PKGDATADIR "${DATADIR}/${PKGDATADIR_SUBDIR}")
18
19 # Introduces VERSION , CPACK_PACKAGE_VERSION_MAJOR,
20 # CPACK_PACKAGE_VERSION_MAJOR, and CPACK_PACKAGE_VERSION_PATCH
21 READ_VERSION_FROM_VER_TXT()
22
23 # This is the equivalent to perform a "make dist"/"make distdir" etc.
24 SET(CPACK_PACKAGE_NAME "fortune-mod")
25 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "fortune-mod")
26 SET(CPACK_PACKAGE_VENDOR "Shlomi Fish")
27 SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README")
28 SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING.txt")
29
30
31 SET(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_DESCRIPTION_SUMMARY} ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
32
33 SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
34 SET(CPACK_SOURCE_GENERATOR "TXZ")
35
36 SET (base_with_ver "fortune-mod-[0-9]+\\\\.[0-9]+\\\\.[0-9]+")
37
38 SET(CPACK_SOURCE_IGNORE_FILES
39     "/\\\\.deps/"
40     "/\\\\.git/"
41     "/\\\\.tidyall\\\\.d/"
42     "/t/valgrind[0-9]+\\\\.t$"
43     "/tags$"
44     "\\\\.pyc$"
45     "~$"
46     # "/(build|BUILD|B)/"
47 )
48
49 IF(WIN32 AND NOT UNIX)
50     # There is a bug in NSI that does not handle full unix paths properly. Make
51     # sure there is at least one set of four (4) backlasshes.
52     SET(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}\\\\dondorf-king.bmp")
53     SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\fortune.exe")
54     SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\github.com\\\\shlomif\\\\fortune-mod")
55     SET(CPACK_NSIS_URL_INFO_ABOUT  "http:\\\\\\\\github.com\\\\shlomif\\\\fortune-mod")
56     SET(CPACK_NSIS_DISPLAY_NAME "fortune-mod")
57     SET(CPACK_NSIS_CONTACT "shlomif@shlomifish.org")
58     SET(CPACK_NSIS_MODIFY_PATH ON)
59     # Setting for NSIS :
60     SET(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\fc-solve.ico")
61     SET(CPACK_NSIS_MUI_UNIICON ${CPACK_NSIS_MUI_ICON})
62     SET(CPACK_PACKAGE_ICON ${CPACK_NSIS_MUI_ICON})
63     SET(CPACK_NSIS_MODIFY_PATH "ON")
64 ELSE()
65   SET(CPACK_STRIP_FILES "fortune")
66   SET(CPACK_SOURCE_STRIP_FILES "")
67 ENDIF()
68
69 SET(CPACK_PACKAGE_EXECUTABLES
70     "fortune" "The fortune-mod program"
71 )
72
73 ### This is to set the RPATH correctly, so when installed under a prefix
74 ### the executables will find the libraries.
75 ###
76 ### See:
77 ###
78 ### http://www.cmake.org/Wiki/CMake_RPATH_handling
79 ###
80 ### (Taken from that wiki page)
81
82 # use, i.e. don't skip the full RPATH for the build tree
83 SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
84
85 # when building, don't use the install RPATH already
86 # (but later on when installing)
87 SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
88
89 # the RPATH to be used when installing
90 SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}")
91
92 # add the automatically determined parts of the RPATH
93 # which point to directories outside the build tree to the install RPATH
94 SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
95
96 SET (WITH_TEST_SUITE CACHE BOOL "")
97 SET (NO_OFFENSIVE CACHE BOOL "Exclude the offensive option.")
98 SET (LOCALDIR "${CMAKE_INSTALL_PREFIX}/local/share/games/fortunes" CACHE STRING "LOCALDIR fortunes dir")
99 SET (LOCALODIR "${LOCALDIR}/off" CACHE STRING "offensive fortunes localdir")
100 SET (COOKIEDIR "${CMAKE_INSTALL_PREFIX}/share/games/fortunes" CACHE STRING  "cookie dir not under /usr/local")
101 SET (OCOOKIEDIR "${COOKIEDIR}/off" CACHE STRING "offensive cookie dir not under /usr/local")
102
103 SHLOMIF_ADD_COMMON_C_FLAGS()
104
105 # add_flags("-Weverything" "-Wno-language-extension-token" "-Wno-padded")
106
107 SHLOMIF_FINALIZE_FLAGS()
108
109 INCLUDE ("${CMAKE_SOURCE_DIR}/cmake/rinutils_bootstrap.cmake")
110
111 RINUTILS_SET_UP_FLAGS()
112
113 IF (ENV{FCS_GCC})
114     ADD_DEFINITIONS("-W -Wabi=11 -Waddress -Waggressive-loop-optimizations -Wall -Wattributes -Wbad-function-cast -Wbool-compare -Wbool-operation -Wbuiltin-declaration-mismatch -Wbuiltin-macro-redefined -Wcast-align -Wchar-subscripts -Wclobbered -Wcomment -Wcomments -Wcoverage-mismatch -Wcpp -Wdangling-else -Wdate-time -Wdeprecated -Wdeprecated-declarations -Wdesignated-init -Wdisabled-optimization -Wdiscarded-array-qualifiers -Wdiscarded-qualifiers -Wdiv-by-zero -Wdouble-promotion -Wduplicated-branches -Wduplicated-cond -Wduplicate-decl-specifier -Wempty-body -Wendif-labels -Wenum-compare -Wexpansion-to-defined -Wextra -Wformat-contains-nul -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-signedness -Wformat-y2k -Wformat-zero-length -Wframe-address -Wfree-nonheap-object -Whsa -Wignored-attributes -Wignored-qualifiers -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Wincompatible-pointer-types -Winit-self -Winline -Wint-conversion -Wint-in-bool-context -Wint-to-pointer-cast -Winvalid-memory-model -Winvalid-pch -Wjump-misses-init -Wlogical-not-parentheses -Wlogical-op -Wmain -Wmaybe-uninitialized -Wmemset-elt-size -Wmemset-transposed-args -Wmisleading-indentation -Wmissing-braces -Wmissing-declarations -Wmissing-field-initializers -Wmissing-include-dirs -Wmissing-parameter-type -Wmissing-prototypes -Wmultichar -Wnarrowing -Wnested-externs -Wnonnull -Wnonnull-compare -Wnull-dereference -Wodr -Wold-style-declaration -Wold-style-definition -Wopenmp-simd -Woverflow -Woverlength-strings -Woverride-init -Wpacked -Wpacked-bitfield-compat -Wparentheses -Wpointer-arith -Wpointer-compare -Wpointer-sign -Wpointer-to-int-cast -Wpragmas -Wpsabi -Wrestrict -Wreturn-local-addr -Wreturn-type -Wscalar-storage-order -Wsequence-point -Wshadow -Wshift-count-negative -Wshift-count-overflow -Wshift-negative-value -Wsizeof-array-argument -Wsizeof-pointer-memaccess -Wstack-protector -Wstrict-aliasing -Wstrict-prototypes  -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wsuggest-attribute=pure -Wsuggest-final-methods -Wsuggest-final-types -Wswitch -Wswitch-bool -Wswitch-default -Wswitch-unreachable -Wsync-nand -Wtautological-compare -Wtrampolines -Wtrigraphs -Wtype-limits -Wuninitialized -Wunknown-pragmas -Wunsafe-loop-optimizations -Wunused -Wunused-but-set-parameter -Wunused-but-set-variable -Wunused-function -Wunused-label -Wunused-local-typedefs -Wunused-macros -Wunused-parameter -Wunused-result -Wunused-value -Wunused-variable -Wvarargs -Wvariadic-macros -Wvector-operation-performance -Wvla -Wvolatile-register-var -Wwrite-strings -Walloc-size-larger-than=9223372036854775807 -Warray-bounds=2 -Wformat-overflow=2 -Wformat-truncation=2 -Wnormalized=nfc -Wshift-overflow=2  -Wunused-const-variable=2 -Wstrict-overflow=1  -Wno-switch-default -Wno-vla -Wno-inline  -Wno-jump-misses-init -Wno-unsafe-loop-optimizations")
115     # -Wimplicit-fallthrough=5
116     # -Wno-vla-larger-than
117     # -Wsuggest-attribute=const
118     # -Wstringop-overflow=2
119
120     IF (NOT IS_DEBUG)
121         ADD_DEFINITIONS("-D_FORTIFY_SOURCE=2")
122     ELSE ()
123         ADD_DEFINITIONS("-D_FORTIFY_SOURCE=2")
124     ENDIF ()
125         ADD_DEFINITIONS("-O1")
126 ENDIF ()
127
128 # Either or both of CheckIncludeFile
129 # and CheckIncludeFiles may be needed for
130 # CHECK_INCLUDE_FILES and CHECK_INCLUDE_FILE
131 INCLUDE(CheckIncludeFile)
132 INCLUDE(CheckIncludeFiles)
133 SET(_r "stdbool.h" "stdio.h" "recode.h")
134 CHECK_INCLUDE_FILES("${_r}" HAVE_RECODE_H)
135 IF (NOT HAVE_RECODE_H)
136     IF (NOT WIN32)
137         MESSAGE(WARNING "Cannot find recode.h anywhere; it is usually unnecessary, but you may opt to install a source release tarball of the recode library from https://github.com/rrthomas/recode")
138     ENDIF ()
139 ENDIF ()
140
141 # So it can find config.h
142 INCLUDE_DIRECTORIES(BEFORE "${CMAKE_CURRENT_BINARY_DIR}")
143
144 MACRO(my_exe exe c_file dir)
145     SET(_files "${c_file}")
146     if (WIN32)
147         list(APPEND _files "util/getopt.c")
148     endif()
149     ADD_EXECUTABLE("${exe}" "${c_file}")
150     set(_libs)
151     if ("${exe}" STREQUAL "fortune")
152         if (HAVE_RECODE_H)
153             list(APPEND _libs "recode")
154         endif()
155     endif()
156     if (WIN32)
157         # See https://stackoverflow.com/questions/15119639/how-to-link-winsock-in-cmake
158         list(APPEND _libs intl regex wsock32 ws2_32)
159     endif()
160     TARGET_LINK_LIBRARIES("${exe}" ${_libs})
161     if (NOT ("${dir}" STREQUAL "null"))
162         INSTALL(TARGETS "${exe}" RUNTIME DESTINATION "${dir}")
163     endif()
164 ENDMACRO()
165
166 my_exe(
167     "fortune"
168     "fortune/fortune.c"
169     "games"
170 )
171
172 my_exe(
173     "strfile"
174     "util/strfile.c"
175     "bin"
176 )
177
178 # Build but not install.
179 my_exe("randstr" "util/randstr.c" "null")
180 my_exe(
181     "unstr"
182     "util/unstr.c"
183     "bin"
184 )
185
186 my_exe(
187     "rot"
188     "util/rot.c"
189     "bin"
190 )
191
192 SET (_my_man_page_dir "${CMAKE_CURRENT_BINARY_DIR}/manpages")
193 SET (_my_man_page "${_my_man_page_dir}/fortune.6")
194 SET (_my_man_gen "${CMAKE_CURRENT_SOURCE_DIR}/fortune/process-fortune-man-template.pl")
195 SET (_my_args)
196 LIST(APPEND _my_args "--cookiedir" "${COOKIEDIR}" "--ocookiedir" "${OCOOKIEDIR}" "--output" "${_my_man_page}")
197 IF (NO_OFFENSIVE)
198     LIST(APPEND _my_args "--without-offensive")
199     SET(_MY_IN "${CMAKE_CURRENT_SOURCE_DIR}/fortune/fortune_with_offensive.template.man")
200 ELSE()
201     SET(_MY_IN "${CMAKE_CURRENT_SOURCE_DIR}/fortune/fortune_without_offensive.template.man")
202 ENDIF()
203 LIST(APPEND _my_args "--input" "${_MY_IN}")
204
205 ADD_CUSTOM_COMMAND(
206     OUTPUT "${_my_man_page}"
207     COMMAND "${PERL_EXECUTABLE}"
208     ARGS "${_my_man_gen}" ${_my_args}
209     DEPENDS "${_my_man_gen}" "${_MY_IN}"
210 )
211 SET (_my_man_pages_list)
212
213 LIST(APPEND _my_man_pages_list "${_my_man_page}")
214
215 INSTALL_RENAME_MAN("fortune.6" "6" "fortune" "${_my_man_page_dir}")
216
217 SET (_util_dir "${CMAKE_CURRENT_SOURCE_DIR}/util")
218 MACRO(_fortune__generate_docbook basename offensive_flags)
219
220     SET (_my_man_page_dir "${CMAKE_CURRENT_SOURCE_DIR}/fortune")
221     SET (_dest_basename "${basename}.template")
222     SET (_my_man_page "${_my_man_page_dir}/${_dest_basename}.man")
223     SET (_my_man_docbook "${_my_man_page_dir}/${basename}.docbook5.xml")
224     SET (_my_man_prog "${_my_man_page_dir}/gen-fortune-docbook-page.pl")
225     SET (_my_args "${_my_man_prog}" "--output" "${_my_man_docbook}" --cookiedir "[[cookiedir_placeholder]]" --ocookiedir "[[ocookiedir_placeholder]]" ${offensive_flags})
226     ADD_CUSTOM_COMMAND(
227         OUTPUT "${_my_man_docbook}"
228         COMMAND "${PERL_EXECUTABLE}"
229         ARGS ${_my_args}
230         DEPENDS "${_my_man_prog}"
231     )
232
233     LIST(APPEND _my_man_pages_list "${_my_man_docbook}")
234     SET (_my_args "-I${_util_dir}" "${_util_dir}/fortmod_gen_manpage.pl" "--src-dir" "${CMAKE_CURRENT_SOURCE_DIR}" "--basename=${basename}" "--dest-basename=${_dest_basename}" "--out-section=6" "--out-basename=fortune" "--subdir=fortune")
235     ADD_CUSTOM_COMMAND(
236         OUTPUT "${_my_man_page}"
237         COMMAND "${PERL_EXECUTABLE}"
238         ARGS ${_my_args}
239         DEPENDS "${_my_man_docbook}"
240     )
241
242     LIST(APPEND _my_man_pages_list "${_my_man_page}")
243 ENDMACRO()
244
245 _fortune__generate_docbook("fortune_with_offensive" "")
246 _fortune__generate_docbook("fortune_without_offensive" "--without-offensive")
247
248 MACRO(_fortune__generate_manpage basename)
249
250     SET (_my_man_page_dir "${CMAKE_CURRENT_SOURCE_DIR}/util")
251     SET (_my_man_page "${_my_man_page_dir}/${basename}.man")
252     SET (_my_man_docbook "${_my_man_page_dir}/${basename}.docbook5.xml")
253     SET (_my_args "-I${_util_dir}" "${_util_dir}/fortmod_gen_manpage.pl" "--src-dir" "${CMAKE_CURRENT_SOURCE_DIR}" "--basename=${basename}")
254     ADD_CUSTOM_COMMAND(
255         OUTPUT "${_my_man_page}"
256         COMMAND "${PERL_EXECUTABLE}"
257         ARGS ${_my_args}
258         DEPENDS "${_my_man_docbook}"
259     )
260
261     LIST(APPEND _my_man_pages_list "${_my_man_page}")
262 ENDMACRO()
263
264 _fortune__generate_manpage("strfile")
265 INSTALL_RENAME_MAN("strfile.man" "1" "strfile" "${_my_man_page_dir}")
266 _fortune__generate_manpage("randstr")
267
268 ADD_CUSTOM_TARGET(
269     generate_man_page
270     ALL DEPENDS ${_my_man_pages_list}
271 )
272
273 INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/util")
274
275 IF(WIN32 AND NOT UNIX)
276     FOREACH (var "LOCALODIR" "LOCALDIR" "OCOOKIEDIR" "COOKIEDIR")
277         string(REPLACE "\\" "/" "${var}" "${${var}}")
278     ENDFOREACH()
279 ENDIF()
280
281 IF (NO_OFFENSIVE)
282     ADD_DEFINITIONS("-DNO_OFFENSIVE=1")
283 ENDIF()
284
285 CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
286
287 IF (HAVE_REGEX_H)
288     ADD_DEFINITIONS("-DHAVE_REGEX_H")
289     ADD_DEFINITIONS("-DPOSIX_REGEX")
290 ENDIF()
291
292 ADD_DEFINITIONS("-DHAVE_STDBOOL")
293 SET (COOKIES
294     art
295     ascii-art
296     computers
297     cookie
298     definitions
299     disclaimer
300     drugs
301     education
302     ethnic
303     food
304     fortunes
305     goedel
306     humorists
307     kids
308     law
309     literature
310     love
311     magic
312     medicine
313     men-women
314     miscellaneous
315     news
316     people
317     pets
318     platitudes
319     politics
320     pratchett
321     riddles
322     rules-of-acquisition
323     science
324     songs-poems
325     sports
326     startrek
327     tao
328     translate-me
329     wisdom
330     work
331     linux
332     perl
333     knghtbrd
334     paradoxum
335     zippy
336     debian
337 )
338
339 SET (OFFENSIVE_COOKIES
340     art
341     astrology
342     atheism
343     black-humor
344     cookie
345     debian
346     definitions
347     drugs
348     ethnic
349     fortunes
350     hphobia
351     knghtbrd
352     limerick
353     linux
354     misandry
355     miscellaneous
356     misogyny
357     politics
358     privates
359     racism
360     religion
361     riddles
362     sex
363     songs-poems
364     vulgarity
365     zippy
366 )
367
368 ADD_SUBDIRECTORY("datfiles")
369
370 string (REPLACE ";" " " COOKIES_STR "${COOKIES}")
371 ADD_CUSTOM_TARGET(
372     "check"
373     "perl" "${CMAKE_SOURCE_DIR}/run-tests.pl" "--src-dir" "${CMAKE_SOURCE_DIR}" "--cookies" "${COOKIES_STR}"
374 )
375
376 # Rebuild config.h if ver.txt has changed.
377 ADD_CUSTOM_COMMAND(
378     OUTPUT "config.h.in"
379     DEPENDS "ver.txt"
380     COMMAND "touch"
381     ARGS "config.h.in"
382 )
383
384 SET(AUTOGENERATED_CONFIG_H "config.h was auto-generated from config.h.in . Do not modify directly")
385
386 CONFIGURE_FILE(
387     ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
388     ${CMAKE_CURRENT_BINARY_DIR}/config.h
389 )
390
391 INCLUDE(CPack)