web-dev-qa-db-fra.com

Chemin d'accès au fichier de sortie cible

J'ai une cible de bibliothèque .so créée par add_library Et j'ai besoin de passer un chemin absolu vers cette bibliothèque vers un script externe. Maintenant, j'ai ${LIBRARY_OUTPUT_PATH}/${CMAKE_SHARED_LIBRARY_PREFIX}LangShared${CMAKE_SHARED_LIBRARY_SUFFIX} Pour cela (LIBRARY_OUTPUT_PATH Est défini dans mon CMakeLists.txt). Cela ressemble à un codage en dur pour moi, car il se cassera dès que la cible sera renommée ou que certaines de ses propriétés seront modifiées. Existe-t-il un moyen d'obtenir un chemin absolu vers la sortie de add_library?

44
Dmitry Risenberg

Vous devez utiliser un expression de générateur pour cela.

De la documentation pour add_custom_command et les documents pour les expressions de générateur:

Les arguments de COMMAND peuvent utiliser des "expressions de générateur" ...

Les expressions de générateur sont évaluées lors de la génération du système de génération pour produire des informations spécifiques à chaque configuration de génération.

Dans ce cas, en supposant que votre cible de bibliothèque s'appelle "MyLib", l'expression du générateur représentant le chemin d'accès complet à la bibliothèque construite serait:

$<TARGET_FILE:MyLib>
46
Fraser

Essayer:

get_property(fancy_lib_location TARGET fancy_lib PROPERTY LOCATION)
message (STATUS "fancy_lib_location == ${fancy_lib_location}")

fancy_lib Est la cible créée avec add_library (fancy_lib SHARED ...).

J'ai trouvé que cela fonctionne directement avec les générateurs Makefile, mais il y a plus de travail à faire pour les générateurs Visual Studio car la valeur de fancy_lib_location N'est pas ce à quoi vous vous attendez:

  1. fancy_lib_location Contiendra une référence incorporée à une référence $(OutDir) spécifique à Visual-Studio que vous devrez remplacer par la valeur de la variable CMake CMAKE_BUILD_TYPE (Qui se résout en quelque chose comme Debug, ou Release).
  2. Au moins pour CMake 2.8.1, et au moins sur les cibles Visual Studio, et si vous avez défini la variable CMAKE_DEBUG_POSTFIX, Alors elle ne sera pas être inclus dans la valeur (qui peut ou non être un bug, je ne sais pas).
24
bgoodr

Pour développer la réponse de @bgooddr, voici une fonction CMake pour obtenir l'emplacement d'une cible:

function(get_fancy_lib_location)
    set(options)
    set(multiValueArgs LIB)
    set(oneValueArgs LOCATION)
    cmake_parse_arguments(get_fancy_lib_location "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
    message (STATUS "fancy_lib  == ${get_fancy_lib_location_LIB}")

    get_property(fancy_lib_location TARGET "${get_fancy_lib_location_LIB}" PROPERTY LOCATION)
    message (STATUS "fancy_lib_location == ${fancy_lib_location}")

    set(${get_fancy_lib_location_LOCATION} ${fancy_lib_location})
endfunction()
0
Blue7