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