CMAKE_MINIMUM_REQUIRED (VERSION 2.6) PROJECT(sarg C) SET(sarg_VERSION 2) SET(sarg_REVISION "3rc1") SET(sarg_BUILD "") SET(sarg_BUILDDATE "Mar-08-2010") INCLUDE(AddFileDependencies) INCLUDE(CheckIncludeFile) INCLUDE(CheckLibraryExists) INCLUDE(CheckFunctionExists) INCLUDE(CheckTypeSize) INCLUDE(CheckSymbolExists) INCLUDE(CheckCCompilerFlag) DEFINE_PROPERTY(GLOBAL PROPERTY enable-htmldir BRIEF_DOCS "--enable-htmldir=htmldir" FULL_DOCS "Select htmldir as the root of your WWW documents") SET(PACKAGE_NAME "sarg") SET(PACKAGE_VERSION "${sarg_VERSION}.${sarg_REVISION}${sarg_BUILD}") MACRO(SET_ABS_SOURCE VAR DOC) IF(${VAR} AND NOT ${VAR}_SOURCE) SET(PATH "${${VAR}}") IF(NOT IS_ABSOLUTE ${PATH}) SET(PATH "${CMAKE_INSTALL_PREFIX}/${PATH}") ENDIF(NOT IS_ABSOLUTE ${PATH}) GET_FILENAME_COMPONENT(SOURCE_PATH "${PATH}" ABSOLUTE) SET(${VAR}_SOURCE "${SOURCE_PATH}" CACHE PATH "${DOC}") ENDIF(${VAR} AND NOT ${VAR}_SOURCE) ENDMACRO(SET_ABS_SOURCE VAR DOC) SET_ABS_SOURCE(SYSCONFDIR "The full path of the configuration directory to be compiled in the program") SET_ABS_SOURCE(LANGDIR "The full path of the language directory to be compiled in the program") SET_ABS_SOURCE(FONTDIR "The full path of the fonts directory to be compiled in the program") SET_ABS_SOURCE(IMAGEDIR "The full path of the images directory to be compiled in the program") SET(SYSCONFDIR "etc/sarg" CACHE PATH "The configuration directory relative to the install directory") SET(BINDIR "bin" CACHE PATH "The directory to install the exec relative to the install directory") SET(MANDIR "share/man" CACHE PATH "The directory to copy the man page relative to the install directory") SET(LANGDIR "share/sarg/languages" CACHE PATH "The directory to copy the languages files relative to the install directory") SET(FONTDIR "share/sarg/fonts" CACHE PATH "The directory to copy the fonts relative to the install directory") SET(IMAGEDIR "share/sarg/images" CACHE PATH "The directory to copy the images files relative to the install directory") SET(SARGPHPDIR "share/sarg/sarg-php" CACHE PATH "The directory to copy sarg-php relative to the install directory") # Sources to compile INCLUDE_DIRECTORIES("${CMAKE_BINARY_DIR}") #Make it find this config.h before the one in src/include INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/include") SET(SRC util.c log.c report.c topuser.c email.c sort.c html.c totger.c index.c getconf.c usage.c decomp.c ip2name.c useragent.c exclude.c convlog.c totday.c repday.c datafile.c indexonly.c splitlog.c lastlog.c topsites.c siteuser.c css.c smartfilter.c denied.c authfail.c charset.c squidguard_log.c squidguard_report.c auth.c download.c grepday.c dansguardian_log.c dansguardian_report.c realtime.c btree_cache.c usertab.c userinfo.c) FOREACH(f ${SRC}) 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) ENDFOREACH(f) ADD_EXECUTABLE(sarg ${SRC}) SET_TARGET_PROPERTIES(sarg PROPERTIES VERSION "${sarg_VERSION}.${sarg_REVISION}.${sarg_BUILD}") SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "$ENV{CFLAGS} -Wall -Wno-sign-compare") SET_TARGET_PROPERTIES(sarg PROPERTIES LINK_FLAGS "$ENV{LDFLAGS}") CHECK_C_COMPILER_FLAG("-Wextra" HAVE_WEXTRA) IF(HAVE_WEXTRA) # Not supported by gcc 3.3 GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS) SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -Wextra -Wno-unused-parameter") ENDIF(HAVE_WEXTRA) CHECK_C_COMPILER_FLAG("-Werror=implicit-function-declaration" HAVE_WERROR_IMPLICIT_FUNCTION) IF(HAVE_WERROR_IMPLICIT_FUNCTION) GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS) SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -Werror=implicit-function-declaration") ENDIF(HAVE_WERROR_IMPLICIT_FUNCTION) CHECK_C_COMPILER_FLAG("-Werror=format" HAVE_WERROR_FORMAT) IF(HAVE_WERROR_FORMAT) GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS) SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -Werror=format") ENDIF(HAVE_WERROR_FORMAT) # Required header files CHECK_INCLUDE_FILE(stdio.h HAVE_STDIO_H) CHECK_INCLUDE_FILE(stdlib.h HAVE_STDLIB_H) CHECK_INCLUDE_FILE(string.h HAVE_STRING_H) CHECK_INCLUDE_FILE(strings.h HAVE_STRINGS_H) CHECK_INCLUDE_FILE(sys/time.h HAVE_SYS_TIME_H) CHECK_INCLUDE_FILE(time.h HAVE_TIME_H) CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H) CHECK_INCLUDE_FILE(sys/dirent.h HAVE_SYS_DIRENT_H) CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H) CHECK_INCLUDE_FILE(sys/socket.h HAVE_SYS_SOCKET_H) CHECK_INCLUDE_FILE(netdb.h HAVE_NETDB_H) CHECK_INCLUDE_FILE(arpa/inet.h HAVE_ARPA_INET_H) CHECK_INCLUDE_FILE(sys/types.h HAVE_SYS_TYPES_H) CHECK_INCLUDE_FILE(netinet/in.h HAVE_NETINET_H) CHECK_INCLUDE_FILE(sys/stat.h HAVE_SYS_STAT_H) CHECK_INCLUDE_FILE(ctype.h HAVE_CTYPE_H) CHECK_INCLUDE_FILE(errno.h HAVE_ERRNO_H) CHECK_INCLUDE_FILE(sys/resource.h HAVE_SYS_RESOURCE_H) CHECK_INCLUDE_FILE(sys/wait.h HAVE_SYS_WAIT_H) CHECK_INCLUDE_FILE(stdarg.h HAVE_STDARG_H) CHECK_INCLUDE_FILE(inttypes.h HAVE_INTTYPES_H) CHECK_INCLUDE_FILE(limits.h HAVE_LIMITS_H) CHECK_INCLUDE_FILE(math.h HAVE_MATH_H) CHECK_INCLUDE_FILE(locale.h HAVE_LOCALE_H) CHECK_INCLUDE_FILE(execinfo.h HAVE_EXECINFO_H) CHECK_INCLUDE_FILE(libintl.h HAVE_LIBINTL_H) CHECK_INCLUDE_FILE(libgen.h HAVE_LIBGEN_H) CHECK_FUNCTION_EXISTS(bzero HAVE_BZERO) CHECK_FUNCTION_EXISTS(backtrace HAVE_BACKTRACE) CHECK_FUNCTION_EXISTS(symlink HAVE_SYMLINK) CHECK_FUNCTION_EXISTS(lstat HAVE_LSTAT) CHECK_FUNCTION_EXISTS(getnameinfo HAVE_GETNAMEINFO) # Find gd CHECK_INCLUDE_FILE(gd.h HAVE_GD_H) IF(HAVE_GD_H) CHECK_INCLUDE_FILE(gdfontl.h HAVE_GDFONTL_H) CHECK_INCLUDE_FILE(gdfontt.h HAVE_GDFONTT_H) CHECK_INCLUDE_FILE(gdfonts.h HAVE_GDFONTS_H) CHECK_INCLUDE_FILE(gdfontmb.h HAVE_GDFONTMB_H) CHECK_INCLUDE_FILE(gdfontg.h HAVE_GDFONTG_H) FIND_LIBRARY(GD_LIBRARY NAMES gd bgd DOC "The GD library") IF(GD_LIBRARY) #CHECK_LIBRARY_EXISTS(gd gdImagePng "." HAVE_GD) TARGET_LINK_LIBRARIES(sarg ${GD_LIBRARY}) SET(HAVE_GD GD_LIBRARY CACHE PATH DOC "True IF GD was found") SET(HAVE_GD CACHE BOOL DOC "True IF must use GD") ENDIF(GD_LIBRARY) ENDIF(HAVE_GD_H) # Find iconv OPTION(ENABLE_ICONV "Enable the usage of iconv" ON) IF(ENABLE_ICONV) CHECK_INCLUDE_FILE(iconv.h HAVE_ICONV_H) IF(HAVE_ICONV_H) FIND_PATH(ICONV_INCLUDE_PATH NAMES iconv.h) FIND_LIBRARY(ICONV_LIBRARY NAMES iconv DOC "The ICONV library") IF(ICONV_LIBRARY) TARGET_LINK_LIBRARIES(sarg ${ICONV_LIBRARY}) ENDIF(ICONV_LIBRARY) CHECK_FUNCTION_EXISTS(iconv_open HAVE_ICONV) SET(ICONV_CONST_FILE ${CMAKE_BINARY_DIR}/consticonv.c) FILE(WRITE ${ICONV_CONST_FILE} " #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ") TRY_COMPILE(USE_CONST_ICONV ${CMAKE_BINARY_DIR} ${ICONV_CONST_FILE}) FILE(REMOVE ${ICONV_CONST_FILE}) IF(USE_CONST_ICONV) SET(ICONV_CONST "\"const\"") ENDIF(USE_CONST_ICONV) ENDIF(HAVE_ICONV_H) ENDIF(ENABLE_ICONV) # Find ldap CHECK_INCLUDE_FILE(ldap.h HAVE_LDAP_H) IF(HAVE_LDAP_H) FIND_LIBRARY(LDAP_LIBRARY NAMES ldap DOC "The ldap library") IF(LDAP_LIBRARY) TARGET_LINK_LIBRARIES(sarg ${LDAP_LIBRARY}) SET(HAVE_LDAP LDAP_LIBRARY CACHE PATH DOC "True if LDAP was found") SET(HAVE_LDAP CACHE BOOL DOC "True if must use LDAP") ENDIF(LDAP_LIBRARY) ENDIF(HAVE_LDAP_H) # Support for large files OPTION(ENABLE_LARGEFILE "Enable the usage of large files" ON) IF(ENABLE_LARGEFILE) IF(LFS_SEARCHED MATCHES "^LFS_SEARCHED$") SET(SEARCH_LARGEFILE TRUE) ENDIF(LFS_SEARCHED MATCHES "^LFS_SEARCHED$") ENDIF(ENABLE_LARGEFILE) IF(SEARCH_LARGEFILE) SET(LFS_SEARCHED TRUE CACHE INTERNAL "LFS has been searched") MESSAGE(STATUS "Looking for large file support") SET(LFS_FILE "${CMAKE_BINARY_DIR}/lfsfopen64.c") FILE(WRITE ${LFS_FILE} " #include int main(void) { FILE *f = fopen64 (\"/tmp/foo\",\"r\"); return(0); } ") TRY_COMPILE(HAVE_FOPEN64 ${CMAKE_BINARY_DIR} ${LFS_FILE} COMPILE_DEFINITIONS "-Wall -Werror") IF(HAVE_FOPEN64) MESSAGE(STATUS "Looking for large file support - found") ELSE(HAVE_FOPEN64) SET(LFS_NEED_DEFINE FALSE CACHE BOOL "Does LFS require _LARGEFILE64_SOURCE ?") MESSAGE(STATUS "Looking for large file support with _LARGEFILE64_SOURCE") FILE(WRITE ${LFS_FILE} " #define _LARGEFILE64_SOURCE #include int main(void) { FILE *f = fopen64 (\"/tmp/foo\",\"r\"); return(0); } ") TRY_COMPILE(HAVE_FOPEN64 ${CMAKE_BINARY_DIR} ${LFS_FILE} OUTPUT_VARIABLE LFS_OUTPUT) IF(HAVE_FOPEN64) MESSAGE(STATUS "Looking for large file support with _LARGEFILE64_SOURCE - found") SET(LFS_NEED_DEFINE TRUE CACHE BOOL "Does LFS require _LARGEFILE64_SOURCE ?" FORCE) ELSE(HAVE_FOPEN64) MESSAGE("Failed with output ${LFS_OUTPUT}") ENDIF(HAVE_FOPEN64) ENDIF(HAVE_FOPEN64) FILE(REMOVE ${LFS_FILE}) ENDIF(SEARCH_LARGEFILE) IF(LFS_NEED_DEFINE) ADD_DEFINITIONS(-D_LARGEFILE64_SOURCE) ENDIF(LFS_NEED_DEFINE) # Find rlim_t IF(HAVE_SYS_RESOURCE_H) SET(CMAKE_EXTRA_INCLUDE_FILES "sys/resource.h") ENDIF(HAVE_SYS_RESOURCE_H) CHECK_TYPE_SIZE(rlim_t RLIM_T) IF(HAVE_RLIM_T) IF(RLIM_T STREQUAL 4) SET(RLIM_STRING "%d") ELSEIF(RLIM_T STREQUAL 8) SET(RLIM_STRING "%lli") ELSE(RLIM_T STREQUAL 4) MESSAGE("Unknown rlim_t size") ENDIF(RLIM_T STREQUAL 4) #ELSE(HAVE_RLIM_T) # MESSAGE("Cannot detect the size of your system's rlim_t type") ENDIF(HAVE_RLIM_T) # Windows need lib wsock32 IF(CMAKE_SYSTEM_NAME STREQUAL "Windows") CHECK_INCLUDE_FILE(windows.h HAVE_WINDOWS_H) CHECK_INCLUDE_FILE(winsock.h HAVE_WINSOCK_H) FIND_LIBRARY(WSOCK_LIB NAMES wsock32 DOC "The winsock library") #check_library_exists(wsock32 "." HAVE_WSOCK) IF(WSOCK_LIB) #set_target_properties(sarg PROPERTIES LINK_FLAGS "${LINK_FLAGS} -lwsock32") TARGET_LINK_LIBRARIES(sarg wsock32) ENDIF(WSOCK_LIB) ADD_DEFINITIONS(-DWINDOWS) ENDIF(CMAKE_SYSTEM_NAME STREQUAL "Windows") CHECK_FUNCTION_EXISTS(mkstemp HAVE_MKSTEMP) IF(NOT HAVE_MKSTEMP) # MingW provide mkstemps in libiberty but doesn't declare it in any header file FIND_LIBRARY(IBERTY_LIB NAMES iberty DOC "The library of mingw containing mkstemps") IF(IBERTY_LIB) TARGET_LINK_LIBRARIES(sarg iberty) ENDIF(IBERTY_LIB) ENDIF(NOT HAVE_MKSTEMP) # Gettext and friends IF(NOT HAVE_LC_MESSAGES) SET(FILES) IF(HAVE_LOCALE_H) LIST(APPEND FILES "locale.h") ENDIF(HAVE_LOCALE_H) IF(HAVE_LIBINTL_H) LIST(APPEND FILES "libintl.h") ENDIF(HAVE_LIBINTL_H) LIST(LENGTH FILES NFILES) IF(NFILES GREATER 0) CHECK_SYMBOL_EXISTS(LC_MESSAGES "${FILES}" HAVE_LC_MESSAGES) ENDIF(NFILES GREATER 0) ENDIF(NOT HAVE_LC_MESSAGES) # System particularities IF(CMAKE_SYSTEM_NAME STREQUAL "solaris") TARGET_LINK_LIBRARIES(sarg socket nsl) #SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_DEFINITIONS="-DSOLARIS ${COMPILE_DEFINITIONS}") ADD_DEFINITIONS(-DSOLARIS) ENDIF(CMAKE_SYSTEM_NAME STREQUAL "solaris") OPTION(ENABLE_EXTRA_PROTECT "Enable compile and runtime extra protections" OFF) IF(ENABLE_EXTRA_PROTECT) GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS) SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -fstack-protector -D_FORTIFY_SOURCE=2 -Werror") CHECK_C_COMPILER_FLAG("-Wformat -Werror=format-security" HAVE_WERROR_FORMAT_SECURITY) IF(HAVE_WERROR_FORMAT_SECURITY) GET_TARGET_PROPERTY(TMPCFLAGS sarg COMPILE_FLAGS) SET_TARGET_PROPERTIES(sarg PROPERTIES COMPILE_FLAGS "${TMPCFLAGS} -Wformat -Werror=format-security") ENDIF(HAVE_WERROR_FORMAT_SECURITY) ENDIF(ENABLE_EXTRA_PROTECT) # Save the configuration for the project CONFIGURE_FILE("${CMAKE_SOURCE_DIR}/include/config.h.in" "${CMAKE_BINARY_DIR}/config.h" @ONLY) # Installation of the project INSTALL(TARGETS sarg DESTINATION "${BINDIR}") INSTALL(FILES sarg.conf DESTINATION "${SYSCONFDIR}" RENAME sarg.conf.exemple) INSTALL(FILES exclude_codes user_limit_block css.tpl DESTINATION "${SYSCONFDIR}") INSTALL(FILES sarg.1 DESTINATION "${MANDIR}") INSTALL(DIRECTORY languages/ DESTINATION "${LANGDIR}" PATTERN ".svn" EXCLUDE) INSTALL(DIRECTORY images/ DESTINATION "${IMAGEDIR}" PATTERN ".svn" EXCLUDE) INSTALL(DIRECTORY fonts/ DESTINATION "${FONTDIR}" FILES_MATCHING PATTERN "*.ttf" PATTERN ".svn" EXCLUDE) INSTALL(DIRECTORY sarg-php/ DESTINATION "${SARGPHPDIR}" PATTERN ".svn" EXCLUDE) # Package creation SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Squid Analysis Report Generator") SET(CPACK_PACKAGE_VERSION_MAJOR "${sarg_VERSION}") SET(CPACK_PACKAGE_VERSION_MINOR "${sarg_REVISION}") SET(CPACK_PACKAGE_VERSION_PATCH "${sarg_BUILD}") SET(CPACK_GENERATOR TGZ) SET(CPACK_SOURCE_GENERATOR TGZ) SET(CPACK_SOURCE_IGNORE_FILES "/.svn/" "/debian/" "/html/" "Makefile$" "config\\\\.log$" "config\\\\.status$" ".*~$" "\\\\.o$") INCLUDE(CPack)