Как установить переменную окружения Path с помощью CMake и Visual Studio для запуска теста
-
05-07-2019 - |
Вопрос
Я использую CMake для создания файлов проекта Visual Studio.Я хочу запустить тестовый исполняемый файл после установки переменной окружения PATH, чтобы он мог загрузить необходимую библиотеку dll.Я попытался в соответствии с обсуждением на http://www.mail-archive.com/cmake@cmake.org/msg21493.html но это не работает.
Использовали ли вы CMake с Visual Studio для этой цели?Пожалуйста, поделитесь своим опытом.
Кроме того, я не нахожу простого способа отладить мой скрипт CMake, например, чтобы посмотреть, какое значение он присваивает переменной PATH.Настройка CMake verbose с помощью CMAKE_VERBOSE_MAKEFILE
не помогает.Как бы я сам приступил к его отладке?
Решение
Для настройки пользовательских настроек проекта в Visual Studio из CMake вы можете использовать XML-файл в качестве шаблона, который можно настроить из CMake для работы в качестве файла .user
.
На моей работе мы используем это для установки пользовательских параметров отладки.
Проверьте каталог, содержащий сгенерированные файлы .vcproj
для пользовательских настроек в файлах .user
. Вот фрагмент примера файла UserTemplate.vcproj
, который мы используем.
<?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 -->
Таким образом, вы можете вставить любые необходимые переменные из CMake в файл .user
.
В CMake вы можете установить подходящие переменные CMake (и добавить больше в файл шаблона, если они вам нужны). Далее вы можете сделать что-то подобное для настройки файла.
# 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)
Другие советы
Просто заметил этот вопрос сейчас. Для отладки файлов cmake я использую
MESSAGE( STATUS "static text ${variable}" )
Мне никогда не приходилось устанавливать путь для запуска моих тестов. Вы используете CTest? Похоже, что ссылка, по которой вы переходите, используется ctest.
Если бы я пытался заставить это работать, я бы сначала использовал set_tests_properties
явно.
set_tests_properties(SomeTest PROPERTIES ENVIRONMENT "PATH=c:\somedir;c:\otherdir")
Тогда сделайте это более общим.
Вот отчет о запросе связанных функций CMake:
http://www.kwwidgets.org/Bug/view.php ? ID = 8884 р>
ОБНОВЛЕНИЕ: Решено в соответствии с Задать проект Visual Studio " пользовательские переменные среды " настройка с помощью CMake - спасибо Флориану за комментарий ниже.
Вы можете предоставить любые опции глобально с помощью нового VS_USER_PROPS
целевое свойство (версия >= 3.8).
Вот рабочий пример:
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"
)
Ссылки
Просто хотел отметить, что очень полезное дополнение это позволяет вам установить несколько переменных среды, а не только одну (например, только PATH) приводится по этой ссылке https://stackoverflow.com/a/40531167/9253113
Например, если в дополнение к установке PATH вы хотите установить другую переменную OTHERVAR нужно было бы изменить строку
<LocalDebuggerEnvironment>PATH=C:\Test</LocalDebuggerEnvironment>
до
<LocalDebuggerEnvironment>PATH=C:\Test 
OTHERVAR="value of OTHERVAR"</LocalDebuggerEnvironment>
Где символ " & #xA;
" говорит парсеру xml ввести символ LF. Так что несколько переменных определений
возможны, если они разделены символом LF (также работает символ CR, но НЕ комбинация CRLF)
Также обратите внимание, что между & amp; #xA;
и следующей переменной не может быть пробела.