Cmake failed to get VCTargetsPath because MSBuild maybe not run post build event.
Hi,I am using cmake to Build a simple cmake project only have CMakeLists.txt and main.cpp.
CMakeFiles.txt:
project(CMakeProject2)
add_executable (CMakeProject2 "main.cpp")
main.cpp:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello CMake." << endl;
return 0;
}
And I run the commandPS D:\code\projects\CMakeProject2\CMakeProject2> cmake .
It gives me that
-- Building for: Visual Studio 17 2022
CMake Warning (dev) at CMakeLists.txt:1 (project):
cmake_minimum_required() should be called prior to this top-level project()
call. Please see the cmake-commands(7) manual for usage documentation of
both commands.
This warning is for project developers. Use -Wno-dev to suppress it.
-- Selecting Windows SDK version 10.0.22621.0 to target Windows 10.0.19045.
CMake Error at CMakeLists.txt:1 (project):
Failed to run MSBuild command:
D:/programs/vs/2022/preview/MSBuild/Current/Bin/amd64/MSBuild.exe
to get the value of VCTargetsPath:
MSBuild version 17.7.0-preview-23279-01+d4c4d1ec7 for .NET Framework
生成启动时间为 2023/6/25 12:01:58。
节点 1 上的项目“D:\code\projects\CMakeProject2\CMakeProject2\CMakeFiles\3.26.0-rc6\VCTargetsPath.vcxproj”(默认目标)
。
PrepareForBuild:
正在创建目录“x64\Debug\”。
正在创建目录“x64\Debug\VCTargetsPath.tlog\”。
InitializeBuildStatus:
正在创建“x64\Debug\VCTargetsPath.tlog\unsuccessfulbuild”,因为已指定“AlwaysCreate”。
正在对“x64\Debug\VCTargetsPath.tlog\unsuccessfulbuild”执行 Touch 任务。
PostBuildEvent:
echo VCTargetsPath=D:\programs\vs\2022\preview\MSBuild\Microsoft\VC\v170\
:VCEnd
FinalizeBuildStatus:
正在删除文件“x64\Debug\VCTargetsPath.tlog\unsuccessfulbuild”。
正在对“x64\Debug\VCTargetsPath.tlog\VCTargetsPath.lastbuildstate”执行 Touch 任务。
已完成生成项目“D:\code\projects\CMakeProject2\CMakeProject2\CMakeFiles\3.26.0-rc6\VCTargetsPath.vcxproj”(默认目标)的操作。
已成功生成。
0 个警告
0 个错误
已用时间 00:00:00.24
-- Configuring incomplete, errors occurred!
MSBuild works fine.But it did not run the post build eventecho VCTargetsPath=D:\programs\vs\2022\preview\MSBuild\Microsoft\VC\v170\
In cmake source,it use cmsys::RegularExpression regex("\n *VCTargetsPath=([^%\r\n]+)[\r\n]");
to get VCTargetsPath.
I got the vcxproj generated by cmake and use MSBuild build it.
Let the MSBuild output to a text and add '\n'
behind each line and use Python's regex to test.
If MSBuild did not run the echo command.It will be
import re
a = '''MSBuild version 17.7.0-preview-23279-01+d4c4d1ec7 for .NET Framework\n
生成启动时间为 2023/6/25 11:12:08。\n
\n
节点 1 上的项目“D:\\code\\projects\\CMakeProject2\\CMakeFiles\\3.26.0-rc6\\VCTargetsPath.vcxproj”(默认目标)。\n
InitializeBuildStatus:\n
正在创建“x64\\Debug\\VCTargetsPath.tlog\\unsuccessfulbuild”,因为已指定“AlwaysCreate”。\n
正在对“x64\\Debug\\VCTargetsPath.tlog\\unsuccessfulbuild”执行 Touch 任务。\n
PostBuildEvent:\n
echo VCTargetsPath=D:\\programs\\vs\\2022\\preview\\MSBuild\\Microsoft\\VC\\v170\\\n
:VCEnd\n
FinalizeBuildStatus:\n
正在删除文件“x64\\Debug\\VCTargetsPath.tlog\\unsuccessfulbuild”。\n
正在对“x64\\Debug\\VCTargetsPath.tlog\\VCTargetsPath.lastbuildstate”执行 Touch 任务。\n
已完成生成项目“D:\\code\\projects\\CMakeProject2\\CMakeFiles\\3.26.0-rc6\\VCTargetsPath.vcxproj”(默认目标)的操作。\n
\n
已成功生成。\n
0 个警告\n
0 个错误\n
\n
已用时间 00:00:00.25\n
'''
print(re.findall('\n *VCTargetsPath=([^%\r\n]+)[\r\n]',a))
output
[]
If MSBuild actually run the echo command.It will be
import re
a = '''MSBuild version 17.7.0-preview-23279-01+d4c4d1ec7 for .NET Framework\n
生成启动时间为 2023/6/25 11:12:08。\n
\n
节点 1 上的项目“D:\\code\\projects\\CMakeProject2\\CMakeFiles\\3.26.0-rc6\\VCTargetsPath.vcxproj”(默认目标)。\n
InitializeBuildStatus:\n
正在创建“x64\\Debug\\VCTargetsPath.tlog\\unsuccessfulbuild”,因为已指定“AlwaysCreate”。\n
正在对“x64\\Debug\\VCTargetsPath.tlog\\unsuccessfulbuild”执行 Touch 任务。\n
PostBuildEvent:\n
echo VCTargetsPath=D:\\programs\\vs\\2022\\preview\\MSBuild\\Microsoft\\VC\\v170\\\n
:VCEnd\n
FinalizeBuildStatus:\n
正在删除文件“x64\\Debug\\VCTargetsPath.tlog\\unsuccessfulbuild”。\n
正在对“x64\\Debug\\VCTargetsPath.tlog\\VCTargetsPath.lastbuildstate”执行 Touch 任务。\n
已完成生成项目“D:\\code\\projects\\CMakeProject2\\CMakeFiles\\3.26.0-rc6\\VCTargetsPath.vcxproj”(默认目标)的操作。\n
\n
已成功生成。\n
0 个警告\n
0 个错误\n
\n
已用时间 00:00:00.25\n
VCTargetsPath=D:\\programs\\vs\\2022\\preview\\MSBuild\\Microsoft\\VC\\v170\\
'''
print(re.findall('\n *VCTargetsPath=([^%\r\n]+)[\r\n]',a))
output
['D:\\programs\\vs\\2022\\preview\\MSBuild\\Microsoft\\VC\\v170\\']
This is ok.
It looks like that if MSBuild really does not run the post build event cmake would not get the VCTargetsPath.
If the regex is ' *VCTargetsPath=([^%\r\n]+)[\r\n]'
Even if MSBuild does not do echo command,cmake can also get VCTargetsPath.
import re
a = '''MSBuild version 17.7.0-preview-23279-01+d4c4d1ec7 for .NET Framework\n
生成启动时间为 2023/6/25 11:12:08。\n
\n
节点 1 上的项目“D:\\code\\projects\\CMakeProject2\\CMakeFiles\\3.26.0-rc6\\VCTargetsPath.vcxproj”(默认目标)。\n
InitializeBuildStatus:\n
正在创建“x64\\Debug\\VCTargetsPath.tlog\\unsuccessfulbuild”,因为已指定“AlwaysCreate”。\n
正在对“x64\\Debug\\VCTargetsPath.tlog\\unsuccessfulbuild”执行 Touch 任务。\n
PostBuildEvent:\n
echo VCTargetsPath=D:\\programs\\vs\\2022\\preview\\MSBuild\\Microsoft\\VC\\v170\\\n
:VCEnd\n
FinalizeBuildStatus:\n
正在删除文件“x64\\Debug\\VCTargetsPath.tlog\\unsuccessfulbuild”。\n
正在对“x64\\Debug\\VCTargetsPath.tlog\\VCTargetsPath.lastbuildstate”执行 Touch 任务。\n
已完成生成项目“D:\\code\\projects\\CMakeProject2\\CMakeFiles\\3.26.0-rc6\\VCTargetsPath.vcxproj”(默认目标)的操作。\n
\n
已成功生成。\n
0 个警告\n
0 个错误\n
\n
已用时间 00:00:00.25\n
'''
print(re.findall(' *VCTargetsPath=([^%\r\n]+)[\r\n]',a))
output
['D:\\programs\\vs\\2022\\preview\\MSBuild\\Microsoft\\VC\\v170\\']
I do not know hot to fix this.
I create a vcproject in visual studio 2022 preview and add a post build eventcalc
,it should open my caculator after building project but it did not.
Maybe it's all my Visual Studio's problem,I do not know what to do.