]> git.ipfire.org Git - thirdparty/sarg.git/blob - CMakeLists.txt
Apply a few more recommandation from splint
[thirdparty/sarg.git] / CMakeLists.txt
1 CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
2 PROJECT(sarg C)
3 SET(sarg_VERSION 2)
4 SET(sarg_REVISION "3rc1")
5 SET(sarg_BUILD "")
6 SET(sarg_BUILDDATE "Mar-16-2010")
7
8 INCLUDE(AddFileDependencies)
9 INCLUDE(CheckIncludeFile)
10 INCLUDE(CheckLibraryExists)
11 INCLUDE(CheckFunctionExists)
12 INCLUDE(CheckTypeSize)
13 INCLUDE(CheckSymbolExists)
14 INCLUDE(CheckCCompilerFlag)
15
16 DEFINE_PROPERTY(GLOBAL PROPERTY enable-htmldir BRIEF_DOCS "--enable-htmldir=htmldir"
17 FULL_DOCS "Select htmldir as the root of your WWW documents")
18
19 SET(PACKAGE_NAME "sarg")
20 SET(PACKAGE_VERSION "${sarg_VERSION}.${sarg_REVISION}${sarg_BUILD}")
21
22 MACRO(SET_ABS_SOURCE VAR DOC)
23 IF(${VAR} AND NOT ${VAR}_SOURCE)
24 SET(PATH "${${VAR}}")
25 IF(NOT IS_ABSOLUTE ${PATH})
26 SET(PATH "${CMAKE_INSTALL_PREFIX}/${PATH}")
27 ENDIF(NOT IS_ABSOLUTE ${PATH})
28 GET_FILENAME_COMPONENT(SOURCE_PATH "${PATH}" ABSOLUTE)
29 SET(${VAR}_SOURCE "${SOURCE_PATH}" CACHE PATH "${DOC}")
30 ENDIF(${VAR} AND NOT ${VAR}_SOURCE)
31 ENDMACRO(SET_ABS_SOURCE VAR DOC)
32
33 SET_ABS_SOURCE(SYSCONFDIR "The full path of the configuration directory to be compiled in the program")
34 SET_ABS_SOURCE(LANGDIR "The full path of the language directory to be compiled in the program")
35 SET_ABS_SOURCE(FONTDIR "The full path of the fonts directory to be compiled in the program")
36 SET_ABS_SOURCE(IMAGEDIR "The full path of the images directory to be compiled in the program")
37
38 SET(SYSCONFDIR "etc/sarg" CACHE PATH "The configuration directory relative to the install directory")
39 SET(BINDIR "bin" CACHE PATH "The directory to install the exec relative to the install directory")
40 SET(MANDIR "share/man" CACHE PATH "The directory to copy the man page relative to the install directory")
41 SET(LANGDIR "share/sarg/languages" CACHE PATH "The directory to copy the languages files relative to the install directory")
42 SET(FONTDIR "share/sarg/fonts" CACHE PATH "The directory to copy the fonts relative to the install directory")
43 SET(IMAGEDIR "share/sarg/images" CACHE PATH "The directory to copy the images files relative to the install directory")
44 SET(SARGPHPDIR "share/sarg/sarg-php" CACHE PATH "The directory to copy sarg-php relative to the install directory")
45
46 # Sources to compile
47 INCLUDE_DIRECTORIES("${CMAKE_BINARY_DIR}") #Make it find this config.h before the one in src/include
48 INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/include")
49 SET(SRC util.c log.c report.c topuser.c email.c sort.c html.c
50 totger.c index.c getconf.c usage.c decomp.c ip2name.c
51 useragent.c exclude.c convlog.c totday.c repday.c datafile.c
52 indexonly.c splitlog.c lastlog.c topsites.c siteuser.c css.c
53 smartfilter.c denied.c authfail.c charset.c
54 squidguard_log.c squidguard_report.c auth.c download.c grepday.c
55 dansguardian_log.c dansguardian_report.c realtime.c btree_cache.c
56 usertab.c userinfo.c longline.c)
57
58 FOREACH(f ${SRC})
59 ADD_FILE_DEPENDENCIES(${f} ${CMAKE_BINARY_DIR}/config.h ${CMAKE_SOURCE_DIR}/include/conf.h ${CMAKE_SOURCE_DIR}/include/info.h ${CMAKE_SOURCE_DIR}/include/defs.h)
60 ENDFOREACH(f)
61
62 ADD_EXECUTABLE(sarg ${SRC})
63
64 SET_TARGET_PROPERTIES(sarg PROPERTIES VERSION "${sarg_VERSION}.${sarg_REVISION}.${sarg_BUILD}")
65
66 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "$ENV{CFLAGS} -Wall -Wno-sign-compare")
67 SET_TARGET_PROPERTIES(sarg PROPERTIES LINK_FLAGS "$ENV{LDFLAGS}")
68
69 CHECK_C_COMPILER_FLAG("-Wextra" HAVE_WEXTRA)
70 IF(HAVE_WEXTRA)
71 # Not supported by gcc 3.3
72 GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS)
73 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -Wextra -Wno-unused-parameter")
74 ENDIF(HAVE_WEXTRA)
75
76 CHECK_C_COMPILER_FLAG("-Werror=implicit-function-declaration" HAVE_WERROR_IMPLICIT_FUNCTION)
77 IF(HAVE_WERROR_IMPLICIT_FUNCTION)
78 GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS)
79 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -Werror=implicit-function-declaration")
80 ENDIF(HAVE_WERROR_IMPLICIT_FUNCTION)
81
82 CHECK_C_COMPILER_FLAG("-Werror=format" HAVE_WERROR_FORMAT)
83 IF(HAVE_WERROR_FORMAT)
84 GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS)
85 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -Werror=format")
86 ENDIF(HAVE_WERROR_FORMAT)
87
88 # Required header files
89 CHECK_INCLUDE_FILE(stdio.h HAVE_STDIO_H)
90 CHECK_INCLUDE_FILE(stdlib.h HAVE_STDLIB_H)
91 CHECK_INCLUDE_FILE(string.h HAVE_STRING_H)
92 CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
93 CHECK_INCLUDE_FILE(sys/time.h HAVE_SYS_TIME_H)
94 CHECK_INCLUDE_FILE(time.h HAVE_TIME_H)
95 CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)
96 CHECK_INCLUDE_FILE(sys/dirent.h HAVE_SYS_DIRENT_H)
97 CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H)
98 CHECK_INCLUDE_FILE(sys/socket.h HAVE_SYS_SOCKET_H)
99 CHECK_INCLUDE_FILE(netdb.h HAVE_NETDB_H)
100 CHECK_INCLUDE_FILE(arpa/inet.h HAVE_ARPA_INET_H)
101 CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H)
102 CHECK_INCLUDE_FILE(netinet/in.h HAVE_NETINET_H)
103 CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H)
104 CHECK_INCLUDE_FILE(ctype.h HAVE_CTYPE_H)
105 CHECK_INCLUDE_FILE(errno.h HAVE_ERRNO_H)
106 CHECK_INCLUDE_FILE(sys/resource.h HAVE_SYS_RESOURCE_H)
107 CHECK_INCLUDE_FILE(sys/wait.h HAVE_SYS_WAIT_H)
108 CHECK_INCLUDE_FILE(stdarg.h HAVE_STDARG_H)
109 CHECK_INCLUDE_FILE(inttypes.h HAVE_INTTYPES_H)
110 CHECK_INCLUDE_FILE(limits.h HAVE_LIMITS_H)
111 CHECK_INCLUDE_FILE(math.h HAVE_MATH_H)
112 CHECK_INCLUDE_FILE(locale.h HAVE_LOCALE_H)
113 CHECK_INCLUDE_FILE(execinfo.h HAVE_EXECINFO_H)
114 CHECK_INCLUDE_FILE(libintl.h HAVE_LIBINTL_H)
115 CHECK_INCLUDE_FILE(libgen.h HAVE_LIBGEN_H)
116 CHECK_INCLUDE_FILE(stdbool.h HAVE_STDBOOL_H)
117
118 CHECK_FUNCTION_EXISTS(bzero HAVE_BZERO)
119 CHECK_FUNCTION_EXISTS(backtrace HAVE_BACKTRACE)
120 CHECK_FUNCTION_EXISTS(symlink HAVE_SYMLINK)
121 CHECK_FUNCTION_EXISTS(lstat HAVE_LSTAT)
122 CHECK_FUNCTION_EXISTS(getnameinfo HAVE_GETNAMEINFO)
123
124 # Find gd
125 CHECK_INCLUDE_FILE(gd.h HAVE_GD_H)
126 IF(HAVE_GD_H)
127 CHECK_INCLUDE_FILE(gdfontl.h HAVE_GDFONTL_H)
128 CHECK_INCLUDE_FILE(gdfontt.h HAVE_GDFONTT_H)
129 CHECK_INCLUDE_FILE(gdfonts.h HAVE_GDFONTS_H)
130 CHECK_INCLUDE_FILE(gdfontmb.h HAVE_GDFONTMB_H)
131 CHECK_INCLUDE_FILE(gdfontg.h HAVE_GDFONTG_H)
132 FIND_LIBRARY(GD_LIBRARY NAMES gd bgd DOC "The GD library")
133 IF(GD_LIBRARY)
134 #CHECK_LIBRARY_EXISTS(gd gdImagePng "." HAVE_GD_LIB)
135 TARGET_LINK_LIBRARIES(sarg ${GD_LIBRARY})
136 SET(HAVE_GD_LIB GD_LIBRARY CACHE PATH DOC "True IF GD was found")
137 SET(HAVE_GD_LIB CACHE BOOL DOC "True IF must use GD")
138 ENDIF(GD_LIBRARY)
139 ENDIF(HAVE_GD_H)
140
141 # Find iconv
142 OPTION(ENABLE_ICONV "Enable the usage of iconv" ON)
143 IF(ENABLE_ICONV)
144 CHECK_INCLUDE_FILE(iconv.h HAVE_ICONV_H)
145 IF(HAVE_ICONV_H)
146 FIND_PATH(ICONV_INCLUDE_PATH NAMES iconv.h)
147 FIND_LIBRARY(ICONV_LIBRARY NAMES iconv DOC "The ICONV library")
148 IF(ICONV_LIBRARY)
149 TARGET_LINK_LIBRARIES(sarg ${ICONV_LIBRARY})
150 ENDIF(ICONV_LIBRARY)
151 CHECK_FUNCTION_EXISTS(iconv_open HAVE_ICONV)
152
153 SET(ICONV_CONST_FILE ${CMAKE_BINARY_DIR}/consticonv.c)
154 FILE(WRITE ${ICONV_CONST_FILE} "
155 #include <stdlib.h>
156 #include <iconv.h>
157 extern
158 #ifdef __cplusplus
159 "C"
160 #endif
161 #if defined(__STDC__) || defined(__cplusplus)
162 size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
163 #else
164 size_t iconv();
165 #endif
166 ")
167 TRY_COMPILE(USE_CONST_ICONV ${CMAKE_BINARY_DIR} ${ICONV_CONST_FILE})
168 FILE(REMOVE ${ICONV_CONST_FILE})
169 IF(USE_CONST_ICONV)
170 SET(ICONV_CONST "\"const\"")
171 ENDIF(USE_CONST_ICONV)
172 ENDIF(HAVE_ICONV_H)
173 ENDIF(ENABLE_ICONV)
174
175 # Find ldap
176 CHECK_INCLUDE_FILE(ldap.h HAVE_LDAP_H)
177 IF(HAVE_LDAP_H)
178 FIND_LIBRARY(LDAP_LIBRARY NAMES ldap DOC "The ldap library")
179 IF(LDAP_LIBRARY)
180 TARGET_LINK_LIBRARIES(sarg ${LDAP_LIBRARY})
181 SET(HAVE_LDAP LDAP_LIBRARY CACHE PATH DOC "True if LDAP was found")
182 SET(HAVE_LDAP CACHE BOOL DOC "True if must use LDAP")
183 ENDIF(LDAP_LIBRARY)
184 ENDIF(HAVE_LDAP_H)
185
186 # Support for large files
187 OPTION(ENABLE_LARGEFILE "Enable the usage of large files" ON)
188 IF(ENABLE_LARGEFILE)
189 IF(LFS_SEARCHED MATCHES "^LFS_SEARCHED$")
190 SET(SEARCH_LARGEFILE TRUE)
191 ENDIF(LFS_SEARCHED MATCHES "^LFS_SEARCHED$")
192 ENDIF(ENABLE_LARGEFILE)
193
194 IF(SEARCH_LARGEFILE)
195 SET(LFS_SEARCHED TRUE CACHE INTERNAL "LFS has been searched")
196 MESSAGE(STATUS "Looking for large file support")
197 SET(LFS_FILE "${CMAKE_BINARY_DIR}/lfsfopen64.c")
198 FILE(WRITE ${LFS_FILE} "
199 #include <stdio.h>
200 int main(void)
201 {
202 FILE *f = fopen64 (\"/tmp/foo\",\"r\");
203 return(0);
204 }
205 ")
206 TRY_COMPILE(HAVE_FOPEN64 ${CMAKE_BINARY_DIR} ${LFS_FILE} COMPILE_DEFINITIONS "-Wall -Werror")
207 IF(HAVE_FOPEN64)
208 MESSAGE(STATUS "Looking for large file support - found")
209 ELSE(HAVE_FOPEN64)
210 SET(LFS_NEED_DEFINE FALSE CACHE BOOL "Does LFS require _LARGEFILE64_SOURCE ?")
211 MESSAGE(STATUS "Looking for large file support with _LARGEFILE64_SOURCE")
212 FILE(WRITE ${LFS_FILE} "
213 #define _LARGEFILE64_SOURCE
214 #include <stdio.h>
215 int main(void)
216 {
217 FILE *f = fopen64 (\"/tmp/foo\",\"r\");
218 return(0);
219 }
220 ")
221 TRY_COMPILE(HAVE_FOPEN64 ${CMAKE_BINARY_DIR} ${LFS_FILE} OUTPUT_VARIABLE LFS_OUTPUT)
222 IF(HAVE_FOPEN64)
223 MESSAGE(STATUS "Looking for large file support with _LARGEFILE64_SOURCE - found")
224 SET(LFS_NEED_DEFINE TRUE CACHE BOOL "Does LFS require _LARGEFILE64_SOURCE ?" FORCE)
225 ELSE(HAVE_FOPEN64)
226 MESSAGE("Failed with output ${LFS_OUTPUT}")
227 ENDIF(HAVE_FOPEN64)
228 ENDIF(HAVE_FOPEN64)
229 FILE(REMOVE ${LFS_FILE})
230 ENDIF(SEARCH_LARGEFILE)
231
232 IF(LFS_NEED_DEFINE)
233 ADD_DEFINITIONS(-D_LARGEFILE64_SOURCE)
234 ENDIF(LFS_NEED_DEFINE)
235
236 # Find rlim_t
237 IF(HAVE_SYS_RESOURCE_H)
238 SET(CMAKE_EXTRA_INCLUDE_FILES "sys/resource.h")
239 ENDIF(HAVE_SYS_RESOURCE_H)
240 CHECK_TYPE_SIZE(rlim_t RLIM_T)
241 IF(HAVE_RLIM_T)
242 IF(RLIM_T STREQUAL 4)
243 SET(RLIM_STRING "%d")
244 ELSEIF(RLIM_T STREQUAL 8)
245 SET(RLIM_STRING "%lli")
246 ELSE(RLIM_T STREQUAL 4)
247 MESSAGE("Unknown rlim_t size")
248 ENDIF(RLIM_T STREQUAL 4)
249 #ELSE(HAVE_RLIM_T)
250 # MESSAGE("Cannot detect the size of your system's rlim_t type")
251 ENDIF(HAVE_RLIM_T)
252
253 # Windows need lib wsock32
254 IF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
255 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H)
256 CHECK_INCLUDE_FILE(winsock.h HAVE_WINSOCK_H)
257 FIND_LIBRARY(WSOCK_LIB NAMES wsock32 DOC "The winsock library")
258 #check_library_exists(wsock32 "." HAVE_WSOCK)
259 IF(WSOCK_LIB)
260 #set_target_properties(sarg PROPERTIES LINK_FLAGS "${LINK_FLAGS} -lwsock32")
261 TARGET_LINK_LIBRARIES(sarg wsock32)
262 ENDIF(WSOCK_LIB)
263 ADD_DEFINITIONS(-DWINDOWS)
264 ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
265
266 CHECK_FUNCTION_EXISTS(mkstemp HAVE_MKSTEMP)
267 IF(NOT HAVE_MKSTEMP)
268 # MingW provide mkstemps in libiberty but doesn't declare it in any header file
269 FIND_LIBRARY(IBERTY_LIB NAMES iberty DOC "The library of mingw containing mkstemps")
270 IF(IBERTY_LIB)
271 TARGET_LINK_LIBRARIES(sarg iberty)
272 ENDIF(IBERTY_LIB)
273 ENDIF(NOT HAVE_MKSTEMP)
274
275 # Gettext and friends
276 IF(NOT HAVE_LC_MESSAGES)
277 SET(FILES)
278 IF(HAVE_LOCALE_H)
279 LIST(APPEND FILES "locale.h")
280 ENDIF(HAVE_LOCALE_H)
281 IF(HAVE_LIBINTL_H)
282 LIST(APPEND FILES "libintl.h")
283 ENDIF(HAVE_LIBINTL_H)
284 LIST(LENGTH FILES NFILES)
285 IF(NFILES GREATER 0)
286 CHECK_SYMBOL_EXISTS(LC_MESSAGES "${FILES}" HAVE_LC_MESSAGES)
287 ENDIF(NFILES GREATER 0)
288 ENDIF(NOT HAVE_LC_MESSAGES)
289
290 # System particularities
291 IF(CMAKE_SYSTEM_NAME STREQUAL "solaris")
292 TARGET_LINK_LIBRARIES(sarg socket nsl)
293 #SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_DEFINITIONS="-DSOLARIS ${COMPILE_DEFINITIONS}")
294 ADD_DEFINITIONS(-DSOLARIS)
295 ENDIF(CMAKE_SYSTEM_NAME STREQUAL "solaris")
296
297 OPTION(ENABLE_EXTRA_PROTECT "Enable compile and runtime extra protections" OFF)
298 IF(ENABLE_EXTRA_PROTECT)
299 GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS)
300 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -fstack-protector -D_FORTIFY_SOURCE=2 -Werror")
301 CHECK_C_COMPILER_FLAG("-Wformat -Werror=format-security" HAVE_WERROR_FORMAT_SECURITY)
302 IF(HAVE_WERROR_FORMAT_SECURITY)
303 GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS)
304 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -Wformat -Werror=format-security")
305 ENDIF(HAVE_WERROR_FORMAT_SECURITY)
306 ENDIF(ENABLE_EXTRA_PROTECT)
307
308 # Save the configuration for the project
309 CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/include/config.h.in" "${CMAKE_BINARY_DIR}/config.h" @ONLY)
310
311 # Installation of the project
312 INSTALL(TARGETS sarg DESTINATION "${BINDIR}")
313 INSTALL(FILES sarg.conf DESTINATION "${SYSCONFDIR}" RENAME sarg.conf.exemple)
314 INSTALL(FILES exclude_codes user_limit_block css.tpl DESTINATION "${SYSCONFDIR}")
315 INSTALL(FILES sarg.1 DESTINATION "${MANDIR}")
316 INSTALL(DIRECTORY languages/ DESTINATION "${LANGDIR}" PATTERN ".svn" EXCLUDE)
317 INSTALL(DIRECTORY images/ DESTINATION "${IMAGEDIR}" PATTERN ".svn" EXCLUDE)
318 INSTALL(DIRECTORY fonts/ DESTINATION "${FONTDIR}" FILES_MATCHING PATTERN "*.ttf" PATTERN ".svn" EXCLUDE)
319 INSTALL(DIRECTORY sarg-php/ DESTINATION "${SARGPHPDIR}" PATTERN ".svn" EXCLUDE)
320
321 # Package creation
322 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Squid Analysis Report Generator")
323 SET(CPACK_PACKAGE_VERSION_MAJOR "${sarg_VERSION}")
324 SET(CPACK_PACKAGE_VERSION_MINOR "${sarg_REVISION}")
325 SET(CPACK_PACKAGE_VERSION_PATCH "${sarg_BUILD}")
326 SET(CPACK_GENERATOR TGZ)
327 SET(CPACK_SOURCE_GENERATOR TGZ)
328 SET(CPACK_SOURCE_IGNORE_FILES "/.svn/" "/debian/" "/html/" "Makefile$" "config\\\\.log$" "config\\\\.status$" ".*~$" "\\\\.o$")
329 INCLUDE(CPack)