[CMake] Dependency cycle - why?

Bill Somerville bill at classdesign.com
Fri May 24 13:55:01 EDT 2019


On 13/05/2019 12:03, Bill Somerville wrote:
>
> Hi folks,
>
> I am struggling to understand what the problem is with this:
>
> find_program (GO go)
> set (GOPATH "${CMAKE_CURRENT_BINARY_DIR}/go")
> file (MAKE_DIRECTORY ${GOPATH})
>
> set (sources ${CMAKE_CURRENT_SOURCE_DIR}/callback_generator.go)
> set (build_command ${GO} build)
> set (output callback_generator${CMAKE_EXECUTABLE_SUFFIX})
> add_custom_command (OUTPUT ${output}
>    COMMAND ${CMAKE_COMMAND} -E env GOPATH=${GOPATH} CGO_CFLAGS=${CMAKE_CGO_CFLAGS} ${build_command} -o ${output} ${CMAKE_GO_FLAGS} ${sources}
>    DEPENDS ${sources}
>    VERBATIM)
> add_custom_target (callback_generator_target DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${output})
> add_executable (callback_generator IMPORTED)
> set_target_properties (callback_generator
>    PROPERTIES
>    IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/${output}
>    )
> add_dependencies (callback_generator callback_generator_target)
>
> add_custom_target (server ALL DEPENDS callback_generator)
>
> which gives this error:
>
> >cmake --version
> cmake --version
> cmake version 3.14.3
>
> >cmake -G "MinGW Makefiles" ..\..
> cmake -G "MinGW Makefiles" ..\..
> -- Configuring done
> CMake Error: The inter-target dependency graph contains the following strongly connected component (cycle):
>    "callback_generator_target" of type UTILITY
>      depends on "callback_generator_target" (strong)
> The component contains at least one cycle consisting of strong dependencies (created by add_dependencies) that cannot be broken.
>
> The set_target_properties () call seems to be part of the problem but 
> I don't understand why.
>
> Regards
> Bill Somerville.
>
Hi again,

answering my own post since no one has replied. Clearly my question was 
too specific. Let me try again with a more general question. I have 
tools that can generate executables (programs, static libraries, and 
shared libraries, including DLL import libraries on MS Windows). These 
tools are not directly supported by CMake but they are both needed 
within a project that uses them and installs them as the project 
artefacts. How do I integrate, for example a shared library, into a 
CMake project as if it were produced by a supported toolchain like C or 
C++? The library is produced by an add_custom_target() command (not 
add_custom_command() since the underlying tools do their own dependency 
checking so it is right to run the target commands every build). I need 
to have a target that I can use in target_link_libraries() and 
install(TARGETS ...) just like one would with a CMake generated library 
made with add_library() and programs made with add_executable().

If it helps the tools that are not supported by CMake are the Go 
language build tools. The project builds some Go programs as utilities 
but the main project artefact is a shared library with a C language API 
built using the cgo tools. There are many of C and C++ test programs and 
example programs as well in the project which need to link against the 
project shared library etc.

Regards
Bill Somerville.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20190524/fc993540/attachment.html>


More information about the CMake mailing list