$(shell some-command)等价于Visual Studio项目宏?

时间:2014-09-12 09:18:19

标签: windows visual-studio msbuild

使用Makefile我以前可以写下这样的内容:

includedir=$(shell pg_config --includedir)/server

使用参数pg_config运行外部程序--includedir,并将结果包含在变量中或作为变量的一部分。因此,如果pg_config --includedir输出/usr/includestdout,则includedir的值将变为:

includedir=/usr/include/server

有没有办法与Visual Studio项目进行等效?运行命令,获取结果,并将其替换为属性?

我发现自己必须在整个地方编辑属性页面 - 每当我想针对不同的PostgreSQL版本构建扩展时,更改项目的x86和x64配置的包含目录和库目录。这令人非常沮丧。

我希望能够将这样的内容放入配置属性 - > C / C ++ - >一般 - >其他包含目录

%(shell pg_config --includedir)

甚至更好:

%(shell %(PG_CONFIG) --includedir)

其中%(PG_CONFIG)的位置在项目中每个平台的单个地点中定义。

所以我至少要寻找用户定义的宏,最好能够调用命令行工具并用生成的标准输出替换宏。

(最好不要涉及深入研究在每个VS版本中移动和重命名的半文档UI元素,以及从各种Express版本中出现和消失的方式)。

这在Makefiles中已有20年了,必须有一种方法可以在VS中做到这一点,对吧?或者做真正的Windows开发者"使用脚本生成他们的VS项目并使用MSBuild构建它们?

我在没有太多用处的情况下看了一些类似的问题,例如:

特别是,我知道属性表(View - > Other Windows - > Property Manager),但他们似乎没有提供在一个地方设置价值的方法,他们仍然是每个配置和每个架构,所以如果你有四个配置和两个架构,它会变得很尴尬。与普通的项目属性编辑器不同,您甚至不能在一组体系结构/配置中应用更改。

我可以使用VS扩展程序,但是它们需要安装到用户的VS中,可以是特定于版本的,并且对于小问题来说似乎是一个非常大的锤子。

2 个答案:

答案 0 :(得分:1)

  

我发现自己必须在整个地方编辑属性页

这也让我无所适从。物业单拯救!例如,在VS10中设置主要解决方案时,我让每个项目都包含一个settings.props,其中包含只在一个地方创建的常用设置。然后浏览所有生成或导入的项目,并尽可能删除任何显式值(即使是空白)。这样东西将继承自属性表。选择"所有配置"并在每个正确使用下拉菜单中继承......"。

我也为每个特殊库提供了属性表,只是定义了正确的#define,包含路径,lib路径等。使用该特定外部库的项目只使用该属性表。在最坏的情况下,用户被告知“编辑XML以改变你拥有Boost的路径”。

至于将这样的设置适当地设置为动态确定值,您也可以这样做。您可以使用property functions

听起来你和我一样走上了同样的道路。

更多说明:“支持表是按配置/平台”:如果在项目本身的顶级节点(不是Debug | Win32等子节点)中包含一个prop表,它将包含在所有当前的配置。如果编辑正确的页面,则可以在“属性”对话框中选择“多个”或“所有配置”,就像使用“属性”对话框的常规项目一样。

“自定义用户宏被很好地隐藏”在您创建的属性表中显示属性页,​​但是在普通文件视图中打开proj文件上的属性对话框时不会显示该属性页。宏将设置在一个位置(支持页面),并在包含它的所有项目中用作$(名称),甚至可以在评估序列中稍后出现的其他属性页面中使用。

让我知道它是怎么回事。你应该能够做你所要求的一切。

-John

答案 1 :(得分:0)

除了@ jdlugosz的回答:

在属性函数出现之前,使用Visual Studio执行此操作的传统方法似乎是write a new MSBuild Task。该任务可能会执行修改属性表等操作。

MSBuild supports "inline tasks"其中任务代码位于MSBuild项目文件中,而不是单独的程序集,因此可能不需要为该任务创建新的子项目。

There are a bunch of built-in tasks,如ExecCreateProperty可能有用。

文档说:

  

当您要执行的作业的特定MSBuild任务不可用时,[Exec任务]非常有用。但是,与更具体的任务不同,Exec任务无法从其运行的工具或命令中收集输出。

...但是that seems to be outdated/wrong所以你don't need horrible workarounds

因此,在.NET 4.5之前,我可能不得不为这个简单的工作编写自定义任务,因为无法将命令stdout / stderr提供给CreateProperty任务或让Exec直接创建一个属性。但在4.5中看起来我可以直接做到。至少在VS Express中对任务等的支持非常有限so you'll probably land up editing the XML