[cmake-developers] Problems when creating config files and add_dependencies

Roman Wüger roman.wueger at gmx.at
Fri Jun 12 07:19:48 EDT 2015


Hello,

 

short description: I want to have a configuration header file per unit test.

 

For this purpose I wrote the following function, which creates a header file
in “${CURRENT_BINARY_DIR}” and copy all test files into the binary
directory.

Howewer, I got it to work when I use add_custom_target as pre_build target,
but this doesn’t work on *nix systems.

 

So here is the current function:

function(CopyUnitTestFiles projectName)

    set(UnitTestConfigName "${projectName}UnitTestConfig")

    set(UNITTESTCONFIGNAME "${projectName}UnitTestConfig")

    set(PROJECT_NAME ${projectName})

    set(OUTPUT_FILENAME
"${CMAKE_CURRENT_BINARY_DIR}/${UnitTestConfigName}.cmake")

    set(HEADER_INPUT_FILENAME
"${CMAKE_SOURCE_DIR}/cmake/UnitTestConfig.h.in")

    set(HEADER_OUTPUT_FILENAME
"${CMAKE_CURRENT_BINARY_DIR}/${UnitTestConfigName}.h")

    set(CURRENT_FILENAME "${OUTPUT_FILENAME}")

    set(RELATIVE_FILEPATH "testfiles/${projectName}")

    set(INCLUDE_GUARD "${projectName}_UNITTESTCONFIG_H")

    string(TOUPPER ${INCLUDE_GUARD} INCLUDE_GUARD)

 

    set(TARGET_FILE_DIR $<TARGET_FILE_DIR:${projectName}>)

    set(CopyUnitTestFilesProjectName  CopyUnitTestFiles_${projectName})

    configure_file(${CMAKE_SOURCE_DIR}/cmake/UnitTestConfig.cmake.in
${OUTPUT_FILENAME} @ONLY)

    add_custom_target(${CopyUnitTestFilesProjectName}

                      COMMAND ${CMAKE_COMMAND}
-DABSFILEPATH=${TARGET_FILE_DIR} -P ${OUTPUT_FILENAME}

                      COMMAND ${CMAKE_COMMAND} -E remove_directory
${TARGET_FILE_DIR}/testfiles/${projectName}

                      COMMAND ${CMAKE_COMMAND} -E copy_directory
${CMAKE_CURRENT_SOURCE_DIR}/data/testfiles
${TARGET_FILE_DIR}/testfiles/${projectName}

                     )

    set_property(TARGET ${CopyUnitTestFilesProjectName} PROPERTY FOLDER
"Custom Targets/CopyUnitTestFiles")

    add_dependencies(${projectName} ${CopyUnitTestFilesProjectName})

endfunction(CopyUnitTestFiles)

 

The function should be called like:

 

project(UnitTest1)

add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES})

target_link_libraries(${PROJECT_NAME} gtest gtest_main)

 

CopyUnitTestFiles(${PROJECT_NAME})

 

 

The error message which I get:

-- Configuring done

CMake Error: The inter-target dependency graph contains the following
strongly connected component (cycle):

  "CopyUnitTestFiles_UnitTest1" of type UTILITY

    depends on "UnitTest1" (strong)

  "UnitTest1" of type EXECUTABLE

    depends on "CopyUnitTestFiles_UnitTest1" (strong)

At least one of these targets is not a STATIC_LIBRARY.  Cyclic dependencies
are allowed only among static libraries.

 

 

UnitTestConfig.cmake.in:

    set(ProjectName "@PROJECT_NAME@")

    set(UnitTestConfigName "@UNITTESTCONFIGNAME@")

    set(NAMESPACE "${UnitTestConfigName}")

    set(UNITTESTNAME "${ProjectName}")

    set(RELATIVE_FILEPATH "testfiles/${ProjectName}")

    set(ABSOLUTE_FILEPATH "${ABSFILEPATH}/testfiles/${ProjectName}")

    set(INCLUDE_GUARD "${ProjectName}_UNITTESTCONFIG_H")

    string(TOUPPER ${INCLUDE_GUARD} INCLUDE_GUARD)

 

    configure_file("@HEADER_INPUT_FILENAME@" "@HEADER_OUTPUT_FILENAME@")

 

UnitTestConfig.h.in:

#ifndef @INCLUDE_GUARD@

#define @INCLUDE_GUARD@

 

namespace @NAMESPACE@ {

    const char *const UnitTestName = "@UNITTESTNAME@";

    const char *const RelativeTestFilesPath = "@RELATIVE_FILEPATH@";

    const char *const AbsoluteTestFilesPath = "@ABSOLUTE_FILEPATH@";

    const wchar_t *const UnitTestNameW= L"@UNITTESTNAME@";

    const wchar_t *const RelativeTestFilesPathW = L"@RELATIVE_FILEPATH@";

    const wchar_t *const AbsoluteTestFilesPathW = L"@ABSOLUTE_FILEPATH@";

}

 

#endif // @INCLUDE_GUARD@

 

It would be great if generator expressions can be used with configure_file
to avoid such overhead.

Does anyone have an idea on how to solve that?

 

Best Regards

Roman

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake-developers/attachments/20150612/0e5c7190/attachment-0001.html>


More information about the cmake-developers mailing list