From 8a401c0e84942129447a717ca9135ab545d54083 Mon Sep 17 00:00:00 2001 From: Nikolay Orlyuk Date: Wed, 26 Feb 2014 13:48:18 +0200 Subject: [PATCH] buildable under Ubuntu 12.04 --- CMakeLists.txt | 5 +- cmake_modules/FindGTest.cmake | 186 ++++++++++++++++++++++++++++++++ test/CMakeLists.txt | 4 +- test_perfomance/CMakeLists.txt | 2 +- test_perfomance/performance.cpp | 16 +-- 5 files changed, 196 insertions(+), 17 deletions(-) create mode 100644 cmake_modules/FindGTest.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 021b055..01cc029 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,9 @@ -cmake_minimum_required(VERSION 2.8.8) +cmake_minimum_required(VERSION 2.8.7) project(pjson) +# additional modules and their overrides (i.e FindGTest) +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules" ${CMAKE_MODULE_PATH}) + set(ENABLE_TRACES FALSE CACHE BOOL "Trace to stderr all parsing steps") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror -Wno-unused-function") diff --git a/cmake_modules/FindGTest.cmake b/cmake_modules/FindGTest.cmake new file mode 100644 index 0000000..7a765b9 --- /dev/null +++ b/cmake_modules/FindGTest.cmake @@ -0,0 +1,186 @@ +# imported from cmake 2.8.12.2 sources +# address both issue #14151 and #14775 +# +# Locate the Google C++ Testing Framework. +# +# Defines the following variables: +# +# GTEST_FOUND - Found the Google Testing framework +# GTEST_INCLUDE_DIRS - Include directories +# +# Also defines the library variables below as normal +# variables. These contain debug/optimized keywords when +# a debugging library is found. +# +# GTEST_BOTH_LIBRARIES - Both libgtest & libgtest-main +# GTEST_LIBRARIES - libgtest +# GTEST_MAIN_LIBRARIES - libgtest-main +# +# Accepts the following variables as input: +# +# GTEST_ROOT - (as a CMake or environment variable) +# The root directory of the gtest install prefix +# +# GTEST_MSVC_SEARCH - If compiling with MSVC, this variable can be set to +# "MD" or "MT" to enable searching a GTest build tree +# (defaults: "MD") +# +#----------------------- +# Example Usage: +# +# enable_testing() +# find_package(GTest REQUIRED) +# include_directories(${GTEST_INCLUDE_DIRS}) +# +# add_executable(foo foo.cc) +# target_link_libraries(foo ${GTEST_BOTH_LIBRARIES}) +# +# add_test(AllTestsInFoo foo) +# +#----------------------- +# +# If you would like each Google test to show up in CTest as +# a test you may use the following macro. +# NOTE: It will slow down your tests by running an executable +# for each test and test fixture. You will also have to rerun +# CMake after adding or removing tests or test fixtures. +# +# GTEST_ADD_TESTS(executable extra_args ARGN) +# executable = The path to the test executable +# extra_args = Pass a list of extra arguments to be passed to +# executable enclosed in quotes (or "" for none) +# ARGN = A list of source files to search for tests & test +# fixtures. Or AUTO to find them from executable target. +# +# Example: +# set(FooTestArgs --foo 1 --bar 2) +# add_executable(FooTest FooUnitTest.cc) +# GTEST_ADD_TESTS(FooTest "${FooTestArgs}" AUTO) + +#============================================================================= +# Copyright 2009 Kitware, Inc. +# Copyright 2009 Philip Lowman +# Copyright 2009 Daniel Blezek +# Copyright 2014 Nikolay Orliuk (AUTO in GTEST_ADD_TESTS) +# +# 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 distribute this file outside of CMake, substitute the full +# License text for the above reference.) +# +# Thanks to Daniel Blezek for the GTEST_ADD_TESTS code + +function(GTEST_ADD_TESTS executable extra_args) + if(NOT ARGN) + message(FATAL_ERROR "Missing ARGN: Read the documentation for GTEST_ADD_TESTS") + endif() + if(ARGN STREQUAL "AUTO") + get_target_property(ARGN ${executable} SOURCES) + endif() + foreach(source ${ARGN}) + file(READ "${source}" contents) + string(REGEX MATCHALL "TEST_?F?\\(([A-Za-z_0-9 ,]+)\\)" found_tests ${contents}) + foreach(hit ${found_tests}) + string(REGEX REPLACE ".*\\( *([A-Za-z_0-9]+), *([A-Za-z_0-9]+) *\\).*" "\\1.\\2" test_name ${hit}) + add_test(${test_name} ${executable} --gtest_filter=${test_name} ${extra_args}) + endforeach() + endforeach() +endfunction() + +function(_gtest_append_debugs _endvar _library) + if(${_library} AND ${_library}_DEBUG) + set(_output optimized ${${_library}} debug ${${_library}_DEBUG}) + else() + set(_output ${${_library}}) + endif() + set(${_endvar} ${_output} PARENT_SCOPE) +endfunction() + +function(_gtest_find_library _name) + find_library(${_name} + NAMES ${ARGN} + HINTS + ENV GTEST_ROOT + ${GTEST_ROOT} + PATH_SUFFIXES ${_gtest_libpath_suffixes} + ) + mark_as_advanced(${_name}) +endfunction() + +# + +if(NOT DEFINED GTEST_MSVC_SEARCH) + set(GTEST_MSVC_SEARCH MD) +endif() + +set(_gtest_libpath_suffixes lib) +if(MSVC) + if(GTEST_MSVC_SEARCH STREQUAL "MD") + list(APPEND _gtest_libpath_suffixes + msvc/gtest-md/Debug + msvc/gtest-md/Release) + elseif(GTEST_MSVC_SEARCH STREQUAL "MT") + list(APPEND _gtest_libpath_suffixes + msvc/gtest/Debug + msvc/gtest/Release) + endif() +endif() + + +find_path(GTEST_INCLUDE_DIR gtest/gtest.h + HINTS + $ENV{GTEST_ROOT}/include + ${GTEST_ROOT}/include +) +mark_as_advanced(GTEST_INCLUDE_DIR) + +if(MSVC AND GTEST_MSVC_SEARCH STREQUAL "MD") + # The provided /MD project files for Google Test add -md suffixes to the + # library names. + _gtest_find_library(GTEST_LIBRARY gtest-md gtest) + _gtest_find_library(GTEST_LIBRARY_DEBUG gtest-mdd gtestd) + _gtest_find_library(GTEST_MAIN_LIBRARY gtest_main-md gtest_main) + _gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_main-mdd gtest_maind) +else() + # some *nix distributions provides sources (ex. Ubuntu) + if (NOT GTEST_SOURCE) + find_path(GTEST_SOURCE + src/gtest_main.cc + PATHS /usr/src/gtest + DOC "Source code for GTest" + ONLY_CMAKE_FIND_ROOT_PATH) + if(GTEST_SOURCE STREQUAL GTEST_SOURCE-NOTFOUND) + # fallback to libraries + _gtest_find_library(GTEST_LIBRARY gtest) + _gtest_find_library(GTEST_LIBRARY_DEBUG gtestd) + _gtest_find_library(GTEST_MAIN_LIBRARY gtest_main) + _gtest_find_library(GTEST_MAIN_LIBRARY_DEBUG gtest_maind) + else() + message(STATUS "Found GTest sources: ${GTEST_SOURCE}") + add_subdirectory(${GTEST_SOURCE} ${CMAKE_BINARY_DIR}/imported-gtest EXCLUDE_FROM_ALL) + set(GTEST_LIBRARY gtest CACHE INTERNAL "GTest library") + set(GTEST_MAIN_LIBRARY gtest_main CACHE INTERNAL "GTest library for main()") + mark_as_advanced(GTEST_LIBRARY) + mark_as_advanced(GTEST_MAIN_LIBRARY) + endif() + endif() + if(NOT GTEST_SOURCE STREQUAL GTEST_SOURCE-NOTFOUND) + link_directories(${CMAKE_BINARY_DIR}/imported-gtest) + endif() +endif() + +include(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTest DEFAULT_MSG GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY) + +if(GTEST_FOUND) + set(GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIR}) + _gtest_append_debugs(GTEST_LIBRARIES GTEST_LIBRARY) + _gtest_append_debugs(GTEST_MAIN_LIBRARIES GTEST_MAIN_LIBRARY) + set(GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES}) +endif() + diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index c32e093..1fb448f 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,7 +1,7 @@ find_package(GTest REQUIRED) include_directories(${GTEST_INCLUDE_DIRS}) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++0x") set(TESTS simple @@ -15,7 +15,7 @@ foreach(TEST ${TESTS}) message(STATUS "Test ${TEST}") add_executable(${TEST} ${TEST}.cpp) target_link_libraries(${TEST} pthread pjson ${GTEST_BOTH_LIBRARIES}) - add_test(${TEST} ${TEST}) + GTEST_ADD_TESTS(${TEST} "" AUTO) endforeach() add_dependencies(check ${TESTS}) diff --git a/test_perfomance/CMakeLists.txt b/test_perfomance/CMakeLists.txt index 563d2c2..b8283b2 100644 --- a/test_perfomance/CMakeLists.txt +++ b/test_perfomance/CMakeLists.txt @@ -13,7 +13,7 @@ endif() include_directories(${GTEST_INCLUDE_DIRS}) include_directories(../test) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++0x") set(JSON_BIG_SAMPLE "https://raw.github.com/openwebos/luna-init/d8a5419f570726971ca4456493159cf248508b40/files/conf/locale.txt") set(JSON_BIG_SAMPLE_FILE "${CMAKE_CURRENT_BINARY_DIR}/big_sample.json") diff --git a/test_perfomance/performance.cpp b/test_perfomance/performance.cpp index 93d6b44..7e794a3 100644 --- a/test_perfomance/performance.cpp +++ b/test_perfomance/performance.cpp @@ -144,19 +144,9 @@ namespace { TEST(performance, measure_locale_yajl) { - yajl_callbacks dummy_callbacks = { - .yajl_null = cb_kwd, - .yajl_boolean = cb_bool, - /* hmm.. non-trivial?... - .yajl_start_map = cb_kwd, - .yajl_end_map = cb_kwd, - .yajl_start_array = cb_kwd, - .yajl_end_array = cb_kwd, - .yajl_number = cb_str, - .yajl_map_key = cb_ustr, - .yajl_string = cb_ustr, - */ - }; + yajl_callbacks dummy_callbacks {}; + dummy_callbacks.yajl_null = cb_kwd, + dummy_callbacks.yajl_boolean = cb_bool, dummy_callbacks.yajl_start_map = cb_kwd, dummy_callbacks.yajl_end_map = cb_kwd, dummy_callbacks.yajl_start_array = cb_kwd,