Nous avons trois cibles. L'une est une bibliothèque statique, l'autre est une bibliothèque partagée et l'autre est un programme. Nous essayons d'ajouter des indicateurs de liens spécifiques à la cible pour la bibliothèque et le programme partagés.Indicateurs de liaison manquants pour les cibles lors de l'utilisation de set_target_properties et LINK_FLAGS
Lorsque nous essayons de joindre les drapeaux dont nous avons besoin:
if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
CRYPTOPP_XARCH_OPTIONS = "-xarch=ssse3 -xarch=sse4_1 ..."
endif()
...
if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
set_target_properties(cryptest-program PROPERTIES LINK_FLAGS APPEND "-M cryptest.mapfile")
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/cryptest.mapfile DESTINATION ${PROJECT_BINARY_DIR})
set_target_properties(cryptest-program PROPERTIES LINK_FLAGS APPEND ${CRYPTOPP_XARCH_OPTIONS})
endif()
Il en résulte un échec:
CMake Error at CMakeLists.txt:631 (set_target_properties):
set_target_properties called with incorrect number of arguments.
Quand nous essayons d'utiliser X = ${X} Y
syntaxe en raison d'un += operator
manquant, alors les propriétés sont abandonnés en silence:
if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
set_target_properties(cryptest-program PROPERTIES LINK_FLAGS ${LINK_FLAGS} "-M cryptest.mapfile")
file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/cryptest.mapfile DESTINATION ${PROJECT_BINARY_DIR})
set_target_properties(cryptest-program PROPERTIES LINK_FLAGS ${LINK_FLAGS} ${CRYPTOPP_XARCH_OPTIONS})
endif()
Par exemple, e mapfile a été perdu tester si sous Solaris sur les résultats début Xeon:
$ ./cryptest.exe v
ld.so.1: cryptest.exe: fatal: cryptest.exe: hardware capability (CA_SUNW_HW_1) unsupported: 0x4800000 [ AES SSE4.1 ]
Killed
Voici les docs pour set_property
, set_target_properties
et LINK_FLAGS
. Ils ne fournissent pas les détails nécessaires et ne fournissent pas d'exemples. Le doc pour set_target_properties
est particulièrement charmant.
Comment ajouter des indicateurs de liaison spécifiques à la cible?
Les pages de documentation pour les commandes CMake sont en fait ** détaillées **: elles contiennent des informations presque complètes pour l'utilisation correcte des commandes. La documentation de 'set_property' décrit l'option * APPEND *, et la commande l'accepte réellement. Comme ci-contre, la documentation de 'set_target_properties' ne décrit pas cette option, et la commande ne l'accepte pas. Comme vous pouvez le voir à la signature, seules les propriétés * à valeur unique * (non listées) peuvent être définies avec 'set_target_properties'. Quant au "charmant", c'est probablement à cause de * misprint *: "files" doit être lu comme "properties". – Tsyvarev