]> granicus.if.org Git - fortune-mod/blob - fortune-mod/CMakeLists.txt
13f8e31a3821cd26cc2a09f422423ab521c1b7c8
[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 INCLUDE(FindPkgConfig)
11
12 SET (PKGDATADIR_SUBDIR "fortune-mod")
13 SET (RELATIVE_PKGDATADIR "${RELATIVE_DATADIR}/${PKGDATADIR_SUBDIR}")
14 SET (PKGDATADIR "${DATADIR}/${PKGDATADIR_SUBDIR}")
15
16 # Introduces VERSION , CPACK_PACKAGE_VERSION_MAJOR,
17 # CPACK_PACKAGE_VERSION_MAJOR, and CPACK_PACKAGE_VERSION_PATCH
18 READ_VERSION_FROM_VER_TXT()
19
20 # This is the equivalent to perform a "make dist"/"make distdir" etc.
21 SET(CPACK_PACKAGE_NAME "fortune-mod")
22 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "fortune-mod")
23 SET(CPACK_PACKAGE_VENDOR "Shlomi Fish")
24 SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README")
25 SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING.txt")
26
27
28 SET(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_DESCRIPTION_SUMMARY} ${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
29
30 SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
31 SET(CPACK_SOURCE_GENERATOR "TXZ")
32
33 SET (base_with_ver "fortune-mod-[0-9]+\\\\.[0-9]+\\\\.[0-9]+")
34
35 SET(CPACK_SOURCE_IGNORE_FILES
36     "/\\\\.deps/"
37     "/\\\\.git/"
38     "/\\\\.tidyall\\\\.d/"
39     "~$"
40     "\\\\.pyc$"
41     "/tags$"
42     # "/(build|BUILD|B)/"
43 )
44
45 IF(WIN32 AND NOT UNIX)
46     # There is a bug in NSI that does not handle full unix paths properly. Make
47     # sure there is at least one set of four (4) backlasshes.
48     SET(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}\\\\dondorf-king.bmp")
49     SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\\\fortune.exe")
50     SET(CPACK_NSIS_HELP_LINK "http:\\\\\\\\github.com\\\\shlomif\\\\fortune-mod")
51     SET(CPACK_NSIS_URL_INFO_ABOUT  "http:\\\\\\\\github.com\\\\shlomif\\\\fortune-mod")
52     SET(CPACK_NSIS_DISPLAY_NAME "fortune-mod")
53     SET(CPACK_NSIS_CONTACT "shlomif@shlomifish.org")
54     SET(CPACK_NSIS_MODIFY_PATH ON)
55     # Setting for NSIS :
56     SET(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\fc-solve.ico")
57     SET(CPACK_NSIS_MUI_UNIICON ${CPACK_NSIS_MUI_ICON})
58     SET(CPACK_PACKAGE_ICON ${CPACK_NSIS_MUI_ICON})
59     SET(CPACK_NSIS_MODIFY_PATH "ON")
60 ELSE()
61   SET(CPACK_STRIP_FILES "fortune")
62   SET(CPACK_SOURCE_STRIP_FILES "")
63 ENDIF()
64
65 SET(CPACK_PACKAGE_EXECUTABLES
66     "fortune" "The fortune-mod program"
67 )
68
69 ### This is to set the RPATH correctly, so when installed under a prefix
70 ### the executables will find the libraries.
71 ###
72 ### See:
73 ###
74 ### http://www.cmake.org/Wiki/CMake_RPATH_handling
75 ###
76 ### (Taken from that wiki page)
77
78 # use, i.e. don't skip the full RPATH for the build tree
79 SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
80
81 # when building, don't use the install RPATH already
82 # (but later on when installing)
83 SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
84
85 # the RPATH to be used when installing
86 SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}")
87
88 # add the automatically determined parts of the RPATH
89 # which point to directories outside the build tree to the install RPATH
90 SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
91
92 SET (WITH_TEST_SUITE CACHE BOOL "")
93 SET (NO_OFFENSIVE CACHE BOOL "Exclude the offensive option.")
94 SET (LOCALDIR "${CMAKE_INSTALL_PREFIX}/local/share/games/fortunes" CACHE STRING "LOCALDIR fortunes dir")
95 SET (LOCALODIR "${LOCALDIR}/off" CACHE STRING "offensive fortunes localdir")
96 SET (COOKIEDIR "${CMAKE_INSTALL_PREFIX}/share/games/fortunes" CACHE STRING  "cookie dir not under /usr/local")
97 SET (OCOOKIEDIR "${COOKIEDIR}/off" CACHE STRING "offensive cookie dir not under /usr/local")
98
99 SHLOMIF_ADD_COMMON_C_FLAGS()
100
101 # add_flags("-Weverything" "-Wno-language-extension-token" "-Wno-padded")
102
103 SHLOMIF_FINALIZE_FLAGS()
104
105 INCLUDE ("${CMAKE_SOURCE_DIR}/cmake/rinutils_bootstrap.cmake")
106
107 RINUTILS_SET_UP_FLAGS()
108
109 IF ("$ENV{FCS_GCC}")
110     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")
111     # -Wimplicit-fallthrough=5
112     # -Wno-vla-larger-than
113     # -Wsuggest-attribute=const
114     # -Wstringop-overflow=2
115
116     IF (NOT IS_DEBUG)
117         ADD_DEFINITIONS("-D_FORTIFY_SOURCE=2")
118     ELSE ()
119         ADD_DEFINITIONS("-D_FORTIFY_SOURCE=2")
120     ENDIF ()
121         ADD_DEFINITIONS("-O1")
122 ENDIF ()
123
124 # Either or both of CheckIncludeFile
125 # and CheckIncludeFiles may be needed for
126 # CHECK_INCLUDE_FILES and CHECK_INCLUDE_FILE
127 INCLUDE(CheckIncludeFile)
128 INCLUDE(CheckIncludeFiles)
129 SET(_r "stdbool.h" "stdio.h" "recode.h")
130 CHECK_INCLUDE_FILES("${_r}" HAVE_RECODE_H)
131 IF (NOT "${HAVE_RECODE_H}")
132     IF (NOT WIN32)
133         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")
134     ENDIF ()
135 ENDIF ()
136
137 # So it can find config.h
138 INCLUDE_DIRECTORIES(BEFORE "${CMAKE_CURRENT_BINARY_DIR}")
139
140 MACRO(my_exe exe c_file dir)
141     SET(_files "${c_file}")
142     if (WIN32)
143         list(APPEND _files "util/getopt.c")
144     endif()
145     ADD_EXECUTABLE("${exe}" "${c_file}")
146     set(_libs)
147     if ("${exe}" STREQUAL "fortune")
148         if (HAVE_RECODE_H)
149             list(APPEND _libs "recode")
150         endif()
151     endif()
152     if (WIN32)
153         # See https://stackoverflow.com/questions/15119639/how-to-link-winsock-in-cmake
154         list(APPEND _libs intl regex wsock32 ws2_32)
155     endif()
156     TARGET_LINK_LIBRARIES("${exe}" ${_libs})
157     if (NOT ("${dir}" STREQUAL "null"))
158         INSTALL(TARGETS "${exe}" RUNTIME DESTINATION "${dir}")
159     endif()
160 ENDMACRO()
161
162 my_exe(
163     "fortune"
164     "fortune/fortune.c"
165     "games"
166 )
167
168 my_exe(
169     "strfile"
170     "util/strfile.c"
171     "bin"
172 )
173
174 # Build but not install.
175 my_exe("randstr" "util/randstr.c" "null")
176 my_exe(
177     "unstr"
178     "util/unstr.c"
179     "bin"
180 )
181
182 my_exe(
183     "rot"
184     "util/rot.c"
185     "bin"
186 )
187
188 SET (_my_man_page_dir "${CMAKE_CURRENT_BINARY_DIR}/manpages")
189 SET (_my_man_page "${_my_man_page_dir}/fortune.6")
190 SET (_my_man_gen "${CMAKE_CURRENT_SOURCE_DIR}/fortune/process-fortune-man-template.pl")
191 SET (_my_args)
192 LIST(APPEND _my_args "--cookiedir" "${COOKIEDIR}" "--ocookiedir" "${OCOOKIEDIR}" "--output" "${_my_man_page}")
193 IF ("${NO_OFFENSIVE}")
194     LIST(APPEND _my_args "--without-offensive")
195     SET(_MY_IN "${CMAKE_CURRENT_SOURCE_DIR}/fortune/fortune_with_offensive.template.man")
196 ELSE()
197     SET(_MY_IN "${CMAKE_CURRENT_SOURCE_DIR}/fortune/fortune_without_offensive.template.man")
198 ENDIF()
199 LIST(APPEND _my_args "--input" "${_MY_IN}")
200
201 ADD_CUSTOM_COMMAND(
202     OUTPUT "${_my_man_page}"
203     COMMAND "${PERL_EXECUTABLE}"
204     ARGS "${_my_man_gen}" ${_my_args}
205     DEPENDS "${_my_man_gen}" "${_MY_IN}"
206 )
207 SET (_my_man_pages_list)
208
209 LIST(APPEND _my_man_pages_list "${_my_man_page}")
210
211 INSTALL_RENAME_MAN("fortune.6" "6" "fortune" "${_my_man_page_dir}")
212
213 SET (_util_dir "${CMAKE_CURRENT_SOURCE_DIR}/util")
214 MACRO(_fortune__generate_docbook basename offensive_flags)
215
216     SET (_my_man_page_dir "${CMAKE_CURRENT_SOURCE_DIR}/fortune")
217     SET (_dest_basename "${basename}.template")
218     SET (_my_man_page "${_my_man_page_dir}/${_dest_basename}.man")
219     SET (_my_man_docbook "${_my_man_page_dir}/${basename}.docbook5.xml")
220     SET (_my_man_prog "${_my_man_page_dir}/gen-fortune-docbook-page.pl")
221     SET (_my_args "${_my_man_prog}" "--output" "${_my_man_docbook}" --cookiedir "[[cookiedir_placeholder]]" --ocookiedir "[[ocookiedir_placeholder]]" ${offensive_flags})
222     ADD_CUSTOM_COMMAND(
223         OUTPUT "${_my_man_docbook}"
224         COMMAND "${PERL_EXECUTABLE}"
225         ARGS ${_my_args}
226         DEPENDS "${_my_man_prog}"
227     )
228
229     LIST(APPEND _my_man_pages_list "${_my_man_docbook}")
230     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")
231     ADD_CUSTOM_COMMAND(
232         OUTPUT "${_my_man_page}"
233         COMMAND "${PERL_EXECUTABLE}"
234         ARGS ${_my_args}
235         DEPENDS "${_my_man_docbook}"
236     )
237
238     LIST(APPEND _my_man_pages_list "${_my_man_page}")
239 ENDMACRO()
240
241 _fortune__generate_docbook("fortune_with_offensive" "")
242 _fortune__generate_docbook("fortune_without_offensive" "--without-offensive")
243
244 MACRO(_fortune__generate_manpage basename)
245
246     SET (_my_man_page_dir "${CMAKE_CURRENT_SOURCE_DIR}/util")
247     SET (_my_man_page "${_my_man_page_dir}/${basename}.man")
248     SET (_my_man_docbook "${_my_man_page_dir}/${basename}.docbook5.xml")
249     SET (_my_args "-I${_util_dir}" "${_util_dir}/fortmod_gen_manpage.pl" "--src-dir" "${CMAKE_CURRENT_SOURCE_DIR}" "--basename=${basename}")
250     ADD_CUSTOM_COMMAND(
251         OUTPUT "${_my_man_page}"
252         COMMAND "${PERL_EXECUTABLE}"
253         ARGS ${_my_args}
254         DEPENDS "${_my_man_docbook}"
255     )
256
257     LIST(APPEND _my_man_pages_list "${_my_man_page}")
258 ENDMACRO()
259
260 _fortune__generate_manpage("strfile")
261 INSTALL_RENAME_MAN("strfile.man" "1" "strfile" "${_my_man_page_dir}")
262 _fortune__generate_manpage("randstr")
263
264 ADD_CUSTOM_TARGET(
265     generate_man_page
266     ALL DEPENDS ${_my_man_pages_list}
267 )
268
269 INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/util")
270
271 IF(WIN32 AND NOT UNIX)
272     FOREACH (var "LOCALODIR" "LOCALDIR" "OCOOKIEDIR" "COOKIEDIR")
273         string(REPLACE "\\" "/" "${var}" "${${var}}")
274     ENDFOREACH()
275 ENDIF()
276
277 IF ("${NO_OFFENSIVE}")
278     ADD_DEFINITIONS("-DNO_OFFENSIVE=1")
279 ENDIF()
280
281 CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
282
283 IF ("${HAVE_REGEX_H}")
284     ADD_DEFINITIONS("-DHAVE_REGEX_H")
285     ADD_DEFINITIONS("-DPOSIX_REGEX")
286 ENDIF()
287
288 ADD_DEFINITIONS("-DHAVE_STDBOOL")
289 SET (COOKIES
290     art
291     ascii-art
292     computers
293     cookie
294     definitions
295     disclaimer
296     drugs
297     education
298     ethnic
299     food
300     fortunes
301     goedel
302     humorists
303     kids
304     law
305     linuxcookie
306     literature
307     love
308     magic
309     medicine
310     men-women
311     miscellaneous
312     news
313     people
314     pets
315     platitudes
316     politics
317     pratchett
318     riddles
319     science
320     songs-poems
321     sports
322     startrek
323     tao
324     translate-me
325     wisdom
326     work
327     linux
328     perl
329     knghtbrd
330     paradoxum
331     zippy
332     debian
333 )
334
335 SET (OFFENSIVE_COOKIES
336     art
337     astrology
338     atheism
339     black-humor
340     cookie
341     debian
342     definitions
343     drugs
344     ethnic
345     fortunes
346     hphobia
347     knghtbrd
348     limerick
349     linux
350     misandry
351     miscellaneous
352     misogyny
353     politics
354     privates
355     racism
356     religion
357     riddles
358     sex
359     songs-poems
360     vulgarity
361     zippy
362 )
363
364 ADD_SUBDIRECTORY("datfiles")
365
366 string (REPLACE ";" " " COOKIES_STR "${COOKIES}")
367 ADD_CUSTOM_TARGET(
368     "check"
369     "perl" "${CMAKE_SOURCE_DIR}/run-tests.pl" "--src-dir" "${CMAKE_SOURCE_DIR}" "--cookies" "${COOKIES_STR}"
370 )
371
372 # Rebuild config.h if ver.txt has changed.
373 ADD_CUSTOM_COMMAND(
374     OUTPUT "config.h.in"
375     DEPENDS "ver.txt"
376     COMMAND "touch"
377     ARGS "config.h.in"
378 )
379
380 SET(AUTOGENERATED_CONFIG_H "config.h was auto-generated from config.h.in . Do not modify directly")
381
382 CONFIGURE_FILE(
383     ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
384     ${CMAKE_CURRENT_BINARY_DIR}/config.h
385 )
386
387 INCLUDE(CPack)