[cmake-developers] Generating guards around add_library(... IMPORTED)
Stephen Kelly
steveire at gmail.com
Thu Nov 29 13:44:18 EST 2012
Brad King wrote:
> On 11/29/2012 12:29 PM, Stephen Kelly wrote:
>> Really I think the most practical solution is to generate 'if (NOT
>> TARGET)'
>
> Defining the targets is not the only thing that a targets file does.
> It also sets all the properties. How will you guard those? They
> do not always appear next to the targets. We need a single file-wide
> guard.
Currently GrantleeTargets.cmake looks like this:
# Create imported target grantlee_core
ADD_LIBRARY(grantlee_core SHARED IMPORTED)
SET_TARGET_PROPERTIES(grantlee_core PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "$<$<TARGET_DEFINED:Qt4::QtCore>:
$<TARGET_PROPERTY:Qt4::QtCore,INTERFACE_COMPILE_DEFINITIONS>>"
INTERFACE_INCLUDE_DIRECTORIES "$<$<TARGET_DEFINED:Qt4::QtCore>:
$<TARGET_PROPERTY:Qt4::QtCore,INTERFACE_INCLUDE_DIRECTORIES>>"
)
# Create imported target grantlee_gui
ADD_LIBRARY(grantlee_gui SHARED IMPORTED)
# Load information for each installed configuration.
GET_FILENAME_COMPONENT(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
FILE(GLOB CONFIG_FILES "${_DIR}/GrantleeTargets-*.cmake")
FOREACH(f ${CONFIG_FILES})
INCLUDE(${f})
ENDFOREACH(f)
1) As everything in the same Targets.cmake file was exported together, the
IMPORTED targets for them will be defined all-or-none, so we only need a
guard which checks for the first target.
2) The result of "${_DIR}/GrantleeTargets-*.cmake" can change over time if
new configurations are installed to the same prefix, but I'm sure it's safe
to assume that they won't change *in a single cmake run*. Therefore, once
we've done that once, we don't have to do it again.
1) and 2) imply for me that we can wrap the entire snippet I pasted above in
if (NOT TARGET grantlee_core). Am I missing anything?
Thanks,
Steve.
More information about the cmake-developers
mailing list