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?
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 .
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'environnementSET
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 exempleadd_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.