web-dev-qa-db-fra.com

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

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 à http://www.mail-archive.com/[email protected]/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? 

40
amit

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

Recherchez dans le répertoire contenant les fichiers .vcproj générés 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 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)
42
pkit

Juste repéré cette question maintenant. Pour déboguer les fichiers cmake que j'utilise 

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

Je n'ai jamais eu à définir le chemin pour faire exécuter 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 d'abord set_tests_properties explicitement.

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

Alors rendez-le plus général.

9
iain

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

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

UPDATE: résolu conformément à Définissez le paramètre "variables d'environnement personnalisées" du projet Visual Studio avec CMake - grâce à Florian pour le commentaire ci-dessous.

4
mloskot

Vous pouvez donner n'importe quelles options globalement avec la nouvelle propriété VS_USER_PROPS target (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

3
Florian

Je voulais juste souligner qu’un ajout très utile Qui vous permet de configurer plusieurs variables d’environnement, par opposition à une seule (par exemple, uniquement PATH) Est donné dans ce lien https://stackoverflow.com/a/40531167/9253113

Par exemple, si, en plus de définir PATH, vous souhaitez définir une autre variable OTHERVARone devra modifier la ligne 

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

à 

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

Où le symbole "&#xA;" indique à l'analyseur XML d'introduire le caractère LF. Donc, plusieurs définitions de variables Sont possibles si elles sont séparées par le caractère LF

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

0
Francisco Martinez