Comment définir une variable d'environnement de chemin à l'aide de CMake et Visual Studio pour exécuter le test

StackOverflow https://stackoverflow.com/questions/1005901

Question

J'utilise CMake pour générer des fichiers de projet Visual Studio. Je veux exécuter l'exécutable de test après avoir défini la variable d'environnement PATH afin qu'il puisse charger la dll requise. J'ai essayé selon la discussion à l'adresse http: //www.mail-archive. com/cmake@cmake.org/msg21493.html mais cela ne fonctionne pas.

Avez-vous utilisé CMake avec Visual Studio à cette fin? S'il vous plaît partager vos expériences.

De plus, je ne trouve pas de moyen facile de déboguer mon script CMake, par exemple pour voir quelle valeur il attribue à la variable PATH. Définir CMake verbose avec CMAKE_VERBOSE_MAKEFILE n'aide pas. Comment pourrais-je procéder pour le déboguer moi-même?

Était-ce utile?

La solution

Pour définir les paramètres de projet personnalisé dans Visual Studio à partir de CMake, vous pouvez utiliser un fichier XML en tant que modèle pouvant être configuré à partir de CMake pour fonctionner en tant que fichier .user .
Dans mon travail, nous utilisons cela pour définir des paramètres de débogage personnalisés.

Vérifiez le répertoire contenant les fichiers .vcproj générés pour les paramètres utilisateur dans les fichiers .user . Voici un extrait d'un exemple de fichier UserTemplate.vcproj que nous utilisons.

<?xml version="1.0" encoding="Windows-1252"?>
  <VisualStudioUserFile
    ProjectType="Visual C++"
    Version="9.00"
    ShowAllFiles="false"
    >
    <Configurations>
        <Configuration
            Name="Debug|@USERFILE_PLATFORM@"
            >
            <DebugSettings
                Command="@USERFILE_COMMAND_DEBUG@"
                WorkingDirectory="@USERFILE_WORKING_DIRECTORY_DEBUG@"
                CommandArguments="@USERFILE_COMMAND_ARGUMENTS_DEBUG@"
                Attach="false"
                DebuggerType="3"
                Remote="1"
                RemoteMachine="@USERFILE_REMOTE_MACHINE_DEBUG@"
                            <!-- More settings removed for snippet -->
            />
        </Configuration>
            <!-- Rest of Configurations -->

De cette façon, vous pouvez injecter toutes les variables nécessaires de CMake dans le fichier .user . Dans CMake, vous pouvez définir les variables CMake appropriées (et en ajouter d’autres dans le fichier de modèle si vous en avez besoin). Ensuite, vous pouvez faire quelque chose comme ceci pour configurer le fichier.

# Find user and system name
SET(SYSTEM_NAME $ENV{USERDOMAIN} CACHE STRING SystemName)
SET(USER_NAME $ENV{USERNAME} CACHE STRING UserName)

# Configure the template file
SET(USER_FILE ${_projectName}.vcproj.${SYSTEM_NAME}.${USER_NAME}.user)
SET(OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${USER_FILE})
CONFIGURE_FILE(UserTemplate.user ${USER_FILE} @ONLY)

Autres conseils

Je viens juste de repérer cette question. Pour déboguer les fichiers cmake que j'utilise

MESSAGE( STATUS "static text ${variable}" )

Je n'ai jamais eu à définir le chemin pour l'exécution de mes tests. Utilisez-vous CTest? Il semble que le lien que vous suivez soit utilisé avec ctest.

Si j'essayais de faire en sorte que cela fonctionne, j'utiliserais explicitement set_tests_properties .

set_tests_properties(SomeTest PROPERTIES ENVIRONMENT "PATH=c:\somedir;c:\otherdir")

Rendez-le ensuite plus général.

Voici le rapport de demande de fonctionnalité CMake associé:

http://www.kwwidgets.org/Bug/view.php ? id = 8884

UPDATE: résolu conformément à Définition du projet Visual Studio " variables d'environnement personnalisées " réglage avec CMake - merci à Florian pour le commentaire ci-dessous.

Vous pouvez donner toutes les options globalement avec le nouveau VS_USER_PROPS propriété cible (version > = 3.8).

Voici un exemple de travail:

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(SetEnvPathTest)

file(WRITE main.cpp [=[
// http://en.cppreference.com/w/cpp/utility/program/getenv
#include <iostream>
#include <cstdlib>

int main()
{
    if(const char* env_p = std::getenv("PATH"))
        std::cout << "Your PATH is: " << env_p << '\n';
}
]=])
add_executable(${PROJECT_NAME} main.cpp)

file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.Cpp.user.props" [=[
<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LocalDebuggerEnvironment>PATH=C:\Test</LocalDebuggerEnvironment>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LocalDebuggerEnvironment>PATH=C:\Test</LocalDebuggerEnvironment>
  </PropertyGroup>
</Project>
]=])

set_target_properties(
    ${PROJECT_NAME}
    PROPERTIES
        VS_USER_PROPS "${PROJECT_NAME}.Cpp.user.props"
) 

Références

Je voulais juste souligner qu’un ajout très utile qui vous permet de configurer plusieurs variables d'environnement au lieu d'une seule (par exemple, seulement PATH) est donné dans ce lien https://stackoverflow.com/a/40531167/9253113

Par exemple, si en plus de définir PATH, vous vouliez définir une autre variable OTHERVAR il faudrait modifier la ligne

<LocalDebuggerEnvironment>PATH=C:\Test</LocalDebuggerEnvironment>

à

<LocalDebuggerEnvironment>PATH=C:\Test &#xA;OTHERVAR="value of OTHERVAR"</LocalDebuggerEnvironment>

Où le symbole & <; code> & amp; #xA; " indique à l'analyseur XML d'introduire le caractère LF. Donc, plusieurs définitions de variables sont possibles si séparés par le caractère LF (le caractère CR fonctionne également, mais PAS la combinaison CRLF)

Notez également qu'il ne peut PAS y avoir d'espace entre & amp; #xA; et la variable suivante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top