CMake conflict with multiple

This is my first post on StackOverflow, so I apologize if something is wrong with my question.

I am new to CMake, and I have a problem trying to import gtest (Google Test) into a C ++ project with an existing gtest file that is used in the library.

My root file CMakeLists.txtis this (My changes are made between β€œStart Changes” and β€œEnd Changes”):

cmake_minimum_required(VERSION 2.6)

project(nifi-minifi-cpp)
set(PROJECT_NAME "nifi-minifi-cpp")
set(PROJECT_VERSION_MAJOR 0)
set(PROJECT_VERSION_MINOR 2)
set(PROJECT_VERSION_PATCH 0)

#### Establish Project Configuration ####
# Enable usage of the VERSION specifier
# https://cmake.org/cmake/help/v3.0/policy/CMP0048.html#policy:CMP0048
IF(POLICY CMP0048)
  CMAKE_POLICY(SET CMP0048 OLD)
ENDIF(POLICY CMP0048)

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
        message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Search for threads
find_package(Threads REQUIRED)

# Provide custom modules for the project
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

add_subdirectory(thirdparty/yaml-cpp-yaml-cpp-0.5.3)
add_subdirectory(libminifi)
add_subdirectory(main)

# Generate source assembly
set(ASSEMBLY_BASE_NAME "${CMAKE_PROJECT_NAME}-${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
set(CPACK_SOURCE_GENERATOR "TGZ")
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${ASSEMBLY_BASE_NAME}-source")
set(CPACK_SOURCE_IGNORE_FILES "/build/;~$;${CPACK_SOURCE_IGNORE_FILES};${CMAKE_SOURCE_DIR}/.git/;${CMAKE_SOURCE_DIR}/.idea/;${CMAKE_SOURCE_DIR}/cmake-build-debug/")

# Generate binary assembly
install(FILES conf/minifi.properties conf/config.yml
        DESTINATION conf
        COMPONENT bin)

install(PROGRAMS bin/minifi.sh
        DESTINATION bin
        COMPONENT bin)

install(FILES LICENSE README.md NOTICE
        DESTINATION .
        COMPONENT bin)

set(CPACK_GENERATOR "TGZ")
set(CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY 1)
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Apache NiFi MiNiFi C++ version ${VERSION}")
set(CPACK_PACKAGE_VENDOR "Apache NiFi")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
set(CPACK_PACKAGE_FILE_NAME "${ASSEMBLY_BASE_NAME}")
set(CPACK_BINARY_TGZ, "ON")

set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)
set(CPACK_COMPONENTS_ALL bin)

include(CPack)

#### Begin changes
# Set up testing
enable_testing()
set(GTEST_ROOT "thirdparty/googletest/googletest")
add_subdirectory(thirdparty/googletest)
#
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})
add_executable(tailFileTest
        test/TailFileTest.cpp
        )
target_link_libraries(tailFileTest  ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG})

add_test(
        NAME tailFileTest
        COMMAND tailFileTest
)


#add_dependencies(${PROJECT_TEST_NAME} googletest)

#set(PROJECT_TEST_NAME ${PROJECT_NAME}_test)
#file(GLOB TEST_SRC_FILES ${PROJECT_SOURCE_DIR}/test/*.cpp)
#
#add_executable(${PROJECT_TEST_NAME} ${TEST_SRC_FILES})
#add_dependencies(${PROJECT_TEST_NAME} googletest)
#### End changes

And CMake output at startup cmake ..(possibly a more relevant error message):

CMake Error at thirdparty/googletest/googletest/cmake/internal_utils.cmake:151 (add_library):
  add_library cannot create target "gtest" because another target with the
  same name already exists.  The existing target is a static library created
  in source directory
  "/home/dev/nifi-minifi-cpp/thirdparty/yaml-cpp-yaml-cpp-0.5.3/test/gmock-1.7.0/gtest".
  See documentation for policy CMP0002 for more details.

I currently have a copy of googletest in:

/home/g/dev/nifi-minifi-cpp/thirdparty/googletest

And the existing googletest directory is inside:

/home/g/dev/nifi-minifi-cpp/thirdparty/yaml-cpp-yaml-cpp-0.5.3/test/gmock-1.7.0

Here is a brief overview of the directory structure:

.
β”œβ”€β”€ CMakeLists.txt
β”œβ”€β”€ test                             [<- My directory to store and run tests]
└── thirdparty
    β”œβ”€β”€ googletest                   [<- My googletest directory]
    └── yaml-cpp-yaml-cpp-0.5.3
        β”œβ”€β”€ test
        β”‚   β”œβ”€β”€ CMakeLists.txt
        β”‚   β”œβ”€β”€ gmock-1.7.0          [<- The existing googletest directory]

278 directories, 2096 files

The overall goal is to have a directory testto run tests.

, , , , . , , , , , , .

+4
1

double, 3d-party (gtest ) add_subdirectory.

add_subdirectory(gmock-1.7.0)    

yaml-cpp,

add_subdirectory(thirdparty/googletest)

CMakeLists.txt.

CMake, add_subdirectory.

  • add_subdirectory ExternalProject_Add execute_process. googletest ( find_package(GTest) ), googletest.

  • (yaml-cpp) googletest .

    option(YAML_CPP_BUILD_TOOLS "Enable testing and parse tools" OFF)
    

    add_subdirectory(thirdparty/yaml-cpp-yaml-cpp-0.5.3)
    

    ( CMakeLists.txt, , CMake).

    , util/ yaml-cpp.

  • yaml-cpp ExternalProject_Add + execute_process. , .

+1

Source: https://habr.com/ru/post/1669022/


All Articles