仅在重建时运行预构建事件

时间:2014-05-19 20:57:30

标签: visual-studio-2010 batch-file msbuild makefile nmake

我正在编译一个项目,该项目依赖于其他几个开源项目(特别是Zlib和LibTIFF),为此提供了Windows makefile(旨在与nmake一起使用)。我想安排一些事情,每当我在我的项目上执行'Rebuild'时,开源项目也会使用适当的配置(Debug / Release,32/64 bit等)重建。

我自己的项目相当简单,但并非琐碎。我试图弄清楚如何直接或使用CMake生成我自己的nmake makefile,从而浪费了我的前几天。尽管拥有合理的GNU制作经验,但这让我失去了生存的意愿。从康复中走出来之后,我决定坚持使用Visual Studio项目文件来构建我自己的项目,并定义一个'预构建事件'来为我的开源库在供应商提供的makefile上执行nmake。

例如,在我的32位版本构建的Visual Studio 2010项目页面中,使用英特尔C ++编译器,我将预构建事件命令行编写为:

call "C:\Program Files (x86)\Intel\Composer XE 2013 SP1\bin\ipsxe-comp-vars.bat" ia32 vs2010
cd ..\..\..\zlib-1.2.8
nmake /f win32\Makefile.msc zlib.lib
cd ..\tiff-4.0.3
nmake /f Makefile.vc lib

(我意识到我也可以将上述内容放入批处理文件中,并调用批处理文件,但我不想给自己另外一个文件来跟踪)。无论如何,这很好用,除了一件事:如果我决定改变我的配置,我想在两个库上执行'nmake clean'以确保它们是用我的新配置重建的,这是一条线路的:

call "C:\Program Files (x86)\Intel\Composer XE 2013 SP1\bin\ipsxe-comp-vars.bat" ia32 vs2010
cd ..\..\..\zlib-1.2.8
IF "%BUILDACTION%"=="REBUILD" nmake /f win32\Makefile.msc clean
nmake /f win32\Makefile.msc zlib.lib
cd ..\tiff-4.0.3
IF "%BUILDACTION%"=="REBUILD" nmake /f Makefile.vc clean
nmake /f Makefile.vc lib

不幸的是,我似乎无法确定任何能够满足BUILDACTION角色的环境变量,也无法找到一种直接定义它的方法。那么,有什么方法可以做我想在这里做的事情,还是我躲在什么地方?

4 个答案:

答案 0 :(得分:4)

一旦你意识到Rebuild目标只是一个存根,实际上是由Clean调用Build(就像典型的gnu makefile btw一样),解决方案就会出现:使用两个单独的目标,一个用于Clean,一个用于Build。您可以按原样保留预构建事件,并为Clean添加一个。在文本编辑器中打开项目文件,并在最后添加这样的内容:

<Target Name="OnCleanOnly" AfterTargets="Clean">
  <Message Text="OnCleanOnly" Importance="High"/>
</Target>

调用Clean目标时,将自动调用此目标。从VS中执行Clean或Rebuild,或者在命令行上调用msbuild myproject /t:Rebuild时就是这种情况。

注意,你说我意识到我也可以将上述内容放入批处理文件中,然后调用批处理文件,但我不想给自己另外一个文件来跟踪msbuild projectfile /t:target进行测试。还有更多的工作:)同时跟踪文件是你的版本控制系统的工作,所以你不必担心它。

答案 1 :(得分:3)

Stijn让我走上了正确的轨道:最后的解决方案是手动在我的.vcxproj文件的末尾添加以下部分(紧接在形成最后一行的&lt; / Project&gt;之前) :

  <Target Name="OnCleanOnly" AfterTargets="Clean">
    <Exec Command="call &quot;C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat&quot; x86
                   cd ..\..\..\zlib-1.2.8
                   nmake /f win32\Makefile.msc clean
                   cd ..\tiff-4.0.3
                   nmake /f Makefile.vc clean" />
    <Message Text="Cleaning libraries" Importance="High" />
  </Target>

根据需要,这可确保每次从“Build”菜单中选择“Clean Solution”或“Rebuild Solution”时运行'nmake clean'命令。这正是我希望实现的目标。

答案 2 :(得分:1)

您可以按照以下流程执行相同操作:

  1. 在项目中添加可执行文件
  2. 右键单击 - &gt;可执行文件的属性。
  3. 更改&#34;项目类型&#34;到&#34;自定义构建工具&#34;
  4. 应用
  5. 转到新创建的&#34;自定义构建工具&#34;标签。
  6. 在&#34;命令行&#34;中添加命令部分。
  7. 指定命令行生成的输出文件的名称。
  8. 根据您的要求选择其他选项。
  9. 点击&#34;确定&#34;
  10. 对于调试和发布配置都需要自定义构建的所有文件执行此操作
  11. 完成!!!!

答案 3 :(得分:0)

你可以用一个参数R来调用你的蝙蝠,如果它是一个重建,如果没有,你就可以。即。 Yourbat.bat R然后只测试参数(%1)。

call "C:\Program Files (x86)\Intel\Composer XE 2013 SP1\bin\ipsxe-comp-vars.bat" ia32 vs2010
cd ..\..\..\zlib-1.2.8
IF /i "%1"=="R" nmake /f win32\Makefile.msc clean
nmake /f win32\Makefile.msc zlib.lib
cd ..\tiff-4.0.3
IF /i "%1"=="R" nmake /f Makefile.vc clean
nmake /f Makefile.vc lib

我使用/i保持不区分大小写的IF参数(您可以使用rR