如何设置路环境变量使用CMake和Visual Studio运行测试
-
05-07-2019 - |
题
我使用CMake产生Visual Studio项目文件。我想要运行测试可执行的后设定路径的环境变量,以便它能够载所需dll。我尝试过每讨论 http://www.mail-archive.com/cmake@cmake.org/msg21493.html 但是它不工作。
你有没有用CMake用Visual Studio为此目的?请您分享经验。
还有,我找不到简单的方法来调试我的CMake脚本,例如看看有什么价值,它指定路径的变量。设置CMake详细的与 CMAKE_VERBOSE_MAKEFILE
没有帮助。我怎么会去调试它自己?
解决方案
要在CMake中设置Visual Studio中的自定义项目设置,您可以使用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 - 感谢Florian的评论。
你可以给任何选项全球新 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>
符号“&amp; #xA;
”告诉xml解析器引入LF字符。所以多变量定义
如果用LF字符分隔(CR字符有效但不是CRLF组合)
另请注意,&amp; #xA;
与下一个变量之间不能有任何空格。