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