From 83589cca345d2f03d93b0555437aa480e0ed6699 Mon Sep 17 00:00:00 2001 From: "zhanyong.wan" Date: Fri, 5 Mar 2010 21:21:06 +0000 Subject: Supports building gtest as a DLL (by Vlad Losev). --- CMakeLists.txt | 57 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 9 deletions(-) (limited to 'CMakeLists.txt') diff --git a/CMakeLists.txt b/CMakeLists.txt index aa16fa0b..0cdb2e80 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,10 +54,10 @@ endif() # # Defines the gtest & gtest_main libraries. User tests should link # with one of them. - -function(cxx_library name cxx_flags) +function(cxx_library_with_type name type cxx_flags) + # type can be either STATIC or SHARED to denote a static or shared library. # ARGN refers to additional arguments after 'cxx_flags'. - add_library(${name} STATIC ${ARGN}) + add_library(${name} ${type} ${ARGN}) set_target_properties(${name} PROPERTIES COMPILE_FLAGS "${cxx_flags}") @@ -66,8 +66,22 @@ function(cxx_library name cxx_flags) endif() endfunction() -cxx_library(gtest "${cxx_default}" src/gtest-all.cc) -cxx_library(gtest_main "${cxx_default}" src/gtest_main.cc) +function(cxx_static_library name cxx_flags) + cxx_library_with_type(${name} STATIC "${cxx_flags}" ${ARGN}) +endfunction() + +function(cxx_shared_library name cxx_flags) + cxx_library_with_type(${name} SHARED "${cxx_flags}" ${ARGN}) +endfunction() + +function(cxx_library name cxx_flags) + # TODO(vladl@google.com): Make static/shared a user option. + cxx_static_library(${name} "${cxx_flags}" ${ARGN}) +endfunction() + +# Static versions of Google Test libraries. +cxx_static_library(gtest "${cxx_default}" src/gtest-all.cc) +cxx_static_library(gtest_main "${cxx_default}" src/gtest_main.cc) target_link_libraries(gtest_main gtest) ######################################################################## @@ -85,16 +99,22 @@ option(build_gtest_samples "Build gtest's sample programs." OFF) # creates a named target that depends on the given lib and is built # from the given source files. dir/name.cc is implicitly included in # the source file list. -function(cxx_executable name dir lib) +function(cxx_executable_with_flags name dir cxx_flags lib) add_executable(${name} ${dir}/${name}.cc ${ARGN}) - set_target_properties(${name} - PROPERTIES - COMPILE_FLAGS "${cxx_default}") + if (cxx_flags) + set_target_properties(${name} + PROPERTIES + COMPILE_FLAGS "${cxx_flags}") + endif() target_link_libraries(${name} ${lib}) endfunction() +function(cxx_executable name dir lib) + cxx_executable_with_flags(${name} ${dir} "${cxx_default}" ${lib} ${ARGN}) +endfunction() + if (build_gtest_samples) cxx_executable(sample1_unittest samples gtest_main samples/sample1.cc) cxx_executable(sample2_unittest samples gtest_main samples/sample2.cc) @@ -207,6 +227,25 @@ if (build_all_gtest_tests) cxx_test_with_flags(gtest_no_rtti_unittest "${cxx_no_rtti}" gtest_main_no_rtti test/gtest_unittest.cc) + set(cxx_use_shared_gtest "${cxx_default} -DGTEST_LINKED_AS_SHARED_LIBRARY=1") + set(cxx_build_shared_gtest "${cxx_default} -DGTEST_CREATE_SHARED_LIBRARY=1") + if (MSVC) + # Disables the "class 'X' needs to have dll-interface to be used + # by clients of class 'Y'" warning. This particularly concerns generic + # classes like vector that MS doesn't mark as exported. + set(cxx_use_shared_gtest "${cxx_use_shared_gtest} -wd4251") + set(cxx_build_shared_gtest "${cxx_build_shared_gtest} -wd4251") + endif() + + cxx_shared_library(gtest_dll "${cxx_build_shared_gtest}" + src/gtest-all.cc) + + # TODO(vladl): This and the next tests may not run in the hermetic + # environment on Windows. Re-evaluate and possibly make them + # platform-conditional after implementing hermetic builds. + cxx_test_with_flags(gtest_dll_test_ "${cxx_use_shared_gtest}" + gtest_dll test/gtest_dll_test_.cc) + if (NOT(MSVC AND (MSVC_VERSION EQUAL 1600))) # The C++ Standard specifies tuple_element. # Yet MSVC 10's declares tuple_element. -- cgit v1.2.3