]> granicus.if.org Git - fortune-mod/blob - fortune-mod/CMakeLists.txt
Refactoring / code cleanup.
[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 find_package(Rinutils REQUIRED)
106 INCLUDE_DIRECTORIES(AFTER ${RINUTILS_INCLUDE_DIR} ${RINUTILS_INCLUDE_DIRS})
107
108 IF ("$ENV{FCS_GCC}")
109     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")
110     # -Wimplicit-fallthrough=5
111     # -Wno-vla-larger-than
112     # -Wsuggest-attribute=const
113     # -Wstringop-overflow=2
114
115     IF (NOT IS_DEBUG)
116         ADD_DEFINITIONS("-D_FORTIFY_SOURCE=2")
117     ELSE ()
118         ADD_DEFINITIONS("-D_FORTIFY_SOURCE=2")
119     ENDIF ()
120         ADD_DEFINITIONS("-O1")
121 ENDIF ()
122
123 INCLUDE(CheckIncludeFile)
124 SET(_r "stdbool.h" "stdio.h" "recode.h")
125 CHECK_INCLUDE_FILES("${_r}" HAVE_RECODE_H)
126 IF (NOT "${HAVE_RECODE_H}")
127     IF (NOT WIN32)
128         MESSAGE(FATAL_ERROR "Cannot find recode.h anywhere - please install lib recode")
129     ENDIF ()
130 ENDIF ()
131
132 # So it can find config.h
133 INCLUDE_DIRECTORIES(BEFORE "${CMAKE_CURRENT_BINARY_DIR}")
134
135 MACRO(my_exe exe c_file dir)
136     SET(_files "${c_file}")
137     if (WIN32)
138         list(APPEND _files "util/getopt.c")
139     endif()
140     ADD_EXECUTABLE("${exe}" "${c_file}")
141     set(_libs)
142     if ("${exe}" STREQUAL "fortune")
143         if (HAVE_RECODE_H)
144             list(APPEND _libs "recode")
145         endif()
146     endif()
147     if (WIN32)
148         # See https://stackoverflow.com/questions/15119639/how-to-link-winsock-in-cmake
149         list(APPEND _libs intl regex wsock32 ws2_32)
150     endif()
151     TARGET_LINK_LIBRARIES("${exe}" ${_libs})
152     if (NOT ("${dir}" STREQUAL "null"))
153         INSTALL(TARGETS "${exe}" RUNTIME DESTINATION "${dir}")
154     endif()
155 ENDMACRO()
156
157 my_exe(
158     "fortune"
159     "fortune/fortune.c"
160     "games"
161 )
162
163 my_exe(
164     "strfile"
165     "util/strfile.c"
166     "bin"
167 )
168
169 # Build but not install.
170 my_exe("randstr" "util/randstr.c" "null")
171 my_exe(
172     "unstr"
173     "util/unstr.c"
174     "bin"
175 )
176
177 my_exe(
178     "rot"
179     "util/rot.c"
180     "bin"
181 )
182
183 SET (_my_man_page_dir "${CMAKE_CURRENT_BINARY_DIR}/manpages")
184 SET (_my_man_page "${_my_man_page_dir}/fortune.6")
185 SET (_my_man_gen "${CMAKE_CURRENT_SOURCE_DIR}/fortune/gen-fortune-man-page.pl")
186 SET (_my_args)
187 LIST(APPEND _my_args "--cookiedir" "${COOKIEDIR}" "--ocookiedir" "${OCOOKIEDIR}" "--output" "${_my_man_page}")
188 IF ("${NO_OFFENSIVE}")
189     LIST(APPEND _my_args "--without-offensive")
190 ENDIF()
191
192 ADD_CUSTOM_COMMAND(
193     OUTPUT "${_my_man_page}"
194     COMMAND "${PERL_EXECUTABLE}"
195     ARGS "${_my_man_gen}" ${_my_args}
196     DEPENDS "${_my_man_gen}"
197 )
198
199 ADD_CUSTOM_TARGET(
200     generate_man_page
201     ALL DEPENDS "${_my_man_page}"
202 )
203 INSTALL_RENAME_MAN("strfile.man" "1" "strfile" "util")
204 INSTALL_RENAME_MAN("fortune.6" "6" "fortune" "${_my_man_page_dir}")
205
206 INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/util")
207
208 IF(WIN32 AND NOT UNIX)
209     FOREACH (var "LOCALODIR" "LOCALDIR" "OCOOKIEDIR" "COOKIEDIR")
210         string(REPLACE "\\" "/" "${var}" "${${var}}")
211     ENDFOREACH()
212 ENDIF()
213
214 IF ("${NO_OFFENSIVE}")
215     ADD_DEFINITIONS("-DNO_OFFENSIVE=1")
216 ENDIF()
217
218 CHECK_INCLUDE_FILE("regex.h" HAVE_REGEX_H)
219
220 IF ("${HAVE_REGEX_H}")
221     ADD_DEFINITIONS("-DHAVE_REGEX_H")
222     ADD_DEFINITIONS("-DPOSIX_REGEX")
223 ENDIF()
224
225 ADD_DEFINITIONS("-DHAVE_STDBOOL")
226 SET (COOKIES
227     art
228     ascii-art
229     computers
230     cookie
231     definitions
232     disclaimer
233     drugs
234     education
235     ethnic
236     food
237     fortunes
238     goedel
239     humorists
240     kids
241     law
242     linuxcookie
243     literature
244     love
245     magic
246     medicine
247     men-women
248     miscellaneous
249     news
250     people
251     pets
252     platitudes
253     politics
254     pratchett
255     riddles
256     science
257     songs-poems
258     sports
259     startrek
260     tao
261     translate-me
262     wisdom
263     work
264     linux
265     perl
266     knghtbrd
267     paradoxum
268     zippy
269     debian
270 )
271
272 SET (OFFENSIVE_COOKIES
273     art
274     astrology
275     atheism
276     black-humor
277     cookie
278     debian
279     definitions
280     drugs
281     ethnic
282     fortunes
283     hphobia
284     knghtbrd
285     limerick
286     linux
287     misandry
288     miscellaneous
289     misogyny
290     politics
291     privates
292     racism
293     religion
294     riddles
295     sex
296     songs-poems
297     vulgarity
298     zippy
299 )
300
301 ADD_SUBDIRECTORY("datfiles")
302
303 string (REPLACE ";" " " COOKIES_STR "${COOKIES}")
304 ADD_CUSTOM_TARGET(
305     "check"
306     "perl" "${CMAKE_SOURCE_DIR}/run-tests.pl" "--src-dir" "${CMAKE_SOURCE_DIR}" "--cookies" "${COOKIES_STR}"
307 )
308
309 # Rebuild config.h if ver.txt has changed.
310 ADD_CUSTOM_COMMAND(
311     OUTPUT "config.h.in"
312     DEPENDS "ver.txt"
313     COMMAND "touch"
314     ARGS "config.h.in"
315 )
316
317 SET(AUTOGENERATED_CONFIG_H "config.h was auto-generated from config.h.in . Do not modify directly")
318
319 CONFIGURE_FILE(
320     ${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
321     ${CMAKE_CURRENT_BINARY_DIR}/config.h
322 )
323
324 INCLUDE(CPack)