Hi,

I'm building hpx without cuda, and in examples/qt/, tools/ and tools/inspect/ 
cmake errors out with the following error:

CMake Error at examples/qt/CMakeLists.txt:26 (target_link_libraries):
  Policy CMP0023 is not set: Plain and keyword target_link_libraries
  signatures cannot be mixed.  Run "cmake --help-policy CMP0023" for policy
  details.  Use the cmake_policy command to set the policy and suppress this
  warning.

  The keyword signature for target_link_libraries has already been used with
  the target "qt_exe".  All uses of target_link_libraries with a target must
  be either all-keyword or all-plain.

  The uses of the keyword signature are here:

   * cmake/HPX_SetupTarget.cmake:202 (target_link_libraries)


This happens AFAICT because in HPX_SetupTarget.cmake there is the following 
code:
if(NOT HPX_WITH_CUDA)  # Cuda needs plain target_link_libraries() signature
  target_link_libraries(${target} PUBLIC ${hpx_libs} ${target_DEPENDENCIES})
else()
  target_link_libraries(${target} ${hpx_libs} ${target_DEPENDENCIES})
endif()

i.e. without CUDA the "PUBLIC" signature of target_link_libraries() is used.
Now in the mentioned directories target_link_libraries() is used without 
PUBLIC/PRIVATE/INTERFACE keywords.
This is (by default) not allowed (see here https://cmake.org/cmake/help/v3.8/
policy/CMP0023.html ).

I could make it work for me by adding "PRIVATE" (or "PUBLIC") to the 
respective target_link_libraries() calls, e.g. in examples/qt/.
But I guess this will break then in the other case, when building with CUDA.

The "PUBLIC" was added last November without much explanation:
https://github.com/STEllAR-GROUP/hpx/commit/
fb1fc68ea82a4623b5644f15f1d508fa9733f442

In src/CMakeLists.txt this is handled by duplicating the whole 
target_link_libraries()-calls in an if(WITH_CUDA) branch.

I see the following options to make it always work:

1. add something like hpx_target_link_libraries(), which wraps 
target_link_libraries() and contains this if(WITH_CUDA) - maybe a bit overkill 
?

2. set a HPX_TLL_KEYWORD variable at the top level and use that then 
everywhere in the target_link_libraries() calls:
set( HPX_TLL_KEYWORD)
if (NOT HPX_WITH_CUDA)
  set(HPX_TLL_KEYWORD PUBLIC)
endif()

3. add the if(WITH_CUDA) in the three CMakeLists.txt which have a problem 
right now.

4. remove the "PUBLIC" from hpx_setup_target().
But I guess there was a reason why it was added ?

5. add PUBLIC also with CUDA, but I guess there is a reason it is not there ?

I think my favourite is option 2, add a keyword-variable.

Alex

_______________________________________________
hpx-users mailing list
[email protected]
https://mail.cct.lsu.edu/mailman/listinfo/hpx-users

Reply via email to