Как установить переменную среды пути, используя CMake и Visual Studio для запуска теста
Я использую CMake для создания файлов проекта Visual Studio. Я хочу запустить тестовый исполняемый файл после установки переменной среды PATH, чтобы он мог загрузить требуемую DLL. Я пробовал на обсуждение http://www.mail-archive.com/[email protected]/msg21493.html, но это не сработало.
Вы использовали CMake с Visual Studio для этой цели? Пожалуйста, поделитесь своим опытом.
Кроме того, я не нашел простой способ отладить мой CMake script, например, чтобы узнать, какое значение он присваивает переменной PATH. Невозможно установить подробный текст в CMake с помощью CMAKE_VERBOSE_MAKEFILE
. Как бы я сам отлаживал ее?
Ответы
Ответ 1
Для настройки пользовательских настроек проекта в Visual Studio из CMake вы можете использовать XML файл в качестве шаблона, который можно настроить из CMake для работы в качестве файла .user
.
В моей работе мы используем это для установки пользовательских параметров отладки.
Проверьте каталог, содержащий сгенерированные файлы .vcxproj
для пользовательских настроек в файлах .user
. Вот фрагмент примера файла UserTemplate.vcxproj.user
который мы используем.
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioUserFile
ProjectType="Visual C++"
Version="9.00"
ShowAllFiles="false"
>
<Configurations>
<Configuration
Name="Debug|@[email protected]"
>
<DebugSettings
Command="@[email protected]"
WorkingDirectory="@[email protected]"
CommandArguments="@[email protected]"
Attach="false"
DebuggerType="3"
Remote="1"
RemoteMachine="@[email protected]"
<!-- More settings removed for snippet -->
/>
</Configuration>
<!-- Rest of Configurations -->
Другой пример UserTemplate.vcxproj.user
для установки переменной PATH:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LocalDebuggerEnvironment>PATH=..\Your_path;%PATH%".</LocalDebuggerEnvironment>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
</Project>
Установив файл UserTemplate.vcxproj.user
рядом с файлом CMakeLists.txt
, вы можете добавить любые необходимые переменные из CMake в файл .vcxproj.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}.vcxproj.${SYSTEM_NAME}.${USER_NAME}.user)
SET(OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${USER_FILE})
CONFIGURE_FILE(UserTemplate.vcxproj.user${USER_FILE} @ONLY)
Если вам не нужны система и имя пользователя, вам будет достаточно следующей конфигурации.
# Configure the template file
SET(USER_FILE ${_projectName}.vcxproj.user)
SET(OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${USER_FILE})
CONFIGURE_FILE(UserTemplate.vcxproj.user ${USER_FILE} @ONLY)
Ответ 2
Просто заметил этот вопрос сейчас. Для отладки файлов cmake я использую
MESSAGE( STATUS "static text ${variable}" )
Мне никогда не приходилось устанавливать путь, чтобы мои тесты запускались. Вы используете CTest? Похоже, что ссылка, по которой вы переходите, используется ctest.
Если бы я пытался заставить это работать, я бы set_tests_properties
явно использовал set_tests_properties
.
set_tests_properties(SomeTest PROPERTIES ENVIRONMENT "PATH=c:\somedir;c:\otherdir")
Тогда сделайте это более общим.
Ответ 3
Здесь приведено описание запроса функции CMake:
http://www.kwwidgets.org/Bug/view.php?id=8884
UPDATE: Решено как Установить проект Visual Studio "настраиваемые переменные среды" с помощью CMake - благодаря Флориану для комментария ниже.
Ответ 4
Вы можете предоставить любые параметры во всем мире с новым 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"
)
Ссылки
Ответ 5
Просто хотел бы отметить, что по этой ссылке дано очень полезное дополнение, которое позволяет вам настроить несколько переменных среды, а не только одну (например, только PATH) fooobar.com/info/3082839/...
Например, если в дополнение к установке PATH вы хотите установить другую переменную OTHERVAR, нужно будет изменить строку
<LocalDebuggerEnvironment>PATH=C:\Test</LocalDebuggerEnvironment>
в
<LocalDebuggerEnvironment>PATH=C:\Test 
OTHERVAR="value of OTHERVAR"</LocalDebuggerEnvironment>
Где символ " 

" говорит парсеру xml ввести символ LF. Таким образом, возможны множественные определения переменных, если они разделены символом LF (также работает символ CR, но НЕ комбинация CRLF)
Также обратите внимание, что между 

не может быть пробела. и следующая переменная.