# CMakeLists.txt cmake configuration for g2log test # g2log is a KjellKod Logger # 2011 @author Kjell Hedström, hedstrom@kjellkod.cc # ================================================================== # 2010 by KjellKod.cc. This is PUBLIC DOMAIN to use at your own # risk and comes with no warranties. # # This code is yours to share, use and modify with no strings attached # and no restrictions or obligations. # =================================================================== # Below are details for compiling on Windows and Linux # by default only an example g2log binary is created # the performance and unit tests creation can be enabled by switching their # OPTIONs from OFF to ON --- See below at around line 110 # === WINDOWS === # Example for: Visual Studio 2013 (earlier should work too) # 1. please use the "Visual Studio Command Prompt 12 (2013)" # 2. from the g2log folder # mkdir build # cd build; # 3. cmake -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 12" .. # 4. msbuild g2log_by_kjellkod.sln /p:Configuration=Release # # Try to run an example, such as: # 5. Release\g2log-FATAL-contract.exe # # # === LINUX: === To try this out from folder g2log: # mkdir build # cd build # >> create makefiles in g2log/build directory # cmake -DCMAKE_BUILD_TYPE=Release .. # make -jN (where N stands for number of cores you want to utilize) # # # # === Clang on Linux === # From g2log/g2log # mkdir build && cd build # cmake -DCMAKE_CXX_COMPILER=clang++ .. # if you want to double-check settings: "VERBOSE=1 make" # otherwise just run: "make -j" # # ============================================================================ cmake_minimum_required (VERSION 2.8) ENABLE_LANGUAGE(CXX) set(CMAKE_BUILD_TYPE Release) project (g2log_by_kjellkod) set(LOG_SRC ${g2log_by_kjellkod_SOURCE_DIR}/src) set(DIR_UNIT_TEST ${g2log_by_kjellkod_SOURCE_DIR}/test_unit) set(DIR_EXAMPLE ${g2log_by_kjellkod_SOURCE_DIR}/test_example) set(DIR_PERFORMANCE ${g2log_by_kjellkod_SOURCE_DIR}/test_performance) MESSAGE(" LOG_SRC = : ${LOG_SRC}") include_directories(${LOG_SRC}) SET(ACTIVE_CPP0xx_DIR "Release") # Detect 64 or 32 bit if (CMAKE_SIZEOF_VOID_P EQUAL 8) # 64-bit project SET(64_BIT_OS TRUE) MESSAGE("A 64-bit OS detected") else() SET(64_BIT_OS FALSE) MESSAGE("A 32-bit OS detected") endif() #cmake -DCMAKE_CXX_COMPILER=clang++ .. # WARNING: If Clang for Linux does not work with full C++11 support it might be your # installation that is faulty. When I tested Clang on Ubuntu I followed the following # description # 1) http://kjellkod.wordpress.com/2013/09/23/experimental-g2log-with-clang/ # 2) https://github.com/maidsafe/MaidSafe/wiki/Hacking-with-Clang-llvm-abi-and-llvm-libc IF ("${CMAKE_CXX_COMPILER_ID}" MATCHES ".*Clang") MESSAGE("") MESSAGE("cmake for Clang ") if (APPLE) set(PLATFORM_LINK_LIBRIES c++abi) else() set(PLATFORM_LINK_LIBRIES rt c++abi) endif() set(CMAKE_CXX_FLAGS "-Wall -std=c++11 -pthread -stdlib=libc++ -Wunused -D_GLIBCXX_USE_NANOSLEEP") ELSEIF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") MESSAGE("") MESSAGE("cmake for GCC ") MESSAGE("if cmake finishes OK, do make") MESSAGE("then run './g2log-FATAL-example' or whatever performance test you feel like trying") MESSAGE("") if (APPLE) set(CMAKE_CXX_FLAGS "-Wall -Wunused -std=c++11 -pthread -D_GLIBCXX_USE_NANOSLEEP") else() set(PLATFORM_LINK_LIBRIES rt) set(CMAKE_CXX_FLAGS "-Wall -rdynamic -Wunused -std=c++11 -pthread -D_GLIBCXX_USE_NANOSLEEP") endif() ELSEIF(MSVC) # VC11 bug: http://code.google.com/p/googletest/issues/detail?id=408 # add_definition(-D_VARIADIC_MAX=10) # https://github.com/anhstudios/swganh/pull/186/files ADD_DEFINITIONS (/D_VARIADIC_MAX=10) MESSAGE(STATUS "- MSVC: Set variadic max to 10 for MSVC compatibility") # Remember to set set target properties if using GTEST similar to done below on target "unit_test" # "set_target_properties(unit_test PROPERTIES COMPILE_DEFINITIONS "GTEST_USE_OWN_TR1_TUPLE=0") MESSAGE("") MESSAGE("Windows: Please run the command [cmake -DCMAKE_BUILD_TYPE=Release -G \"Visual Studio 11\" ..]") MESSAGE("if cmake finishes OK, do 'msbuild g2log_by_kjellkod.sln /p:Configuration=Release'") MESSAGE("then run 'Release\\g2log-FATAL-example.exe' or whatever performance test you feel like trying") MESSAGE("") ENDIF() # GENERIC STEPS file(GLOB SRC_FILES ${LOG_SRC}/*.h ${LOG_SRC}/*.hpp ${LOG_SRC}/*.cpp ${LOG_SRC}/*.ipp) if(MSVC OR MINGW) list(REMOVE_ITEM SRC_FILES ${LOG_SRC}/crashhandler_unix.cpp) else() list(REMOVE_ITEM SRC_FILES ${LOG_SRC}/crashhandler_win.cpp) endif(MSVC OR MINGW) set(SRC_FILES ${SRC_FILES} ${SRC_PLATFORM_SPECIFIC}) # Create the g2log library include_directories(${LOG_SRC}) MESSAGE(" g3logger files: [${SRC_FILES}]") add_library(g3logger ${SRC_FILES}) set_target_properties(g3logger PROPERTIES LINKER_LANGUAGE CXX) add_library(g3logger_shared SHARED ${SRC_FILES}) set_target_properties(g3logger_shared PROPERTIES LINKER_LANGUAGE CXX) # ============================================================================ # G2LOG OPTIONS: Turn OFF the ones that is of no interest to you # ============================================================================ option (USE_DYNAMIC_LOGGING_LEVELS "Turn ON/OFF log levels. An disabled level will not push logs of that level to the sink. By default dynamic logging is disabled" OFF) # Do 'cmake -DUSE_DYNAMIC_LOGGING_LEVELS=ON -DCMAKE_BUILD_TYPE=Release .. ' to enable this # (or change the default option above) if(USE_DYNAMIC_LOGGING_LEVELS) add_definitions(-DG2_DYNAMIC_LOGGING) MESSAGE ("\nUSE_DYNAMIC_LOGGING_LEVELS is turned on\n\tUse g2::setLogLevel(LEVEL boolean) to enable/disable logging on specified levels.\n\tAll levels are by default turn ON\n\n") endif(USE_DYNAMIC_LOGGING_LEVELS) # ============================================================================ # TEST OPTIONS: Turn OFF the ones that is of no interest to you # ---- by default all is OFF: except 'g2log-FATAL-example ----- # ---- the reason for this is that # ----- 1) the performance tests were only thoroughly tested on Ubuntu, not windows- # (g2log windows/linux, but Google's glog only on linux) # # 2) The unit test were tested windows/linux,. but must be unzipped # before it can be "cmake'd" and compiled --- leaving it as OFF for now # ============================================================================ # 1. a simple test example 'g2log-FATAL-*' # Do 'cmake -DUSE_SIMPLE_EXAMPLE=ON' to enable this option (USE_SIMPLE_EXAMPLE "Simple (fatal-crash/contract) examples " ON) # 2. performance test (average + worst case) for KjellKod's g2log # Do 'cmake -DUSE_G2LOG_PERFORMANCE=ON' to enable this option (USE_G2LOG_PERFORMANCE "g2log performance test" OFF) # 3. performance test for Google's glog # remember to install glog, snapshot available at g2log/3rdParty/glog # option (USE_GOOGLE_GLOG_PERFORMANCE "Google's glog performance test" OFF) # 4. unit test for g2log (cmake -DUSE_G2LOG_UNIT_TEST=ON ..) # remember to unzip gtest at g2log/3rdParty/gtest option (USE_G2LOG_UNIT_TEST "g2log unit tests" OFF) # =============================================================================================== # # BELOW : Creating executables depending on OPTIONS above # # ============================================================================================== # 1. create the the example EXECUTABLE - hook in the test_example's CMakeLists.txt file # ========================= if (USE_SIMPLE_EXAMPLE) MESSAGE(" g2log-FATAL-* examples option ON") include_directories (${DIR_EXAMPLE}) add_executable(g2log-FATAL-contract ${DIR_EXAMPLE}/main_contract.cpp) add_executable(g2log-FATAL-sigsegv ${DIR_EXAMPLE}/main_sigsegv.cpp) target_link_libraries(g2log-FATAL-contract g3logger ${PLATFORM_LINK_LIBRIES}) target_link_libraries(g2log-FATAL-sigsegv g3logger ${PLATFORM_LINK_LIBRIES}) endif (USE_SIMPLE_EXAMPLE) # 2. create the g2log's performance tests # ========================= if (USE_G2LOG_PERFORMANCE) MESSAGE(" g2log performance tests option ON") include_directories (${DIR_PERFORMANCE}) # MEAN PERFORMANCE TEST add_executable(g2log-performance-threaded_mean ${DIR_PERFORMANCE}/main_threaded_mean.cpp ${DIR_PERFORMANCE}/performance.h) # Turn on G2LOG performance flag set_target_properties(g2log-performance-threaded_mean PROPERTIES COMPILE_DEFINITIONS "G2LOG_PERFORMANCE=1") target_link_libraries(g2log-performance-threaded_mean g3logger ${PLATFORM_LINK_LIBRIES}) # WORST CASE PERFORMANCE TEST add_executable(g2log-performance-threaded_worst ${DIR_PERFORMANCE}/main_threaded_worst.cpp ${DIR_PERFORMANCE}/performance.h) # Turn on G2LOG performance flag set_target_properties(g2log-performance-threaded_worst PROPERTIES COMPILE_DEFINITIONS "G2LOG_PERFORMANCE=1") target_link_libraries(g2log-performance-threaded_worst g3logger ${PLATFORM_LINK_LIBRIES}) endif (USE_G2LOG_PERFORMANCE) # 3. create the Google glog's performance test # # REMOVED,. but kept commented away for now. # You can always enabled this again and get this version of glog (for testing from) # https://bitbucket.org/KjellKod/g2log/src/6109722f9ffbe2a59b9dd82d8ceca4b173c1fd06/3rdParty/?at=default # ## ========================= #if (USE_GOOGLE_GLOG_PERFORMANCE) # MESSAGE(" Google's glog performance tests option ON") # include_directories (${DIR_PERFORMANCE}) # #Linux is easy! # if(UNIX) # set(GLOG_LIB glog) # # create the the GOOGLE MEAN_PERFORMANCE executable # add_executable(google_glog-performance-threaded_mean ${DIR_PERFORMANCE}/main_threaded_mean.cpp ${DIR_PERFORMANCE}/performance.h) # set_target_properties(google_glog-performance-threaded_mean PROPERTIES COMPILE_DEFINITIONS "GOOGLE_GLOG_PERFORMANCE=1") # target_link_libraries(google_glog-performance-threaded_mean ${GLOG_LIB} ${PLATFORM_LINK_LIBRIES}) # # # create the the GOOGLE MEAN_PERFORMANCE executable # add_executable(google_glog-performance-threaded_worst ${DIR_PERFORMANCE}/main_threaded_worst.cpp ${DIR_PERFORMANCE}/performance.h) # set_target_properties(google_glog-performance-threaded_worst PROPERTIES COMPILE_DEFINITIONS "GOOGLE_GLOG_PERFORMANCE=1") # target_link_libraries(google_glog-performance-threaded_worst ${GLOG_LIB} ${PLATFORM_LINK_LIBRIES}) # endif(UNIX) # # # GLOG on Linux is easy - but for Windows trickier,. and it doesn't work (as of yet) # if(WIN32) # MESSAGE("******************************************************") # MESSAGE("*** SORRY- Google glog on windows is not preconfigured") # MESSAGE("*** You have to do this yourself: ref CMakeLists.txt") # MESSAGE("******************************************************") # MESSAGE("") # endif(WIN32) #endif (USE_GOOGLE_GLOG_PERFORMANCE) # 4. create the unit tests for g2log --- ONLY TESTED THE UNIT TEST ON LINUX # ========================= if (USE_G2LOG_UNIT_TEST) MESSAGE(" g2log unit testing option ON") set(GTEST_DIR ../3rdParty/gtest/gtest-1.7.0) set(GTEST_INCLUDE_DIRECTORIES ${GTEST_DIR}/include ${GTEST_DIR} ${GTEST_DIR}/src) include_directories(${GTEST_INCLUDE_DIRECTORIES}) add_library(gtest_170_lib ${GTEST_DIR}/src/gtest-all.cc) set_target_properties(gtest_170_lib PROPERTIES COMPILE_DEFINITIONS "GTEST_HAS_RTTI=0") enable_testing(true) # obs see this: http://stackoverflow.com/questions/9589192/how-do-i-change-the-number-of-template-arguments-supported-by-msvcs-stdtupl # and this: http://stackoverflow.com/questions/2257464/google-test-and-visual-studio-2010-rc SET(tests_to_run test_filechange test_io test_configuration test_concept_sink test_sink) SET(helper ${DIR_UNIT_TEST}/testing_helpers.h ${DIR_UNIT_TEST}/testing_helpers.cpp) include_directories(${DIR_UNIT_TEST}) FOREACH(test ${tests_to_run} ) SET(all_tests ${all_tests} ${DIR_UNIT_TEST}/${test}.cpp ) IF(${test} STREQUAL "test_filechange") add_executable(${test} ${DIR_UNIT_TEST}/${test}.cpp ${helper}) ELSE() add_executable(${test} ../test_main/test_main.cpp ${DIR_UNIT_TEST}/${test}.cpp ${helper}) ENDIF(${test} STREQUAL "test_filechange") set_target_properties(${test} PROPERTIES COMPILE_DEFINITIONS "GTEST_HAS_TR1_TUPLE=0") set_target_properties(${test} PROPERTIES COMPILE_DEFINITIONS "GTEST_HAS_RTTI=0") IF( NOT(MSVC)) set_target_properties(${test} PROPERTIES COMPILE_FLAGS "-isystem -pthread ") ENDIF( NOT(MSVC)) target_link_libraries(${test} g3logger gtest_170_lib ${PLATFORM_LINK_LIBRIES}) ENDFOREACH(test) # # Test for Linux, runtime loading of dynamic libraries # if(NOT WIN32 AND NOT ("${CMAKE_CXX_COMPILER_ID}" MATCHES ".*Clang")) add_library(tester_sharedlib SHARED ${DIR_UNIT_TEST}/tester_sharedlib.h ${DIR_UNIT_TEST}/tester_sharedlib.cpp) target_link_libraries(tester_sharedlib g3logger_shared) add_executable(test_dynamic_loaded_shared_lib ../test_main/test_main.cpp ${DIR_UNIT_TEST}/test_linux_dynamic_loaded_sharedlib.cpp) set_target_properties(test_dynamic_loaded_shared_lib PROPERTIES COMPILE_DEFINITIONS "GTEST_HAS_TR1_TUPLE=0") set_target_properties(test_dynamic_loaded_shared_lib PROPERTIES COMPILE_DEFINITIONS "GTEST_HAS_RTTI=0") target_link_libraries(test_dynamic_loaded_shared_lib g3logger_shared -ldl gtest_170_lib ) endif() endif (USE_G2LOG_UNIT_TEST)