diff --git a/.gitignore b/.gitignore index b4a9a43..69b7320 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,13 @@ fserv.includes debug/ release/ scratch-space/ + +src/cmake_config.hpp + +CMakeCache.txt +CMakeFiles +CMakeScripts +Makefile +*.cmake +install_manifest.txt +/cotire diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..2fb9de6 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "cmake_modules/cotire"] + path = cmake_modules/cotire + url = https://github.com/sakra/cotire.git diff --git a/.travis.yml b/.travis.yml index 016ef02..7162939 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,12 @@ language: cpp compiler: clang +dist: trusty before-install: - sudo apt-get update install: - - sudo apt-get install libev-dev libgoogle-perftools-dev libhiredis-dev libicu-dev libcurl4-openssl-dev libboost-dev libluajit-5.1-dev libpth-dev uuid-dev + - sudo apt-get install -qq libev-dev libgoogle-perftools-dev libhiredis-dev libicu-dev libcurl4-openssl-dev libboost-dev libluajit-5.1-dev libpth-dev uuid-dev # Get libjansson version 2.5, the one in Ubuntu 12.04's repos is way outdated. - cd ~/build @@ -23,7 +24,7 @@ install: # Fetch and build evHTTPClient - cd ~/build - - git clone https://github.com/jspotter/evhttpclient + - git clone https://github.com/larsven/evhttpclient - cd evhttpclient - make - sudo cp *.h /usr/include @@ -31,5 +32,7 @@ install: script: # Finally, build fserv. - - cd ~/build/f-list/fserv - - make all + - cd $HOME/build/$TRAVIS_REPO_SLUG + - mkdir build && cd build + - cmake .. + - make diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..863e3ab --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,118 @@ +cmake_minimum_required(VERSION 2.8.7) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake_modules") + + +## compiler flags + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fno-strict-aliasing -Werror") + + +project(fserv) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY release) + +find_package(Threads REQUIRED) + +find_package(LibEV REQUIRED) +find_package(LuaJIT REQUIRED) +find_package(Glog REQUIRED) +find_package(tcmalloc REQUIRED) +find_package(libjansson REQUIRED) +find_package(Hiredis REQUIRED) +find_package(ICU REQUIRED) +find_package(CURL REQUIRED) +find_package(Evhttpclient REQUIRED) +find_package(Boost REQUIRED) + +include_directories( + "${LUAJIT_INCLUDE_DIR}" + "${LIBEV_INCLUDE_DIR}" + "${GLOG_INCLUDE_DIR}" + "${Tcmalloc_INCLUDE_DIR}" + "${JANSSON_INCLUDE_DIR}" + "${LIBHIREDIS_INCLUDE_DIR}" + "${ICU_INCLUDE_DIRS}" + "${CURL_INCLUDE_DIR}" + "${EVHTTPCLIENT_INCLUDE_DIR}" + "${Boost_INCLUDE_DIRS}") + + +## compatibility for pre-2.0 gperftools + +find_file(HAVE_NEW_TCMALLOC gperftools/malloc_extension.h ${Tcmalloc_INCLUDE_DIR} NO_DEFAULT_PATH) + + +## generate the build config file + +configure_file(src/cmake_config.hpp.in "${CMAKE_SOURCE_DIR}/src/cmake_config.hpp") + + +## fserv binary + +set(fserv_SOURCES + src/channel.cpp + src/connection.cpp + src/fserv.cpp + src/login_evhttp.cpp + src/lua_channel.cpp + src/lua_chat.cpp + src/lua_connection.cpp + src/lua_constants.cpp + src/messagebuffer.cpp + src/native_command.cpp + src/redis.cpp + src/server.cpp + src/server_state.cpp + src/startup_config.cpp + src/unicode_tools.cpp + src/websocket.cpp + src/base64.cpp + src/md5.cpp + src/modp_b64.cpp + src/sha1.cpp) + +set(fserv_LIBS ${fserv_LIBS} + "${CMAKE_THREAD_LIBS_INIT}" + "${LUAJIT_LIBRARIES}" + "${LIBEV_LIBRARIES}" + "${GLOG_LIBRARY}" + "${Tcmalloc_LIBRARY}" + "${JANSSON_LIBRARY}" + "${LIBHIREDIS_LIBRARIES}" + "${ICU_LIBRARIES}" + "${CURL_LIBRARY}" + "${EVHTTPCLIENT_LIBRARY}") + +add_executable(fserv ${fserv_SOURCES}) +target_link_libraries(fserv ${fserv_LIBS}) + +if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/cmake_modules/cotire/CMake") + message("## Found cotire; using precompiled header") + set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake_modules/cotire/CMake") + include(cotire) + set_target_properties(fserv PROPERTIES COTIRE_CXX_PREFIX_HEADER_INIT "src/precompiled_headers.hpp") + cotire(fserv) +else() + message("## Could not find cotire; not using precompiled header") + message("## If you've cloned from git, run `git submodule init && git submodule update` to fetch cotire") +endif() + + +## facceptor binary + +set(facceptor_SOURCES + src/facceptor.cpp) + +set(facceptor_LIBS + "${LIBEV_LIBRARIES}") + +add_executable(facceptor ${facceptor_SOURCES}) +target_link_libraries(facceptor ${facceptor_LIBS}) + + +## copy scripts over to the release dir +add_custom_command( + TARGET fserv POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory + ${CMAKE_SOURCE_DIR}/script ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/script + + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/logs) diff --git a/Makefile b/Makefile deleted file mode 100644 index 45d25d3..0000000 --- a/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -all clean install deploy: - @cd src && ${MAKE} $@ - @cd utils && ${MAKE} $@ - -.PHONY: all clean install deploy diff --git a/cmake_modules/FindEvhttpclient.cmake b/cmake_modules/FindEvhttpclient.cmake new file mode 100644 index 0000000..785b178 --- /dev/null +++ b/cmake_modules/FindEvhttpclient.cmake @@ -0,0 +1,20 @@ +# adapted from Findlibjansson.cmake + +find_path(EVHTTPCLIENT_INCLUDE_DIR evhttpclient.h + PATHS /usr/include +) + +find_library(EVHTTPCLIENT_LIBRARY + NAMES evhttpclient + PATHS /usr/lib /usr/local/lib +) + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(EVHTTPCLIENT + DEFAULT_MSG + EVHTTPCLIENT_INCLUDE_DIR + EVHTTPCLIENT_LIBRARY +) + +include_directories(${EVHTTPCLIENT_INCLUDE_DIR}) diff --git a/cmake_modules/FindGlog.cmake b/cmake_modules/FindGlog.cmake new file mode 100644 index 0000000..cb6829a --- /dev/null +++ b/cmake_modules/FindGlog.cmake @@ -0,0 +1,51 @@ +# taken from Caffe at https://raw.githubusercontent.com/BVLC/caffe/master/cmake/Modules/FindGlog.cmake +# licensed under the same license as Caffe, https://github.com/BVLC/caffe/blob/master/LICENSE + +# - Try to find Glog +# +# The following variables are optionally searched for defaults +# GLOG_ROOT_DIR: Base directory where all GLOG components are found +# +# The following are set after configuration is done: +# GLOG_FOUND +# GLOG_INCLUDE_DIRS +# GLOG_LIBRARIES +# GLOG_LIBRARYRARY_DIRS + +include(FindPackageHandleStandardArgs) + +set(GLOG_ROOT_DIR "" CACHE PATH "Folder contains Google glog") + +if(WIN32) + find_path(GLOG_INCLUDE_DIR glog/logging.h + PATHS ${GLOG_ROOT_DIR}/src/windows) +else() + find_path(GLOG_INCLUDE_DIR glog/logging.h + PATHS ${GLOG_ROOT_DIR}) +endif() + +if(MSVC) + find_library(GLOG_LIBRARY_RELEASE libglog_static + PATHS ${GLOG_ROOT_DIR} + PATH_SUFFIXES Release) + + find_library(GLOG_LIBRARY_DEBUG libglog_static + PATHS ${GLOG_ROOT_DIR} + PATH_SUFFIXES Debug) + + set(GLOG_LIBRARY optimized ${GLOG_LIBRARY_RELEASE} debug ${GLOG_LIBRARY_DEBUG}) +else() + find_library(GLOG_LIBRARY glog + PATHS ${GLOG_ROOT_DIR} + PATH_SUFFIXES lib lib64) +endif() + +find_package_handle_standard_args(Glog DEFAULT_MSG GLOG_INCLUDE_DIR GLOG_LIBRARY) + +if(GLOG_FOUND) + set(GLOG_INCLUDE_DIRS ${GLOG_INCLUDE_DIR}) + set(GLOG_LIBRARIES ${GLOG_LIBRARY}) + message(STATUS "Found glog (include: ${GLOG_INCLUDE_DIR}, library: ${GLOG_LIBRARY})") + mark_as_advanced(GLOG_ROOT_DIR GLOG_LIBRARY_RELEASE GLOG_LIBRARY_DEBUG + GLOG_LIBRARY GLOG_INCLUDE_DIR) +endif() diff --git a/cmake_modules/FindHiredis.cmake b/cmake_modules/FindHiredis.cmake new file mode 100644 index 0000000..34c8e83 --- /dev/null +++ b/cmake_modules/FindHiredis.cmake @@ -0,0 +1,35 @@ +# taken from https://github.com/libgit2/libgit2-backends/blob/master/CMake/FindHiredis.cmake +# license unknown + +# - Try to find the Lib library +# Once done this will define +# +# LIBHIREDIS_FOUND - System has Hiredis +# LIBHIREDIS_INCLUDE_DIR - The Hiredis include directory +# LIBHIREDIS_LIBRARIES - The libraries needed to use Hiredis +# LIBHIREDIS_DEFINITIONS - Compiler switches required for using Hiredis + + +# use pkg-config to get the directories and then use these values +# in the FIND_PATH() and FIND_LIBRARY() calls +#FIND_PACKAGE(PkgConfig) +#PKG_SEARCH_MODULE(PC_LIBHIREDIS libhiredis) + +SET(LIBHIREDIS_DEFINITIONS ${PC_LIBHIREDIS_CFLAGS_OTHER}) + +FIND_PATH(LIBHIREDIS_INCLUDE_DIR hiredis/hiredis.h + HINTS + ${PC_LIBHIREDIS_INCLUDEDIR} + ${PC_LIBHIREDIS_INCLUDE_DIRS} +) + +FIND_LIBRARY(LIBHIREDIS_LIBRARIES NAMES hiredis + HINTS + ${PC_LIBHIREDIS_LIBDIR} + ${PC_LIBHIREDIS_LIBRARY_DIRS} +) + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibHiredis DEFAULT_MSG LIBHIREDIS_LIBRARIES LIBHIREDIS_INCLUDE_DIR) + +#MARK_AS_ADVANCED(LIBHIREDIS_INCLUDE_DIR LIBHIREDIS_LIBRARIES) diff --git a/cmake_modules/FindICU.cmake b/cmake_modules/FindICU.cmake new file mode 100644 index 0000000..cd6bf92 --- /dev/null +++ b/cmake_modules/FindICU.cmake @@ -0,0 +1,314 @@ +# This module can find the International Components for Unicode (ICU) Library +# +# Requirements: +# - CMake >= 2.8.3 (for new version of find_package_handle_standard_args) +# +# The following variables will be defined for your use: +# - ICU_FOUND : were all of your specified components found (include dependencies)? +# - ICU_INCLUDE_DIRS : ICU include directory +# - ICU_LIBRARIES : ICU libraries +# - ICU_VERSION : complete version of ICU (x.y.z) +# - ICU_MAJOR_VERSION : major version of ICU +# - ICU_MINOR_VERSION : minor version of ICU +# - ICU_PATCH_VERSION : patch version of ICU +# - ICU__FOUND : were found? (FALSE for non specified component if it is not a dependency) +# +# For windows or non standard installation, define ICU_ROOT variable to point to the root installation of ICU. Two ways: +# - run cmake with -DICU_ROOT= +# - define an environment variable with the same name before running cmake +# With cmake-gui, before pressing "Configure": +# 1) Press "Add Entry" button +# 2) Add a new entry defined as: +# - Name: ICU_ROOT +# - Type: choose PATH in the selection list +# - Press "..." button and select the root installation of ICU +# +# Example Usage: +# +# 1. Copy this file in the root of your project source directory +# 2. Then, tell CMake to search this non-standard module in your project directory by adding to your CMakeLists.txt: +# set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}) +# 3. Finally call find_package() once, here are some examples to pick from +# +# Require ICU 4.4 or later +# find_package(ICU 4.4 REQUIRED) +# +# if(ICU_FOUND) +# include_directories(${ICU_INCLUDE_DIRS}) +# add_executable(myapp myapp.c) +# target_link_libraries(myapp ${ICU_LIBRARIES}) +# endif(ICU_FOUND) + +#============================================================================= +# Copyright (c) 2011-2013, julp +# +# Distributed under the OSI-approved BSD License +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#============================================================================= + +find_package(PkgConfig QUIET) + +########## Private ########## +if(NOT DEFINED ICU_PUBLIC_VAR_NS) + set(ICU_PUBLIC_VAR_NS "ICU") # Prefix for all ICU relative public variables +endif(NOT DEFINED ICU_PUBLIC_VAR_NS) +if(NOT DEFINED ICU_PRIVATE_VAR_NS) + set(ICU_PRIVATE_VAR_NS "_${ICU_PUBLIC_VAR_NS}") # Prefix for all ICU relative internal variables +endif(NOT DEFINED ICU_PRIVATE_VAR_NS) +if(NOT DEFINED PC_ICU_PRIVATE_VAR_NS) + set(PC_ICU_PRIVATE_VAR_NS "_PC${ICU_PRIVATE_VAR_NS}") # Prefix for all pkg-config relative internal variables +endif(NOT DEFINED PC_ICU_PRIVATE_VAR_NS) + +function(icudebug _VARNAME) + if(${ICU_PUBLIC_VAR_NS}_DEBUG) + if(DEFINED ${ICU_PUBLIC_VAR_NS}_${_VARNAME}) + message("${ICU_PUBLIC_VAR_NS}_${_VARNAME} = ${${ICU_PUBLIC_VAR_NS}_${_VARNAME}}") + else(DEFINED ${ICU_PUBLIC_VAR_NS}_${_VARNAME}) + message("${ICU_PUBLIC_VAR_NS}_${_VARNAME} = ") + endif(DEFINED ${ICU_PUBLIC_VAR_NS}_${_VARNAME}) + endif(${ICU_PUBLIC_VAR_NS}_DEBUG) +endfunction(icudebug) + +set(${ICU_PRIVATE_VAR_NS}_ROOT "") +if(DEFINED ENV{ICU_ROOT}) + set(${ICU_PRIVATE_VAR_NS}_ROOT "$ENV{ICU_ROOT}") +endif(DEFINED ENV{ICU_ROOT}) +if (DEFINED ICU_ROOT) + set(${ICU_PRIVATE_VAR_NS}_ROOT "${ICU_ROOT}") +endif(DEFINED ICU_ROOT) + +set(${ICU_PRIVATE_VAR_NS}_BIN_SUFFIXES ) +set(${ICU_PRIVATE_VAR_NS}_LIB_SUFFIXES ) +if(CMAKE_SIZEOF_VOID_P EQUAL 8) + list(APPEND ${ICU_PRIVATE_VAR_NS}_BIN_SUFFIXES "bin64") + list(APPEND ${ICU_PRIVATE_VAR_NS}_LIB_SUFFIXES "lib64") +endif(CMAKE_SIZEOF_VOID_P EQUAL 8) +list(APPEND ${ICU_PRIVATE_VAR_NS}_BIN_SUFFIXES "bin") +list(APPEND ${ICU_PRIVATE_VAR_NS}_LIB_SUFFIXES "lib") + +set(${ICU_PRIVATE_VAR_NS}_COMPONENTS ) +# ... +macro(icu_declare_component _NAME) + list(APPEND ${ICU_PRIVATE_VAR_NS}_COMPONENTS ${_NAME}) + set("${ICU_PRIVATE_VAR_NS}_COMPONENTS_${_NAME}" ${ARGN}) +endmacro(icu_declare_component) + +icu_declare_component(data icudata) +icu_declare_component(uc icuuc) # Common and Data libraries +icu_declare_component(i18n icui18n icuin) # Internationalization library +icu_declare_component(io icuio ustdio) # Stream and I/O Library +icu_declare_component(le icule) # Layout library +icu_declare_component(lx iculx) # Paragraph Layout library + +########## Public ########## +set(${ICU_PUBLIC_VAR_NS}_FOUND TRUE) +set(${ICU_PUBLIC_VAR_NS}_LIBRARIES ) +set(${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS ) +set(${ICU_PUBLIC_VAR_NS}_C_FLAGS "") +set(${ICU_PUBLIC_VAR_NS}_CXX_FLAGS "") +set(${ICU_PUBLIC_VAR_NS}_CPP_FLAGS "") +set(${ICU_PUBLIC_VAR_NS}_C_SHARED_FLAGS "") +set(${ICU_PUBLIC_VAR_NS}_CXX_SHARED_FLAGS "") +set(${ICU_PUBLIC_VAR_NS}_CPP_SHARED_FLAGS "") +foreach(${ICU_PRIVATE_VAR_NS}_COMPONENT ${${ICU_PRIVATE_VAR_NS}_COMPONENTS}) + string(TOUPPER "${${ICU_PRIVATE_VAR_NS}_COMPONENT}" ${ICU_PRIVATE_VAR_NS}_UPPER_COMPONENT) + set("${ICU_PUBLIC_VAR_NS}_${${ICU_PRIVATE_VAR_NS}_UPPER_COMPONENT}_FOUND" FALSE) # may be done in the icu_declare_component macro +endforeach(${ICU_PRIVATE_VAR_NS}_COMPONENT) + +# Check components +if(NOT ${ICU_PUBLIC_VAR_NS}_FIND_COMPONENTS) # uc required at least + set(${ICU_PUBLIC_VAR_NS}_FIND_COMPONENTS uc) +else(NOT ${ICU_PUBLIC_VAR_NS}_FIND_COMPONENTS) + list(APPEND ${ICU_PUBLIC_VAR_NS}_FIND_COMPONENTS uc) + list(REMOVE_DUPLICATES ${ICU_PUBLIC_VAR_NS}_FIND_COMPONENTS) + foreach(${ICU_PRIVATE_VAR_NS}_COMPONENT ${${ICU_PUBLIC_VAR_NS}_FIND_COMPONENTS}) + if(NOT DEFINED ${ICU_PRIVATE_VAR_NS}_COMPONENTS_${${ICU_PRIVATE_VAR_NS}_COMPONENT}) + message(FATAL_ERROR "Unknown ICU component: ${${ICU_PRIVATE_VAR_NS}_COMPONENT}") + endif(NOT DEFINED ${ICU_PRIVATE_VAR_NS}_COMPONENTS_${${ICU_PRIVATE_VAR_NS}_COMPONENT}) + endforeach(${ICU_PRIVATE_VAR_NS}_COMPONENT) +endif(NOT ${ICU_PUBLIC_VAR_NS}_FIND_COMPONENTS) + +# Includes +find_path( + ${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS + NAMES unicode/utypes.h utypes.h + HINTS ${${ICU_PRIVATE_VAR_NS}_ROOT} + PATH_SUFFIXES "include" + DOC "Include directories for ICU" +) + +if(${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS) + ########## ########## + if(EXISTS "${${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS}/unicode/uvernum.h") # ICU >= 4 + file(READ "${${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS}/unicode/uvernum.h" ${ICU_PRIVATE_VAR_NS}_VERSION_HEADER_CONTENTS) + elseif(EXISTS "${${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS}/unicode/uversion.h") # ICU [2;4[ + file(READ "${${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS}/unicode/uversion.h" ${ICU_PRIVATE_VAR_NS}_VERSION_HEADER_CONTENTS) + elseif(EXISTS "${${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS}/unicode/utypes.h") # ICU [1.4;2[ + file(READ "${${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS}/unicode/utypes.h" ${ICU_PRIVATE_VAR_NS}_VERSION_HEADER_CONTENTS) + elseif(EXISTS "${${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS}/utypes.h") # ICU 1.3 + file(READ "${${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS}/utypes.h" ${ICU_PRIVATE_VAR_NS}_VERSION_HEADER_CONTENTS) + else() + message(FATAL_ERROR "ICU version header not found") + endif() + + if(${ICU_PRIVATE_VAR_NS}_VERSION_HEADER_CONTENTS MATCHES ".*# *define *ICU_VERSION *\"([0-9]+)\".*") # ICU 1.3 + # [1.3;1.4[ as #define ICU_VERSION "3" (no patch version, ie all 1.3.X versions will be detected as 1.3.0) + set(${ICU_PUBLIC_VAR_NS}_MAJOR_VERSION "1") + set(${ICU_PUBLIC_VAR_NS}_MINOR_VERSION "${CMAKE_MATCH_1}") + set(${ICU_PUBLIC_VAR_NS}_PATCH_VERSION "0") + elseif(${ICU_PRIVATE_VAR_NS}_VERSION_HEADER_CONTENTS MATCHES ".*# *define *U_ICU_VERSION_MAJOR_NUM *([0-9]+).*") + # + # Since version 4.9.1, ICU release version numbering was totaly changed, see: + # - http://site.icu-project.org/download/49 + # - http://userguide.icu-project.org/design#TOC-Version-Numbers-in-ICU + # + set(${ICU_PUBLIC_VAR_NS}_MAJOR_VERSION "${CMAKE_MATCH_1}") + string(REGEX REPLACE ".*# *define *U_ICU_VERSION_MINOR_NUM *([0-9]+).*" "\\1" ${ICU_PUBLIC_VAR_NS}_MINOR_VERSION "${${ICU_PRIVATE_VAR_NS}_VERSION_HEADER_CONTENTS}") + string(REGEX REPLACE ".*# *define *U_ICU_VERSION_PATCHLEVEL_NUM *([0-9]+).*" "\\1" ${ICU_PUBLIC_VAR_NS}_PATCH_VERSION "${${ICU_PRIVATE_VAR_NS}_VERSION_HEADER_CONTENTS}") + elseif(${ICU_PRIVATE_VAR_NS}_VERSION_HEADER_CONTENTS MATCHES ".*# *define *U_ICU_VERSION *\"(([0-9]+)(\\.[0-9]+)*)\".*") # ICU [1.4;1.8[ + # [1.4;1.8[ as #define U_ICU_VERSION "1.4.1.2" but it seems that some 1.4.1(?:\.\d)? have releasing error and appears as 1.4.0 + set(${ICU_PRIVATE_VAR_NS}_FULL_VERSION "${CMAKE_MATCH_1}") # copy CMAKE_MATCH_1, no longer valid on the following if + if(${ICU_PRIVATE_VAR_NS}_FULL_VERSION MATCHES "^([0-9]+)\\.([0-9]+)$") + set(${ICU_PUBLIC_VAR_NS}_MAJOR_VERSION "${CMAKE_MATCH_1}") + set(${ICU_PUBLIC_VAR_NS}_MINOR_VERSION "${CMAKE_MATCH_2}") + set(${ICU_PUBLIC_VAR_NS}_PATCH_VERSION "0") + elseif(${ICU_PRIVATE_VAR_NS}_FULL_VERSION MATCHES "^([0-9]+)\\.([0-9]+)\\.([0-9]+)") + set(${ICU_PUBLIC_VAR_NS}_MAJOR_VERSION "${CMAKE_MATCH_1}") + set(${ICU_PUBLIC_VAR_NS}_MINOR_VERSION "${CMAKE_MATCH_2}") + set(${ICU_PUBLIC_VAR_NS}_PATCH_VERSION "${CMAKE_MATCH_3}") + endif() + else() + message(FATAL_ERROR "failed to detect ICU version") + endif() + set(${ICU_PUBLIC_VAR_NS}_VERSION "${${ICU_PUBLIC_VAR_NS}_MAJOR_VERSION}.${${ICU_PUBLIC_VAR_NS}_MINOR_VERSION}.${${ICU_PUBLIC_VAR_NS}_PATCH_VERSION}") + ########## ########## + + # Check dependencies (implies pkg-config) + if(PKG_CONFIG_FOUND) + set(${ICU_PRIVATE_VAR_NS}_COMPONENTS_DUP ${${ICU_PUBLIC_VAR_NS}_FIND_COMPONENTS}) + foreach(${ICU_PRIVATE_VAR_NS}_COMPONENT ${${ICU_PRIVATE_VAR_NS}_COMPONENTS_DUP}) + pkg_check_modules(PC_ICU_PRIVATE_VAR_NS "icu-${${ICU_PRIVATE_VAR_NS}_COMPONENT}" QUIET) + + if(${PC_ICU_PRIVATE_VAR_NS}_FOUND) + foreach(${PC_ICU_PRIVATE_VAR_NS}_LIBRARY ${PC_ICU_LIBRARIES}) + string(REGEX REPLACE "^icu" "" ${PC_ICU_PRIVATE_VAR_NS}_STRIPPED_LIBRARY ${${PC_ICU_PRIVATE_VAR_NS}_LIBRARY}) + list(APPEND ${ICU_PUBLIC_VAR_NS}_FIND_COMPONENTS ${${PC_ICU_PRIVATE_VAR_NS}_STRIPPED_LIBRARY}) + endforeach(${PC_ICU_PRIVATE_VAR_NS}_LIBRARY) + endif(${PC_ICU_PRIVATE_VAR_NS}_FOUND) + endforeach(${ICU_PRIVATE_VAR_NS}_COMPONENT) + list(REMOVE_DUPLICATES ${ICU_PUBLIC_VAR_NS}_FIND_COMPONENTS) + endif(PKG_CONFIG_FOUND) + + # Check libraries + foreach(${ICU_PRIVATE_VAR_NS}_COMPONENT ${${ICU_PUBLIC_VAR_NS}_FIND_COMPONENTS}) + set(${ICU_PRIVATE_VAR_NS}_POSSIBLE_RELEASE_NAMES ) + set(${ICU_PRIVATE_VAR_NS}_POSSIBLE_DEBUG_NAMES ) + foreach(${ICU_PRIVATE_VAR_NS}_BASE_NAME ${${ICU_PRIVATE_VAR_NS}_COMPONENTS_${${ICU_PRIVATE_VAR_NS}_COMPONENT}}) + list(APPEND ${ICU_PRIVATE_VAR_NS}_POSSIBLE_RELEASE_NAMES "${${ICU_PRIVATE_VAR_NS}_BASE_NAME}") + list(APPEND ${ICU_PRIVATE_VAR_NS}_POSSIBLE_DEBUG_NAMES "${${ICU_PRIVATE_VAR_NS}_BASE_NAME}d") + list(APPEND ${ICU_PRIVATE_VAR_NS}_POSSIBLE_RELEASE_NAMES "${${ICU_PRIVATE_VAR_NS}_BASE_NAME}${ICU_MAJOR_VERSION}${ICU_MINOR_VERSION}") + list(APPEND ${ICU_PRIVATE_VAR_NS}_POSSIBLE_DEBUG_NAMES "${${ICU_PRIVATE_VAR_NS}_BASE_NAME}${ICU_MAJOR_VERSION}${ICU_MINOR_VERSION}d") + endforeach(${ICU_PRIVATE_VAR_NS}_BASE_NAME) + + find_library( + ${ICU_PRIVATE_VAR_NS}_LIB_RELEASE_${${ICU_PRIVATE_VAR_NS}_COMPONENT} + NAMES ${${ICU_PRIVATE_VAR_NS}_POSSIBLE_RELEASE_NAMES} + HINTS ${${ICU_PRIVATE_VAR_NS}_ROOT} + PATH_SUFFIXES ${_ICU_LIB_SUFFIXES} + DOC "Release libraries for ICU" + ) + find_library( + ${ICU_PRIVATE_VAR_NS}_LIB_DEBUG_${${ICU_PRIVATE_VAR_NS}_COMPONENT} + NAMES ${${ICU_PRIVATE_VAR_NS}_POSSIBLE_DEBUG_NAMES} + HINTS ${${ICU_PRIVATE_VAR_NS}_ROOT} + PATH_SUFFIXES ${_ICU_LIB_SUFFIXES} + DOC "Debug libraries for ICU" + ) + + string(TOUPPER "${${ICU_PRIVATE_VAR_NS}_COMPONENT}" ${ICU_PRIVATE_VAR_NS}_UPPER_COMPONENT) + if(NOT ${ICU_PRIVATE_VAR_NS}_LIB_RELEASE_${${ICU_PRIVATE_VAR_NS}_COMPONENT} AND NOT ${ICU_PRIVATE_VAR_NS}_LIB_DEBUG_${${ICU_PRIVATE_VAR_NS}_COMPONENT}) # both not found + set("${ICU_PUBLIC_VAR_NS}_${${ICU_PRIVATE_VAR_NS}_UPPER_COMPONENT}_FOUND" FALSE) + set("${ICU_PUBLIC_VAR_NS}_FOUND" FALSE) + else(NOT ${ICU_PRIVATE_VAR_NS}_LIB_RELEASE_${${ICU_PRIVATE_VAR_NS}_COMPONENT} AND NOT ${ICU_PRIVATE_VAR_NS}_LIB_DEBUG_${${ICU_PRIVATE_VAR_NS}_COMPONENT}) # one or both found + set("${ICU_PUBLIC_VAR_NS}_${${ICU_PRIVATE_VAR_NS}_UPPER_COMPONENT}_FOUND" TRUE) + if(NOT ${ICU_PRIVATE_VAR_NS}_LIB_RELEASE_${${ICU_PRIVATE_VAR_NS}_COMPONENT}) # release not found => we are in debug + set(${ICU_PRIVATE_VAR_NS}_LIB_${${ICU_PRIVATE_VAR_NS}_COMPONENT} "${${ICU_PRIVATE_VAR_NS}_LIB_DEBUG_${${ICU_PRIVATE_VAR_NS}_COMPONENT}}") + elseif(NOT ${ICU_PRIVATE_VAR_NS}_LIB_DEBUG_${${ICU_PRIVATE_VAR_NS}_COMPONENT}) # debug not found => we are in release + set(${ICU_PRIVATE_VAR_NS}_LIB_${${ICU_PRIVATE_VAR_NS}_COMPONENT} "${${ICU_PRIVATE_VAR_NS}_LIB_RELEASE_${${ICU_PRIVATE_VAR_NS}_COMPONENT}}") + else() # both found + set( + ${ICU_PRIVATE_VAR_NS}_LIB_${${ICU_PRIVATE_VAR_NS}_COMPONENT} + optimized ${${ICU_PRIVATE_VAR_NS}_LIB_RELEASE_${${ICU_PRIVATE_VAR_NS}_COMPONENT}} + debug ${${ICU_PRIVATE_VAR_NS}_LIB_DEBUG_${${ICU_PRIVATE_VAR_NS}_COMPONENT}} + ) + endif() + list(APPEND ${ICU_PUBLIC_VAR_NS}_LIBRARIES ${${ICU_PRIVATE_VAR_NS}_LIB_${${ICU_PRIVATE_VAR_NS}_COMPONENT}}) + endif(NOT ${ICU_PRIVATE_VAR_NS}_LIB_RELEASE_${${ICU_PRIVATE_VAR_NS}_COMPONENT} AND NOT ${ICU_PRIVATE_VAR_NS}_LIB_DEBUG_${${ICU_PRIVATE_VAR_NS}_COMPONENT}) + endforeach(${ICU_PRIVATE_VAR_NS}_COMPONENT) + + # Try to find out compiler flags + find_program(${ICU_PUBLIC_VAR_NS}_CONFIG_EXECUTABLE icu-config HINTS ${${ICU_PRIVATE_VAR_NS}_ROOT}) + if(${ICU_PUBLIC_VAR_NS}_CONFIG_EXECUTABLE) + execute_process(COMMAND ${${ICU_PUBLIC_VAR_NS}_CONFIG_EXECUTABLE} --cflags OUTPUT_VARIABLE ${ICU_PUBLIC_VAR_NS}_C_FLAGS OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${${ICU_PUBLIC_VAR_NS}_CONFIG_EXECUTABLE} --cxxflags OUTPUT_VARIABLE ${ICU_PUBLIC_VAR_NS}_CXX_FLAGS OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${${ICU_PUBLIC_VAR_NS}_CONFIG_EXECUTABLE} --cppflags OUTPUT_VARIABLE ${ICU_PUBLIC_VAR_NS}_CPP_FLAGS OUTPUT_STRIP_TRAILING_WHITESPACE) + + execute_process(COMMAND ${${ICU_PUBLIC_VAR_NS}_CONFIG_EXECUTABLE} --cflags-dynamic OUTPUT_VARIABLE ${ICU_PUBLIC_VAR_NS}_C_SHARED_FLAGS OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${${ICU_PUBLIC_VAR_NS}_CONFIG_EXECUTABLE} --cxxflags-dynamic OUTPUT_VARIABLE ${ICU_PUBLIC_VAR_NS}_CXX_SHARED_FLAGS OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND ${${ICU_PUBLIC_VAR_NS}_CONFIG_EXECUTABLE} --cppflags-dynamic OUTPUT_VARIABLE ${ICU_PUBLIC_VAR_NS}_CPP_SHARED_FLAGS OUTPUT_STRIP_TRAILING_WHITESPACE) + endif(${ICU_PUBLIC_VAR_NS}_CONFIG_EXECUTABLE) + + # Check find_package arguments + include(FindPackageHandleStandardArgs) + if(${ICU_PUBLIC_VAR_NS}_FIND_REQUIRED AND NOT ${ICU_PUBLIC_VAR_NS}_FIND_QUIETLY) + find_package_handle_standard_args( + ${ICU_PUBLIC_VAR_NS} + REQUIRED_VARS ${ICU_PUBLIC_VAR_NS}_LIBRARIES ${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS + VERSION_VAR ${ICU_PUBLIC_VAR_NS}_VERSION + ) + else(${ICU_PUBLIC_VAR_NS}_FIND_REQUIRED AND NOT ${ICU_PUBLIC_VAR_NS}_FIND_QUIETLY) + find_package_handle_standard_args(${ICU_PUBLIC_VAR_NS} "ICU not found" ${ICU_PUBLIC_VAR_NS}_LIBRARIES ${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS) + endif(${ICU_PUBLIC_VAR_NS}_FIND_REQUIRED AND NOT ${ICU_PUBLIC_VAR_NS}_FIND_QUIETLY) +else(${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS) + set("${ICU_PUBLIC_VAR_NS}_FOUND" FALSE) + if(${ICU_PUBLIC_VAR_NS}_FIND_REQUIRED AND NOT ${ICU_PUBLIC_VAR_NS}_FIND_QUIETLY) + message(FATAL_ERROR "Could not find ICU include directory") + endif(${ICU_PUBLIC_VAR_NS}_FIND_REQUIRED AND NOT ${ICU_PUBLIC_VAR_NS}_FIND_QUIETLY) +endif(${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS) + +mark_as_advanced( + ${ICU_PUBLIC_VAR_NS}_INCLUDE_DIRS + ${ICU_PUBLIC_VAR_NS}_LIBRARIES +) + +# IN (args) +icudebug("FIND_COMPONENTS") +icudebug("FIND_REQUIRED") +icudebug("FIND_QUIETLY") +icudebug("FIND_VERSION") +# OUT +# Found +icudebug("FOUND") +icudebug("UC_FOUND") +icudebug("I18N_FOUND") +icudebug("IO_FOUND") +icudebug("LE_FOUND") +icudebug("LX_FOUND") +icudebug("DATA_FOUND") +# Flags +icudebug("C_FLAGS") +icudebug("CPP_FLAGS") +icudebug("CXX_FLAGS") +icudebug("C_SHARED_FLAGS") +icudebug("CPP_SHARED_FLAGS") +icudebug("CXX_SHARED_FLAGS") +# Linking +icudebug("INCLUDE_DIRS") +icudebug("LIBRARIES") +# Version +icudebug("MAJOR_VERSION") +icudebug("MINOR_VERSION") +icudebug("PATCH_VERSION") +icudebug("VERSION") diff --git a/cmake_modules/FindLibEV.cmake b/cmake_modules/FindLibEV.cmake new file mode 100644 index 0000000..dc046b9 --- /dev/null +++ b/cmake_modules/FindLibEV.cmake @@ -0,0 +1,20 @@ +# taken from tarantool at https://github.com/tarantool/tarantool/blob/master/cmake/FindLibEV.cmake +# Copyright (C) 2010-2015 Tarantool AUTHORS, see https://github.com/tarantool/tarantool/blob/master/LICENSE + +find_path(LIBEV_INCLUDE_DIR NAMES ev.h) +find_library(LIBEV_LIBRARIES NAMES ev) + +if(LIBEV_INCLUDE_DIR AND LIBEV_LIBRARIES) + set(LIBEV_FOUND ON) +endif(LIBEV_INCLUDE_DIR AND LIBEV_LIBRARIES) + +if(LIBEV_FOUND) + if (NOT LIBEV_FIND_QUIETLY) + message(STATUS "Found libev includes: ${LIBEV_INCLUDE_DIR}/ev.h") + message(STATUS "Found libev library: ${LIBEV_LIBRARIES}") + endif (NOT LIBEV_FIND_QUIETLY) +else(LIBEV_FOUND) + if (LIBEV_FIND_REQUIRED) + message(FATAL_ERROR "Could not find libev development files") + endif (LIBEV_FIND_REQUIRED) +endif (LIBEV_FOUND) diff --git a/cmake_modules/FindLuaJIT.cmake b/cmake_modules/FindLuaJIT.cmake new file mode 100644 index 0000000..5aea075 --- /dev/null +++ b/cmake_modules/FindLuaJIT.cmake @@ -0,0 +1,79 @@ +# Locate Lua library +# This module defines +# LUAJIT_FOUND, if false, do not try to link to Lua +# LUAJIT_LIBRARIES +# LUAJIT_INCLUDE_DIR, where to find lua.h +# +# Note that the expected include convention is +# #include "lua.h" +# and not +# #include +# This is because, the lua location is not standardized and may exist +# in locations other than lua/ + +#============================================================================= +# Copyright 2007-2009 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distributed this file outside of CMake, substitute the full +# License text for the above reference.) +# +# ################ +# 2010 - modified for cronkite to find luajit instead of lua, as it was before. +# + +FIND_PATH(LUAJIT_INCLUDE_DIR luajit.h + HINTS + $ENV{LUAJIT_DIR} + PATH_SUFFIXES include/luajit-2.0 include/luajit2.0 include/luajit include + PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr + /sw # Fink + /opt/local # DarwinPorts + /opt/csw # Blastwave + /opt +) + +FIND_LIBRARY(LUAJIT_LIBRARY + NAMES luajit-51 luajit-5.1 luajit + HINTS + $ENV{LUAJIT_DIR} + PATH_SUFFIXES lib64 lib + PATHS + ~/Library/Frameworks + /Library/Frameworks + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt +) + +IF(LUAJIT_LIBRARY) + # include the math library for Unix + IF(UNIX AND NOT APPLE) + FIND_LIBRARY(LUAJIT_MATH_LIBRARY m) + SET( LUAJIT_LIBRARIES "${LUAJIT_LIBRARY};${LUAJIT_MATH_LIBRARY}" CACHE STRING "Lua Libraries") + # For Windows and Mac, don't need to explicitly include the math library + ELSE(UNIX AND NOT APPLE) + SET( LUAJIT_LIBRARIES "${LUAJIT_LIBRARY}" CACHE STRING "Lua Libraries") + ENDIF(UNIX AND NOT APPLE) +ENDIF(LUAJIT_LIBRARY) + +INCLUDE(FindPackageHandleStandardArgs) +# handle the QUIETLY and REQUIRED arguments and set LUAJIT_FOUND to TRUE if +# all listed variables are TRUE +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LuaJIT DEFAULT_MSG LUAJIT_LIBRARIES LUAJIT_INCLUDE_DIR) + +MARK_AS_ADVANCED(LUAJIT_INCLUDE_DIR LUAJIT_LIBRARIES LUAJIT_LIBRARY LUAJIT_MATH_LIBRARY) + diff --git a/cmake_modules/Findlibjansson.cmake b/cmake_modules/Findlibjansson.cmake new file mode 100644 index 0000000..027a0f7 --- /dev/null +++ b/cmake_modules/Findlibjansson.cmake @@ -0,0 +1,21 @@ +# taken from https://github.com/Adam-/bedrock/blob/master/cmake/Findlibjansson.cmake +# Copyright (c) 2012, Adam under the BSD 2-clause license at https://github.com/Adam-/bedrock/blob/master/LICENSE + +find_path(JANSSON_INCLUDE_DIR jansson.h + PATHS /usr/include +) + +find_library(JANSSON_LIBRARY + NAMES jansson + PATHS /usr/lib /usr/local/lib +) + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(JANSSON + DEFAULT_MSG + JANSSON_INCLUDE_DIR + JANSSON_LIBRARY +) + +include_directories(${JANSSON_INCLUDE_DIR}) diff --git a/cmake_modules/Findtcmalloc.cmake b/cmake_modules/Findtcmalloc.cmake new file mode 100644 index 0000000..bc85b0c --- /dev/null +++ b/cmake_modules/Findtcmalloc.cmake @@ -0,0 +1,50 @@ +# taken from ceph at https://github.com/ceph/ceph/blob/master/cmake/modules/Findtcmalloc.cmake +# licensed under the LGPL2.1, see https://github.com/ceph/ceph/blob/master/COPYING and https://github.com/ceph/ceph/blob/master/COPYING-LGPL2.1 + +# - Find Tcmalloc +# Find the native Tcmalloc includes and library +# +# Tcmalloc_INCLUDE_DIR - where to find Tcmalloc.h, etc. +# Tcmalloc_LIBRARIES - List of libraries when using Tcmalloc. +# Tcmalloc_FOUND - True if Tcmalloc found. + +find_path(Tcmalloc_INCLUDE_DIR google/tcmalloc.h NO_DEFAULT_PATH PATHS + ${HT_DEPENDENCY_INCLUDE_DIR} + /usr/include + /opt/local/include + /usr/local/include +) + +if (USE_TCMALLOC) + set(Tcmalloc_NAMES tcmalloc) +else () + set(Tcmalloc_NAMES tcmalloc_minimal tcmalloc) +endif () + +find_library(Tcmalloc_LIBRARY NO_DEFAULT_PATH + NAMES ${Tcmalloc_NAMES} + PATHS ${HT_DEPENDENCY_LIB_DIR} /lib /usr/lib /usr/local/lib /opt/local/lib +) + +if (Tcmalloc_INCLUDE_DIR AND Tcmalloc_LIBRARY) + set(Tcmalloc_FOUND TRUE) + set( Tcmalloc_LIBRARIES ${Tcmalloc_LIBRARY} ) +else () + set(Tcmalloc_FOUND FALSE) + set( Tcmalloc_LIBRARIES ) +endif () + +if (Tcmalloc_FOUND) + message(STATUS "Found Tcmalloc: ${Tcmalloc_LIBRARY}") +else () + message(STATUS "Not Found Tcmalloc: ${Tcmalloc_LIBRARY}") + if (Tcmalloc_FIND_REQUIRED) + message(STATUS "Looked for Tcmalloc libraries named ${Tcmalloc_NAMES}.") + message(FATAL_ERROR "Could NOT find Tcmalloc library") + endif () +endif () + +mark_as_advanced( + Tcmalloc_LIBRARY + Tcmalloc_INCLUDE_DIR + ) diff --git a/cmake_modules/cotire b/cmake_modules/cotire new file mode 160000 index 0000000..9cfda4c --- /dev/null +++ b/cmake_modules/cotire @@ -0,0 +1 @@ +Subproject commit 9cfda4cb38532f442da7558c4746adc28295184d diff --git a/src/Makefile b/src/Makefile deleted file mode 100644 index 89782c8..0000000 --- a/src/Makefile +++ /dev/null @@ -1,75 +0,0 @@ -CXXFLAGS= -g -O2 -DNDEBUG -LDFLAGS= -g -OUTDIR= release/ -ifdef DEBUG - CXXFLAGS= -g -O0 -DDEBUG - LDFLAGS= -g - OUTDIR = debug/ -endif -TARGETDIR= ../$(OUTDIR) -INSTALLDIR= ../bin/ - -CXXFLAGS+= -Wall -Werror -fno-strict-aliasing -I/usr/include/luajit-2.0 -I/usr/local/include -I../lib/lua/src -I../lib/evhttp -LDFLAGS+= -L/usr/local/lib -L../lib/lua/src -L../lib/glog_install/lib -L../lib/evhttp -levhttpclient -lpthread -lrt -lev -lm -lluajit-5.1 -lglog -ljansson -lcurl -lhiredis -licuuc -licudata -ltcmalloc - -FSERV_O= channel.o connection.o fserv.o login_evhttp.o lua_channel.o lua_chat.o lua_connection.o lua_constants.o messagebuffer.o native_command.o redis.o server.o server_state.o startup_config.o unicode_tools.o websocket.o base64.o md5.o modp_b64.o sha1.o -PRECOMP_GCH= $(TARGETDIR)precompiled_headers.hpp.gch -FACCEPTOR_O= facceptor.o -FACCEPTOR_LDFLAGS= -lev -FSERV_SCRIPTS= startup_config.lua main.lua -FSERV_OBJECTS= $(FSERV_O:%.o=$(TARGETDIR)%.o) -FACCEPTOR_OBJECTS= $(FACCEPTOR_O:%.o=$(TARGETDIR)%.o) - -$(TARGETDIR)%.o: %.cpp - @echo "$(CXX) $<" - @$(CXX) -c $(CXXFLAGS) $< -o $(TARGETDIR)$@ - -$(TARGETDIR)%.hpp.gch: %.hpp - @echo "$(CXX)-precompile $@" - @${CXX} $(CXXFLAGS) -c $< -o $(TARGETDIR)$@ - -%.lua: - @echo "copy ../script/$@ to $(TARGETDIR)script/$@" - @cp ../script/$@ $(TARGETDIR)script/$@ - -all: facceptor fserv - -fserv: outdir_folders $(PRECOMP_GCH) $(FSERV_OBJECTS) - @echo "ld $(CXX) $(TARGETDIR)$@" - @$(CXX) $(FSERV_OBJECTS) $(LDFLAGS) -o $(TARGETDIR)$@ - -facceptor: outdir_folders $(FACCEPTOR_OBJECTS) - @echo "ld $(CXX) $(TARGETDIR)$@" - @$(CXX) $(FACCEPTOR_OBJECTS) $(FACCEPTOR_LDFLAGS) -o $(TARGETDIR)$@ - - -outdir_folders: - @echo "Creating $(TARGETDIR) ..." - @mkdir -p $(TARGETDIR) - @echo "Creating $(TARGETDIR)script ..." - @mkdir -p $(TARGETDIR)script - @echo "Creating $(TARGETDIR)logs ..." - @mkdir -p $(TARGETDIR)logs - -install_folders: - @echo "Creating $(INSTALLDIR) ..." - @mkdir -p $(INSTALLDIR) - @echo "Creating $(INSTALLDIR)script ..." - @mkdir -p $(INSTALLDIR)script - @echo "Creating $(INSTALLDIR)logs ..." - @mkdir -p $(INSTALLDIR)logs - -install: fserv facceptor install_folders deploy - @echo "Installing fserv from $(TARGETDIR) to $(INSTALLDIR) ..." - @cp $(TARGETDIR)fserv $(INSTALLDIR) - @echo "Installing facceptor from $(TARGETDIR) to $(INSTALLDIR) ..." - @cp $(TARGETDIR)facceptor $(INSTALLDIR)facceptor - @echo "Installing '$(FSERV_SCRIPTS)' from $(TARGETDIR)script to $(INSTALLDIR)script ..." - @cp -r $(TARGETDIR)script/ $(INSTALLDIR) - -deploy: $(FSERV_SCRIPTS) - -clean: - @echo "Cleaning fserv, facceptor ..." - rm -f *~ $(TARGETDIR)*.o $(TARGETDIR)*.gch $(TARGETDIR)fserv $(TARGETDIR)facceptor - rm -fr $(TARGETDIR)script $(TARGETDIR)logs diff --git a/src/cmake_config.hpp.in b/src/cmake_config.hpp.in new file mode 100644 index 0000000..637ae50 --- /dev/null +++ b/src/cmake_config.hpp.in @@ -0,0 +1 @@ +#cmakedefine HAVE_NEW_TCMALLOC diff --git a/src/server.cpp b/src/server.cpp index 6468cda..71f0525 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -28,6 +28,7 @@ */ #include "precompiled_headers.hpp" +#include "cmake_config.hpp" #include "server.hpp" #include "connection.hpp" @@ -50,7 +51,13 @@ #include #include -#include +// gperftools/tcmalloc < 2.0 has its includes under google/ +// since 2.0 they're under gperftools/ and the google/ stubs throw a compiler warning +#ifdef HAVE_NEW_TCMALLOC + #include +#else + #include +#endif struct ev_loop* Server::server_loop = 0; ev_async* Server::server_async = 0;