1 CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
4 SET(sarg_REVISION "3rc1")
6 SET(sarg_BUILDDATE "Mar-16-2010")
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 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)
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)
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)
125 CHECK_INCLUDE_FILE(gd.h 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")
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")
142 OPTION(ENABLE_ICONV "Enable the usage of iconv" ON)
144 CHECK_INCLUDE_FILE(iconv.h HAVE_ICONV_H)
146 FIND_PATH(ICONV_INCLUDE_PATH NAMES iconv.h)
147 FIND_LIBRARY(ICONV_LIBRARY NAMES iconv DOC "The ICONV library")
149 TARGET_LINK_LIBRARIES(sarg ${ICONV_LIBRARY})
151 CHECK_FUNCTION_EXISTS(iconv_open HAVE_ICONV)
153 SET(ICONV_CONST_FILE ${CMAKE_BINARY_DIR}/consticonv.c)
154 FILE(WRITE ${ICONV_CONST_FILE} "
161 #if defined(__STDC__) || defined(__cplusplus)
162 size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
167 TRY_COMPILE(USE_CONST_ICONV ${CMAKE_BINARY_DIR} ${ICONV_CONST_FILE})
168 FILE(REMOVE ${ICONV_CONST_FILE})
170 SET(ICONV_CONST "\"const\"")
171 ENDIF(USE_CONST_ICONV)
176 CHECK_INCLUDE_FILE(ldap.h HAVE_LDAP_H)
178 FIND_LIBRARY(LDAP_LIBRARY NAMES ldap DOC "The 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")
186 # Support for large files
187 OPTION(ENABLE_LARGEFILE "Enable the usage of large files" ON)
189 IF(LFS_SEARCHED MATCHES "^LFS_SEARCHED$")
190 SET(SEARCH_LARGEFILE TRUE)
191 ENDIF(LFS_SEARCHED MATCHES "^LFS_SEARCHED$")
192 ENDIF(ENABLE_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} "
202 FILE *f = fopen64 (\"/tmp/foo\",\"r\");
206 TRY_COMPILE(HAVE_FOPEN64 ${CMAKE_BINARY_DIR} ${LFS_FILE} COMPILE_DEFINITIONS "-Wall -Werror")
208 MESSAGE(STATUS "Looking for large file support - found")
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
217 FILE *f = fopen64 (\"/tmp/foo\",\"r\");
221 TRY_COMPILE(HAVE_FOPEN64 ${CMAKE_BINARY_DIR} ${LFS_FILE} OUTPUT_VARIABLE LFS_OUTPUT)
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)
226 MESSAGE("Failed with output ${LFS_OUTPUT}")
229 FILE(REMOVE ${LFS_FILE})
230 ENDIF(SEARCH_LARGEFILE)
233 ADD_DEFINITIONS(-D_LARGEFILE64_SOURCE)
234 ENDIF(LFS_NEED_DEFINE)
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)
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)
250 # MESSAGE("Cannot detect the size of your system's rlim_t type")
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)
260 #set_target_properties(sarg PROPERTIES LINK_FLAGS "${LINK_FLAGS} -lwsock32")
261 TARGET_LINK_LIBRARIES(sarg wsock32)
263 ADD_DEFINITIONS(-DWINDOWS)
264 ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
266 CHECK_FUNCTION_EXISTS(mkstemp 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")
271 TARGET_LINK_LIBRARIES(sarg iberty)
273 ENDIF(NOT HAVE_MKSTEMP)
275 # Gettext and friends
276 IF(NOT HAVE_LC_MESSAGES)
279 LIST(APPEND FILES "locale.h")
282 LIST(APPEND FILES "libintl.h")
283 ENDIF(HAVE_LIBINTL_H)
284 LIST(LENGTH FILES NFILES)
286 CHECK_SYMBOL_EXISTS(LC_MESSAGES "${FILES}" HAVE_LC_MESSAGES)
287 ENDIF(NFILES GREATER 0)
288 ENDIF(NOT HAVE_LC_MESSAGES)
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")
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)
308 # Save the configuration for the project
309 CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/include/config.h.in" "${CMAKE_BINARY_DIR}/config.h" @ONLY)
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)
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$")