Cómo establecer la variable de entorno de ruta usando CMake y Visual Studio para ejecutar la prueba

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

Pregunta

Estoy usando CMake para generar archivos de proyecto de Visual Studio. Quiero ejecutar el ejecutable de prueba después de configurar la variable de entorno PATH para que pueda cargar la dll requerida. Intenté según la discusión en http: //www.mail-archive. com/cmake@cmake.org/msg21493.html pero no funciona.

¿Ha utilizado CMake con Visual Studio para este propósito? Por favor comparta sus experiencias.

Además, no encuentro una manera fácil de depurar mi script CMake, por ejemplo, para ver qué valor asigna a la variable PATH. La configuración de CMake verbose con CMAKE_VERBOSE_MAKEFILE no ayuda. ¿Cómo voy a depurarlo yo mismo?

¿Fue útil?

Solución

Para establecer una configuración de proyecto personalizada en Visual Studio desde CMake, puede usar un archivo XML como plantilla que se puede configurar desde CMake para que funcione como el archivo .user .
En mi trabajo usamos esto para establecer parámetros de depuración personalizados.

Verifique el directorio que contiene los archivos .vcproj generados para la configuración del usuario en los archivos .user . Aquí hay un fragmento de un ejemplo del archivo UserTemplate.vcproj que usamos.

<?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 esta manera puede inyectar las variables necesarias de CMake en el archivo .user . En CMake puede establecer las variables apropiadas de CMake (y agregar más en el archivo de plantilla si las necesita). A continuación, puede hacer algo como esto para configurar el archivo.

# 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)

Otros consejos

Acabo de ver esta pregunta ahora. Para depurar los archivos cmake que uso

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

Nunca he tenido que establecer la ruta para que mis pruebas se ejecuten. ¿Estás utilizando CTest? Parece que el enlace que estás siguiendo se usa con ctest.

Si estuviera intentando que esto funcionara, usaría set_tests_properties explícitamente primero.

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

Luego hazlo más general.

Aquí se relaciona el informe de solicitud de características de CMake:

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

ACTUALIZACIÓN: resuelto según Establecer el proyecto de Visual Studio " variables de entorno personalizadas " configurando con CMake - gracias a Florian por el comentario a continuación.

Puede dar cualquier opción globalmente con el nuevo VS_USER_PROPS propiedad de destino (versión > = 3.8).

Aquí hay un ejemplo de trabajo:

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"
) 

Referencias

Sólo quería señalar que una adición muy útil que le permite configurar múltiples variables de entorno en lugar de una sola (por ejemplo, solo PATH) se encuentra en este enlace https://stackoverflow.com/a/40531167/9253113

Por ejemplo, si además de configurar PATH, desea establecer otra variable OTHERVAR uno tendría que modificar la línea

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

a

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

Donde está el símbolo " & amp; #xA; " le dice al analizador xml que introduzca el carácter LF. Así que múltiples definiciones de variables son posibles si están separados por el carácter LF (también funciona el carácter CR pero NO la combinación CRLF)

Observe también que NO PUEDE haber espacio entre & amp; #xA; y la siguiente variable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top