]> git.ipfire.org Git - thirdparty/sarg.git/blob - CMakeLists.txt
Ported r215 from branches/v2_2_7 (user ID mangling)
[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 3)
5 SET(sarg_BUILD "")
6 SET(sarg_BUILDDATE "Jan-28-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 language.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)
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 -Wextra -Wno-sign-compare -Wno-unused-parameter")
67 SET_TARGET_PROPERTIES(sarg PROPERTIES LINK_FLAGS "$ENV{LDFLAGS}")
68
69 CHECK_C_COMPILER_FLAG("-Werror=implicit-function-declaration" HAVE_WERROR_IMPLICIT_FUNCTION)
70 IF(HAVE_WERROR_IMPLICIT_FUNCTION)
71 GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS)
72 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -Werror=implicit-function-declaration")
73 ENDIF(HAVE_WERROR_IMPLICIT_FUNCTION)
74
75 CHECK_C_COMPILER_FLAG("-Werror=format" HAVE_WERROR_FORMAT)
76 IF(HAVE_WERROR_FORMAT)
77 GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS)
78 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -Werror=format")
79 ENDIF(HAVE_WERROR_FORMAT)
80
81 # Required header files
82 CHECK_INCLUDE_FILE(stdio.h HAVE_STDIO_H)
83 CHECK_INCLUDE_FILE(stdlib.h HAVE_STDLIB_H)
84 CHECK_INCLUDE_FILE(string.h HAVE_STRING_H)
85 CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H)
86 CHECK_INCLUDE_FILE(sys/time.h HAVE_SYS_TIME_H)
87 CHECK_INCLUDE_FILE(time.h HAVE_TIME_H)
88 CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)
89 CHECK_INCLUDE_FILE(sys/dirent.h HAVE_SYS_DIRENT_H)
90 CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H)
91 CHECK_INCLUDE_FILE(sys/socket.h HAVE_SYS_SOCKET_H)
92 CHECK_INCLUDE_FILE(netdb.h HAVE_NETDB_H)
93 CHECK_INCLUDE_FILE(arpa/inet.h HAVE_ARPA_INET_H)
94 CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H)
95 CHECK_INCLUDE_FILE(netinet/in.h HAVE_NETINET_H)
96 CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H)
97 CHECK_INCLUDE_FILE(ctype.h HAVE_CTYPE_H)
98 CHECK_INCLUDE_FILE(errno.h HAVE_ERRNO_H)
99 CHECK_INCLUDE_FILE(sys/resource.h HAVE_SYS_RESOURCE_H)
100 CHECK_INCLUDE_FILE(sys/wait.h HAVE_SYS_WAIT_H)
101 CHECK_INCLUDE_FILE(stdarg.h HAVE_STDARG_H)
102 CHECK_INCLUDE_FILE(inttypes.h HAVE_INTTYPES_H)
103 CHECK_INCLUDE_FILE(limits.h HAVE_LIMITS_H)
104 CHECK_INCLUDE_FILE(math.h HAVE_MATH_H)
105 CHECK_INCLUDE_FILE(locale.h HAVE_LOCALE_H)
106 CHECK_INCLUDE_FILE(execinfo.h HAVE_EXECINFO_H)
107
108 CHECK_FUNCTION_EXISTS(bzero HAVE_BZERO)
109 CHECK_FUNCTION_EXISTS(backtrace HAVE_BACKTRACE)
110 CHECK_FUNCTION_EXISTS(symlink HAVE_SYMLINK)
111 CHECK_FUNCTION_EXISTS(lstat HAVE_LSTAT)
112
113 # Find gd
114 CHECK_INCLUDE_FILE(gd.h HAVE_GD_H)
115 IF(HAVE_GD_H)
116 CHECK_INCLUDE_FILE(gdfontl.h HAVE_GDFONTL_H)
117 CHECK_INCLUDE_FILE(gdfontt.h HAVE_GDFONTT_H)
118 CHECK_INCLUDE_FILE(gdfonts.h HAVE_GDFONTS_H)
119 CHECK_INCLUDE_FILE(gdfontmb.h HAVE_GDFONTMB_H)
120 CHECK_INCLUDE_FILE(gdfontg.h HAVE_GDFONTG_H)
121 FIND_LIBRARY(GD_LIBRARY NAMES gd bgd DOC "The GD library")
122 IF(GD_LIBRARY)
123 #CHECK_LIBRARY_EXISTS(gd gdImagePng "." HAVE_GD)
124 TARGET_LINK_LIBRARIES(sarg ${GD_LIBRARY})
125 SET(HAVE_GD GD_LIBRARY CACHE PATH DOC "True IF GD was found")
126 SET(HAVE_GD CACHE BOOL DOC "True IF must use GD")
127 ENDIF(GD_LIBRARY)
128 ENDIF(HAVE_GD_H)
129
130 # Find iconv
131 OPTION(ENABLE_ICONV "Enable the usage of iconv" ON)
132 IF(ENABLE_ICONV)
133 CHECK_INCLUDE_FILE(iconv.h HAVE_ICONV_H)
134 IF(HAVE_ICONV_H)
135 FIND_PATH(ICONV_INCLUDE_PATH NAMES iconv.h)
136 FIND_LIBRARY(ICONV_LIBRARY NAMES iconv DOC "The ICONV library")
137 IF(ICONV_LIBRARY)
138 TARGET_LINK_LIBRARIES(sarg ${ICONV_LIBRARY})
139 ENDIF(ICONV_LIBRARY)
140 CHECK_FUNCTION_EXISTS(iconv_open HAVE_ICONV)
141
142 SET(ICONV_CONST_FILE ${CMAKE_BINARY_DIR}/consticonv.c)
143 FILE(WRITE ${ICONV_CONST_FILE} "
144 #include <stdlib.h>
145 #include <iconv.h>
146 extern
147 #ifdef __cplusplus
148 "C"
149 #endif
150 #if defined(__STDC__) || defined(__cplusplus)
151 size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
152 #else
153 size_t iconv();
154 #endif
155 ")
156 TRY_COMPILE(USE_CONST_ICONV ${CMAKE_BINARY_DIR} ${ICONV_CONST_FILE})
157 FILE(REMOVE ${ICONV_CONST_FILE})
158 IF(USE_CONST_ICONV)
159 SET(ICONV_CONST "\"const\"")
160 ENDIF(USE_CONST_ICONV)
161 ENDIF(HAVE_ICONV_H)
162 ENDIF(ENABLE_ICONV)
163
164 # Find ldap
165 CHECK_INCLUDE_FILE(ldap.h HAVE_LDAP_H)
166 IF(HAVE_LDAP_H)
167 FIND_LIBRARY(LDAP_LIBRARY NAMES ldap DOC "The ldap library")
168 IF(LDAP_LIBRARY)
169 TARGET_LINK_LIBRARIES(sarg ${LDAP_LIBRARY})
170 SET(HAVE_LDAP LDAP_LIBRARY CACHE PATH DOC "True if LDAP was found")
171 SET(HAVE_LDAP CACHE BOOL DOC "True if must use LDAP")
172 ENDIF(LDAP_LIBRARY)
173 ENDIF(HAVE_LDAP_H)
174
175 # Support for large files
176 OPTION(ENABLE_LARGEFILE "Enable the usage of large files" ON)
177 IF(ENABLE_LARGEFILE)
178 IF(LFS_SEARCHED MATCHES "^LFS_SEARCHED$")
179 SET(SEARCH_LARGEFILE TRUE)
180 ENDIF(LFS_SEARCHED MATCHES "^LFS_SEARCHED$")
181 ENDIF(ENABLE_LARGEFILE)
182
183 IF(SEARCH_LARGEFILE)
184 SET(LFS_SEARCHED TRUE CACHE INTERNAL "LFS has been searched")
185 MESSAGE(STATUS "Looking for large file support")
186 SET(LFS_FILE "${CMAKE_BINARY_DIR}/lfsfopen64.c")
187 FILE(WRITE ${LFS_FILE} "
188 #include <stdio.h>
189 int main(void)
190 {
191 FILE *f = fopen64 (\"/tmp/foo\",\"r\");
192 return(0);
193 }
194 ")
195 TRY_COMPILE(HAVE_FOPEN64 ${CMAKE_BINARY_DIR} ${LFS_FILE} COMPILE_DEFINITIONS "-Wall -Werror")
196 IF(HAVE_FOPEN64)
197 MESSAGE(STATUS "Looking for large file support - found")
198 ELSE(HAVE_FOPEN64)
199 SET(LFS_NEED_DEFINE FALSE CACHE BOOL "Does LFS require _LARGEFILE64_SOURCE ?")
200 MESSAGE(STATUS "Looking for large file support with _LARGEFILE64_SOURCE")
201 FILE(WRITE ${LFS_FILE} "
202 #define _LARGEFILE64_SOURCE
203 #include <stdio.h>
204 int main(void)
205 {
206 FILE *f = fopen64 (\"/tmp/foo\",\"r\");
207 return(0);
208 }
209 ")
210 TRY_COMPILE(HAVE_FOPEN64 ${CMAKE_BINARY_DIR} ${LFS_FILE} OUTPUT_VARIABLE LFS_OUTPUT)
211 IF(HAVE_FOPEN64)
212 MESSAGE(STATUS "Looking for large file support with _LARGEFILE64_SOURCE - found")
213 SET(LFS_NEED_DEFINE TRUE CACHE BOOL "Does LFS require _LARGEFILE64_SOURCE ?" FORCE)
214 ELSE(HAVE_FOPEN64)
215 MESSAGE("Failed with output ${LFS_OUTPUT}")
216 ENDIF(HAVE_FOPEN64)
217 ENDIF(HAVE_FOPEN64)
218 FILE(REMOVE ${LFS_FILE})
219 ENDIF(SEARCH_LARGEFILE)
220
221 IF(LFS_NEED_DEFINE)
222 ADD_DEFINITIONS(-D_LARGEFILE64_SOURCE)
223 ENDIF(LFS_NEED_DEFINE)
224
225 # Find rlim_t
226 IF(HAVE_SYS_RESOURCE_H)
227 SET(CMAKE_EXTRA_INCLUDE_FILES "sys/resource.h")
228 ENDIF(HAVE_SYS_RESOURCE_H)
229 CHECK_TYPE_SIZE(rlim_t RLIM_T)
230 IF(HAVE_RLIM_T)
231 IF(RLIM_T STREQUAL 4)
232 SET(RLIM_STRING "%d")
233 ELSEIF(RLIM_T STREQUAL 8)
234 SET(RLIM_STRING "%lli")
235 ELSE(RLIM_T STREQUAL 4)
236 MESSAGE("Unknown rlim_t size")
237 ENDIF(RLIM_T STREQUAL 4)
238 ELSE(HAVE_RLIM_T)
239 MESSAGE("Cannot detect the size of your system's rlim_t type")
240 ENDIF(HAVE_RLIM_T)
241
242 # Windows need lib wsock32
243 IF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
244 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H)
245 CHECK_INCLUDE_FILE(winsock.h HAVE_WINSOCK_H)
246 FIND_LIBRARY(WSOCK_LIB NAMES wsock32 DOC "The winsock library")
247 #check_library_exists(wsock32 "." HAVE_WSOCK)
248 IF(WSOCK_LIB)
249 #set_target_properties(sarg PROPERTIES LINK_FLAGS "${LINK_FLAGS} -lwsock32")
250 TARGET_LINK_LIBRARIES(sarg wsock32)
251 ENDIF(WSOCK_LIB)
252 ADD_DEFINITIONS(-DWINDOWS)
253 ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
254
255 CHECK_FUNCTION_EXISTS(mkstemp HAVE_MKSTEMP)
256 IF(NOT HAVE_MKSTEMP)
257 # MingW provide mkstemps in libiberty but doesn't declare it in any header file
258 FIND_LIBRARY(IBERTY_LIB NAMES iberty DOC "The library of mingw containing mkstemps")
259 IF(IBERTY_LIB)
260 TARGET_LINK_LIBRARIES(sarg iberty)
261 ENDIF(IBERTY_LIB)
262 ENDIF(NOT HAVE_MKSTEMP)
263
264 # System particularities
265 IF(CMAKE_SYSTEM_NAME STREQUAL "solaris")
266 TARGET_LINK_LIBRARIES(sarg socket nsl)
267 #SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_DEFINITIONS="-DSOLARIS ${COMPILE_DEFINITIONS}")
268 ADD_DEFINITIONS(-DSOLARIS)
269 ENDIF(CMAKE_SYSTEM_NAME STREQUAL "solaris")
270
271 OPTION(ENABLE_EXTRA_PROTECT "Enable compile and runtime extra protections" OFF)
272 IF(ENABLE_EXTRA_PROTECT)
273 GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS)
274 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -fstack-protector -D_FORTIFY_SOURCE=2 -Werror")
275 CHECK_C_COMPILER_FLAG("-Wformat -Werror=format-security" HAVE_WERROR_FORMAT_SECURITY)
276 IF(HAVE_WERROR_FORMAT_SECURITY)
277 GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS)
278 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -Wformat -Werror=format-security")
279 ENDIF(HAVE_WERROR_FORMAT_SECURITY)
280 ENDIF(ENABLE_EXTRA_PROTECT)
281
282 # Save the configuration for the project
283 CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/include/config.h.in" "${CMAKE_BINARY_DIR}/config.h" @ONLY)
284
285 # Installation of the project
286 INSTALL(TARGETS sarg DESTINATION "${BINDIR}")
287 INSTALL(FILES sarg.conf DESTINATION "${SYSCONFDIR}" RENAME sarg.conf.exemple)
288 INSTALL(FILES exclude_codes user_limit_block css.tpl DESTINATION "${SYSCONFDIR}")
289 INSTALL(FILES sarg.1 DESTINATION "${MANDIR}")
290 INSTALL(DIRECTORY languages/ DESTINATION "${LANGDIR}" PATTERN ".svn" EXCLUDE)
291 INSTALL(DIRECTORY images/ DESTINATION "${IMAGEDIR}" PATTERN ".svn" EXCLUDE)
292 INSTALL(DIRECTORY fonts/ DESTINATION "${FONTDIR}" FILES_MATCHING PATTERN "*.ttf" PATTERN ".svn" EXCLUDE)
293 INSTALL(DIRECTORY sarg-php/ DESTINATION "${SARGPHPDIR}" PATTERN ".svn" EXCLUDE)
294
295 # Package creation
296 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Squid Analysis Report Generator")
297 SET(CPACK_PACKAGE_VERSION_MAJOR "${sarg_VERSION}")
298 SET(CPACK_PACKAGE_VERSION_MINOR "${sarg_REVISION}")
299 SET(CPACK_PACKAGE_VERSION_PATCH "${sarg_BUILD}")
300 SET(CPACK_GENERATOR TGZ)
301 SET(CPACK_SOURCE_GENERATOR TGZ)
302 SET(CPACK_SOURCE_IGNORE_FILES "/.svn/" "/debian/" "/html/" "Makefile$" "config\\\\.log$" "config\\\\.status$" ".*~$" "\\\\.o$")
303 INCLUDE(CPack)