web-dev-qa-db-fra.com

Comment modifier les variables d'environnement passées à la cible CMake personnalisée?

Peut-être que je manque quelque chose d'évident, mais je n'arrive pas à comprendre comment définir explicitement les variables d'environnement qui peuvent être vues par les processus lancés via add_custom_target() .

J'ai essayé ce qui suit:

set(ENV{PATH} "C:/Some/Path;$ENV{PATH}")
add_custom_target(newtarget somecommand)

Malheureusement, le %PATH% la variable d'environnement apparaît inchangée en somecommand. (J'ai mis en place un Gist qui reproduit le problème ici .)

Qu'est-ce que je fais mal?

24
Nathan Osman

Une façon portable de définir des variables d'environnement pour une cible personnalisée est d'utiliser la commande de mode d'outil en ligne de commande de CMake env:

env [--unset=NAME]... [NAME=VALUE]... COMMAND [ARG]...
Run command in a modified environment.

Par exemple.:

add_custom_target(newtarget ${CMAKE_COMMAND} -E env NAME=VALUE somecommand)

Voir aussi Mode outil de ligne de commande .

20
sakra

Vous définissez la variable d'environnement à configuration étape, mais la commande spécifiée pour add_custom_target Est exécutée à build étape. Voir aussi la FAQ de CMake: Comment puis-je obtenir ou définir des variables d'environnement?

[...]
variables d'environnement SET dans CMakeLists.txt seulement prennent effet pour cmake lui-même ( configure-time), donc vous ne peut pas utiliser cette méthode pour définir une variable d'environnement dont une commande personnalisée pourrait avoir besoin ( build-time). À moins que les variables d'environnement ne soient prises en charge par diverses commandes CMake (par exemple add_custom_command(), actuellement pas encore pris en charge), une solution de contournement acceptable peut être d'appeler des scripts Shell à la place qui encapsulent les commandes à exécuter.

Actuellement, add_custom_target (Et d'autres commandes, qui définissent des actions pour l'étape de construction, par exemple add_custom_command) Ne prend pas en charge les variables d'environnement à configuration simple. Comme conseillé dans ce rapport de bug , pour définir la valeur de la variable sans espaces sous Linux, vous pouvez ajouter la commande avec les clauses "VAR = VAL". Pour les cas généraux, vous pouvez préparer le script wrapper, qui configure l'environnement et exécute la commande réelle:

Sous Windows:

wrapper.bat :

@ECHO OFF
set PATH=C:\\Some\\Path;%PATH%
%*

CMakeLists.txt :

add_custom_target(...
    COMMAND cmd /c ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.bat <real_command> args...
)

Sous Linux:

wrapper.sh :

export "PATH=/Some/Path:$PATH"
eval "$*"

CMakeLists.txt :

add_custom_target(...
    COMMAND /bin/sh ${CMAKE_CURRENT_SOURCE_DIR}/wrapper.sh <real_command> args...
)

Si la valeur de la variable dépend de la configuration, vous pouvez configurer le script d'encapsuleur avec configure_file.

[~ # ~] mise à jour [~ # ~] :

Comme indiqué par @sakra, le mode outil env de l'exécutable cmake peut être utilisé comme script d'encapsulation:

add_custom_target(...
    COMMAND ${CMAKE_COMMAND} -E env "PATH=C:/Some/Path;$ENV{PATH}" <real_command> args...
)

Cette méthode est disponible depuis CMake 3.2.

16
Tsyvarev