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

Eos*_*ern 4 msbuild nmake makefile batch-file visual-studio-2010

我正在编译一个项目,该项目依赖于其他几个开源项目(特别是 Zlib 和 LibTIFF),为此提供了 Windows 生成文件(旨在与 nmake 一起使用)。我想这样安排,每当我对我的项目执行“重建”时,开源项目也会用适当的配置(调试/发布、32/64 位等)重建。

我自己的项目相当简单,但并非微不足道。我试图弄清楚如何直接或使用 CMake 生成我自己的 nmake 生成文件,从而浪费了我最初的几天。尽管对 GNU make 有相当多的经验,但这让我失去了生存的意愿。从康复中心出来后,我决定坚持使用 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
Run Code Online (Sandbox Code Playgroud)

(我意识到我也可以将上述内容放入批处理文件中,然后调用批处理文件,但我不想给自己另一个文件来跟踪)。无论如何,这很好用,除了一件事:如果我决定更改我的配置,我想在两个库上执行“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
Run Code Online (Sandbox Code Playgroud)

不幸的是,我似乎无法确定任何满足 BUILDACTION 角色的环境变量,也看不到定义一个的直接方法。那么,有什么办法可以做我在这里想做的事情,还是我什么都没有?

sti*_*ijn 6

一旦你意识到的Rebuild目标只是一个存根和实际上包括调用Clean由follwed Build(就像在一个典型的GNU的makefile BTW),该解决方案提出了自己:使用两个不同的目标,一个清洁,一个用于构建。您可以保留预构建事件,并为 Clean 添加一个。在文本编辑器中打开项目文件并在最后添加如下内容:

<Target Name="OnCleanOnly" AfterTargets="Clean">
  <Message Text="OnCleanOnly" Importance="High"/>
</Target>
Run Code Online (Sandbox Code Playgroud)

调用目标时将自动调用此目标Clean。例如,当您从 VS 内或通过调用msbuild myproject /t:Rebuild命令行执行 Clean 或 Rebuild 时就是这种情况。

请注意,您说我意识到我也可以将上述内容放入批处理文件中,然后调用批处理文件,但我不想给自己另一个文件来跟踪,但我不会这么快就放弃这个想法,因为它的主要优点是您可以通过运行批处理文件来测试构建事件本身是否正常。如果您想对嵌入在项目文件中的目标执行相同操作,则必须启动命令行,确定要准确调用哪个目标并运行msbuild projectfile /t:target以对其进行测试。更多的工作:) 跟踪文件也是您的版本系统的工作,因此您不必担心。