UseJava: Guard against multiple inclusion of imported targets does not include namespace of targets
The guard against multiple inclusion of imported targets generated with the UseJava
module does not include namespace of targets so you may see a duplicate target error:
CMake Error at /path/to/myJavaTargets.cmake:39 (add_library):
add_library cannot create imported target
"myNamespace::myTarget" because another target with the same
name already exists.
CMakeLists.txt:
cmake_minimum_required(VERSION 3.9)
...
find_package(Java REQUIRED)
include(UseJava)
...
export_jars(TARGETS myTarget NAMESPACE myNamespace FILE myJavaTargets.cmake)
...
myJavaTargets.cmake:
cmake_minimum_required(VERSION 2.8)
cmake_policy(PUSH)
cmake_policy(VERSION 2.8)
#----------------------------------------------------------------
# Generated CMake Java target import file.
#----------------------------------------------------------------
# Protect against multiple inclusion, which would fail when already imported targets are added once more.
set(_targetsDefined)
set(_targetsNotDefined)
set(_expectedTargets)
foreach(_expectedTarget myTarget) # <-- BUG: SHOULD BE myNamespace:: myTarget
list(APPEND _expectedTargets ${_expectedTarget})
if(TARGET ${_expectedTarget})
list(APPEND _targetsDefined ${_expectedTarget})
else()
list(APPEND _targetsNotDefined ${_expectedTarget})
endif()
endforeach()
if("%${_targetsDefined}" STREQUAL "%${_expectedTargets}")
unset(_targetsDefined)
unset(_targetsNotDefined)
unset(_expectedTargets)
cmake_policy(POP)
return()
endif()
if(NOT "${_targetsDefined}" STREQUAL "")
message(FATAL_ERROR
"Some (but not all) targets in this export set were already defined.\n"
"Targets Defined: ${_targetsDefined}\n"
"Targets not yet defined: ${_targetsNotDefined}\n")
endif()
unset(_targetsDefined)
unset(_targetsNotDefined)
unset(_expectedTargets)
# Create imported target myNamespace::myTarget
add_library(myNamespace::myTarget IMPORTED STATIC)
set_target_properties(myNamespace::myTarget PROPERTIES
IMPORTED_LOCATION "/path/to/myTarget.jar"
JAR_FILE "/path/to/myTarget.jar")
cmake_policy(POP)
Same issue for install_jar_exports
. Probably broken ever since namespaced imported target support was added for Java in 789c8de3.