Hi Robert,

thanks for that, the target name change does seem to help but I am still unable to achieve my goal. Here is a simplified example that demonstrates the problem:

cmake_minimum_required (VERSIONĀ  3.1.0 FATAL_ERROR)
project (demo LANGUAGES NONE)
add_custom_target (prog_target COMMAND ${CMAKE_COMMAND} -E touch 
prog${CMAKE_EXECUTABLE_SUFFIX})
add_executable (prog IMPORTED)
add_dependencies (prog prog_target)
set_target_properties (prog PROPERTIES IMPORTED_LOCATION 
${CMAKE_CURRENT_BINARY_DIR}/prog${CMAKE_EXECUTABLE_SUFFIX})
install (TARGETS prog RUNTIME DESTINATION bin)

which gives the following error at CMake configuration:

CMake Error at CMakeLists.txt:7 (install):
  install TARGETS given target "prog" which does not exist.


-- Configuring incomplete, errors occurred!

So the target that 'add_executable(name IMPORTED)' creates is not a real executable target. I can change its properties but the 'install(TARGETS ...)' command thinks it does not exist. Note that a executable target is a very simple demonstration and I understand that I can use 'install(PROGRAM ...)' just about as easily, but when it comes to a shared library it gets a lot more complex when using, exporting, and instlling it, and it seems that IMPORTED targets fall well short of useful when they are actually produced by the current CMake project.

I can understand that an IMPORTED target is perhaps not meant to be installable but if so then your statement that "The goal that you have is fully supported by CMake" seems to be incorrect. To reiterate, I am trying to use foreign tools to make binary targets and wish to have CMake treat them *as if* they were created by supported languages like C, ++, or Fortran. Am I still missing something?

Regards
Bill Somerville.

On 24/05/2019 20:23, Robert Maynard wrote:
Hi,

The goal that you have is fully supported by CMake. You have just run
into a bug in CMake, and you should report this to
https://gitlab.kitware.com/cmake/cmake/issues .
Basically at a very high level the name out the add_executable target
`callback_generator` is the same as the internal name that CMake is
using for the add_custom_command. This than causes some logic in CMake
(cmTargetTraceDependencies) to incorrectly build another link between
the add_custom_command and your add_executable.

The easiest way to solve this issue is name the add_executable target
to have a different name than the output of your custom command minus
file extension. So maybe something like  `callback_generator_exec`

On Fri, May 24, 2019 at 2:02 PM Bill Somerville <b...@classdesign.com> wrote:
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.

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake


-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
https://cmake.org/mailman/listinfo/cmake

Reply via email to