1 CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
4 SET(sarg_REVISION "3.2-pre1")
6 SET(sarg_BUILDDATE "Jan-27-2011")
8 INCLUDE(AddFileDependencies)
9 INCLUDE(CheckIncludeFile)
10 INCLUDE(CheckLibraryExists)
11 INCLUDE(CheckFunctionExists)
12 INCLUDE(CheckTypeSize)
13 INCLUDE(CheckSymbolExists)
14 INCLUDE(CheckCCompilerFlag)
16 DEFINE_PROPERTY(GLOBAL PROPERTY enable-htmldir BRIEF_DOCS "--enable-htmldir=htmldir"
17 FULL_DOCS "Select htmldir as the root of your WWW documents")
19 SET(PACKAGE_NAME "sarg")
20 SET(PACKAGE_VERSION "${sarg_VERSION}.${sarg_REVISION}${sarg_BUILD}")
22 MACRO(SET_ABS_SOURCE VAR DOC)
23 IF(${VAR} AND NOT ${VAR}_SOURCE)
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)
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")
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")
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 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)
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)
62 ADD_EXECUTABLE(sarg ${SRC})
64 SET_TARGET_PROPERTIES(sarg PROPERTIES VERSION "${sarg_VERSION}.${sarg_REVISION}.${sarg_BUILD}")
66 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "$ENV{CFLAGS} -Wall -Wno-sign-compare")
67 SET_TARGET_PROPERTIES(sarg PROPERTIES LINK_FLAGS "$ENV{LDFLAGS}")
69 CHECK_C_COMPILER_FLAG("-Wextra" 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")
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)
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)
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 CHECK_INCLUDE_FILE(getopt.h HAVE_GETOPT_H)
120 MESSAGE(SEND_ERROR "getopt.h is required to compile sarg")
121 ENDIF(!HAVE_GETOPT_H)
123 # Windows need lib wsock32 and ws2_32
124 IF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
125 CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H)
126 CHECK_INCLUDE_FILE(winsock.h HAVE_WINSOCK_H)
127 CHECK_INCLUDE_FILE(ws2tcpip.h HAVE_WS2TCPIP_H)
129 FIND_LIBRARY(WSOCK_LIB NAMES wsock32 DOC "The winsock library")
131 TARGET_LINK_LIBRARIES(sarg wsock32)
132 LIST(APPEND CMAKE_REQUIRED_LIBRARIES wsock32)
135 FIND_LIBRARY(WSOCK2_LIB NAMES ws2_32 DOC "The winsock 2 library")
137 TARGET_LINK_LIBRARIES(sarg ws2_32)
138 LIST(APPEND CMAKE_REQUIRED_LIBRARIES ws2_32)
141 ADD_DEFINITIONS(-DWINDOWS)
142 ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
144 CHECK_FUNCTION_EXISTS(bzero HAVE_BZERO)
145 CHECK_FUNCTION_EXISTS(backtrace HAVE_BACKTRACE)
146 CHECK_FUNCTION_EXISTS(symlink HAVE_SYMLINK)
147 CHECK_FUNCTION_EXISTS(lstat HAVE_LSTAT)
148 CHECK_FUNCTION_EXISTS(getnameinfo HAVE_GETNAMEINFO)
149 CHECK_FUNCTION_EXISTS(getaddrinfo HAVE_GETADDRINFO)
150 CHECK_FUNCTION_EXISTS(inet_aton HAVE_INET_ATON)
153 CHECK_INCLUDE_FILE(gd.h HAVE_GD_H)
155 CHECK_INCLUDE_FILE(gdfontl.h HAVE_GDFONTL_H)
156 CHECK_INCLUDE_FILE(gdfontt.h HAVE_GDFONTT_H)
157 CHECK_INCLUDE_FILE(gdfonts.h HAVE_GDFONTS_H)
158 CHECK_INCLUDE_FILE(gdfontmb.h HAVE_GDFONTMB_H)
159 CHECK_INCLUDE_FILE(gdfontg.h HAVE_GDFONTG_H)
160 FIND_LIBRARY(GD_LIBRARY NAMES gd bgd DOC "The GD library")
162 #CHECK_LIBRARY_EXISTS(gd gdImagePng "." HAVE_GD_LIB)
163 TARGET_LINK_LIBRARIES(sarg ${GD_LIBRARY})
164 SET(HAVE_GD_LIB GD_LIBRARY CACHE PATH DOC "True IF GD was found")
165 SET(HAVE_GD_LIB CACHE BOOL DOC "True IF must use GD")
170 OPTION(ENABLE_ICONV "Enable the usage of iconv" ON)
172 CHECK_INCLUDE_FILE(iconv.h HAVE_ICONV_H)
174 FIND_PATH(ICONV_INCLUDE_PATH NAMES iconv.h)
175 FIND_LIBRARY(ICONV_LIBRARY NAMES iconv DOC "The ICONV library")
177 TARGET_LINK_LIBRARIES(sarg ${ICONV_LIBRARY})
179 CHECK_FUNCTION_EXISTS(iconv_open HAVE_ICONV)
181 IF(NOT USE_CONST_ICONV)
182 SET(ICONV_CONST_FILE ${CMAKE_BINARY_DIR}/consticonv.c)
183 FILE(WRITE ${ICONV_CONST_FILE} "
190 int main(int ac, char*av[]){
192 iconv_t localtoutf=(iconv_t)-1;
193 const char *str=\"\";
195 size_t slen=0, sslen=0;
197 iconv (localtoutf, (const char **)&str, &slen, &sstr, &sslen);
205 TRY_COMPILE(USE_CONST_ICONV ${CMAKE_BINARY_DIR} ${ICONV_CONST_FILE} CMAKE_FLAGS -DLINK_LIBRARIES="iconv")
206 FILE(REMOVE ${ICONV_CONST_FILE})
208 SET(ICONV_CONST "const" CACHE STRING "The type of char to use with iconv")
209 MESSAGE(STATUS "iconv requires const char **")
210 ELSEIF(USE_CONST_ICONV)
211 SET(ICONV_CONST "" CACHE STRING "The type of char to use with iconv")
212 MESSAGE(STATUS "iconv requires char **")
213 ENDIF(USE_CONST_ICONV)
214 SET(USE_CONST_ICONV TRUE CACHE BOOL "Use const char ** with iconv")
215 ENDIF(NOT USE_CONST_ICONV)
220 CHECK_INCLUDE_FILE(ldap.h HAVE_LDAP_H)
222 FIND_LIBRARY(LDAP_LIBRARY NAMES ldap DOC "The ldap library")
224 TARGET_LINK_LIBRARIES(sarg ${LDAP_LIBRARY})
225 SET(HAVE_LDAP LDAP_LIBRARY CACHE PATH DOC "True if LDAP was found")
226 SET(HAVE_LDAP CACHE BOOL DOC "True if must use LDAP")
230 # Support for large files
231 OPTION(ENABLE_LARGEFILE "Enable the usage of large files" ON)
233 IF(LFS_SEARCHED MATCHES "^LFS_SEARCHED$")
234 SET(SEARCH_LARGEFILE TRUE)
235 ENDIF(LFS_SEARCHED MATCHES "^LFS_SEARCHED$")
236 ENDIF(ENABLE_LARGEFILE)
239 SET(LFS_SEARCHED TRUE CACHE INTERNAL "LFS has been searched")
240 MESSAGE(STATUS "Looking for large file support")
241 SET(LFS_FILE "${CMAKE_BINARY_DIR}/lfsfopen64.c")
242 FILE(WRITE ${LFS_FILE} "
246 FILE *f = fopen64 (\"/tmp/foo\",\"r\");
250 TRY_COMPILE(HAVE_FOPEN64 ${CMAKE_BINARY_DIR} ${LFS_FILE} COMPILE_DEFINITIONS "-Wall -Werror")
252 MESSAGE(STATUS "Looking for large file support - found")
254 SET(LFS_NEED_DEFINE FALSE CACHE BOOL "Does LFS require _LARGEFILE64_SOURCE ?")
255 MESSAGE(STATUS "Looking for large file support with _LARGEFILE64_SOURCE")
256 FILE(WRITE ${LFS_FILE} "
257 #define _LARGEFILE64_SOURCE
261 FILE *f = fopen64 (\"/tmp/foo\",\"r\");
265 TRY_COMPILE(HAVE_FOPEN64 ${CMAKE_BINARY_DIR} ${LFS_FILE} OUTPUT_VARIABLE LFS_OUTPUT)
267 MESSAGE(STATUS "Looking for large file support with _LARGEFILE64_SOURCE - found")
268 SET(LFS_NEED_DEFINE TRUE CACHE BOOL "Does LFS require _LARGEFILE64_SOURCE ?" FORCE)
270 MESSAGE("Failed with output ${LFS_OUTPUT}")
273 FILE(REMOVE ${LFS_FILE})
274 ENDIF(SEARCH_LARGEFILE)
277 ADD_DEFINITIONS(-D_LARGEFILE64_SOURCE)
278 ENDIF(LFS_NEED_DEFINE)
281 IF(HAVE_SYS_RESOURCE_H)
282 SET(CMAKE_EXTRA_INCLUDE_FILES "sys/resource.h")
283 ENDIF(HAVE_SYS_RESOURCE_H)
284 CHECK_TYPE_SIZE(rlim_t RLIM_T)
286 IF(RLIM_T STREQUAL 4)
287 SET(RLIM_STRING "%d")
288 ELSEIF(RLIM_T STREQUAL 8)
289 SET(RLIM_STRING "%lli")
290 ELSE(RLIM_T STREQUAL 4)
291 MESSAGE("Unknown rlim_t size")
292 ENDIF(RLIM_T STREQUAL 4)
294 # MESSAGE("Cannot detect the size of your system's rlim_t type")
297 CHECK_FUNCTION_EXISTS(mkstemp HAVE_MKSTEMP)
299 # MingW provide mkstemps in libiberty but doesn't declare it in any header file
300 FIND_LIBRARY(IBERTY_LIB NAMES iberty DOC "The library of mingw containing mkstemps")
302 TARGET_LINK_LIBRARIES(sarg iberty)
304 ENDIF(NOT HAVE_MKSTEMP)
306 # Gettext and friends
307 IF(NOT HAVE_LC_MESSAGES)
310 LIST(APPEND FILES "locale.h")
313 LIST(APPEND FILES "libintl.h")
314 ENDIF(HAVE_LIBINTL_H)
315 LIST(LENGTH FILES NFILES)
317 CHECK_SYMBOL_EXISTS(LC_MESSAGES "${FILES}" HAVE_LC_MESSAGES)
318 ENDIF(NFILES GREATER 0)
319 ENDIF(NOT HAVE_LC_MESSAGES)
321 # System particularities
322 IF(CMAKE_SYSTEM_NAME STREQUAL "solaris")
323 TARGET_LINK_LIBRARIES(sarg socket nsl)
324 #SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_DEFINITIONS="-DSOLARIS ${COMPILE_DEFINITIONS}")
325 ADD_DEFINITIONS(-DSOLARIS)
326 ENDIF(CMAKE_SYSTEM_NAME STREQUAL "solaris")
328 OPTION(ENABLE_EXTRA_PROTECT "Enable compile and runtime extra protections" OFF)
329 IF(ENABLE_EXTRA_PROTECT)
330 GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS)
331 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -fstack-protector -D_FORTIFY_SOURCE=2 -Werror")
332 CHECK_C_COMPILER_FLAG("-Wformat -Werror=format-security" HAVE_WERROR_FORMAT_SECURITY)
333 IF(HAVE_WERROR_FORMAT_SECURITY)
334 GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS)
335 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -Wformat -Werror=format-security")
336 ENDIF(HAVE_WERROR_FORMAT_SECURITY)
337 ENDIF(ENABLE_EXTRA_PROTECT)
339 # Compile sarg for debugging
340 OPTION(ENABLE_DEBUG "Compile sarg with debugging symbols" OFF)
342 GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS)
343 SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -g")
346 # Enable double check of the data written in the reports
347 OPTION(ENABLE_DOUBLE_CHECK_DATA "Make sarg double check the data it manipulates and output a warning if an error is found" OFF)
349 # Save the configuration for the project
350 CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/include/config.h.in" "${CMAKE_BINARY_DIR}/config.h" @ONLY)
352 # Installation of the project
353 INSTALL(TARGETS sarg DESTINATION "${BINDIR}")
354 INSTALL(FILES sarg.conf DESTINATION "${SYSCONFDIR}" RENAME sarg.conf.exemple)
355 INSTALL(FILES exclude_codes user_limit_block css.tpl DESTINATION "${SYSCONFDIR}")
356 INSTALL(FILES sarg.1 DESTINATION "${MANDIR}")
357 INSTALL(DIRECTORY languages/ DESTINATION "${LANGDIR}" PATTERN ".svn" EXCLUDE)
358 INSTALL(DIRECTORY images/ DESTINATION "${IMAGEDIR}" PATTERN ".svn" EXCLUDE)
359 INSTALL(DIRECTORY fonts/ DESTINATION "${FONTDIR}" FILES_MATCHING PATTERN "*.ttf" PATTERN ".svn" EXCLUDE)
360 INSTALL(DIRECTORY sarg-php/ DESTINATION "${SARGPHPDIR}" PATTERN ".svn" EXCLUDE)
363 SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Squid Analysis Report Generator")
364 SET(CPACK_PACKAGE_VERSION_MAJOR "${sarg_VERSION}")
365 SET(CPACK_PACKAGE_VERSION_MINOR "${sarg_REVISION}")
366 SET(CPACK_PACKAGE_VERSION_PATCH "${sarg_BUILD}")
367 SET(CPACK_GENERATOR TGZ)
368 SET(CPACK_SOURCE_GENERATOR TGZ)
369 SET(CPACK_SOURCE_IGNORE_FILES "/.svn/" "/debian/" "/html/" "Makefile$" "config\\\\.log$" "config\\\\.status$" ".*~$" "\\\\.o$")