我正在编译一个项目,该项目依赖于其他几个开源项目(特别是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角色的环境变量,也无法找到一种直接定义它的方法。那么,有什么方法可以做我想在这里做的事情,还是我躲在什么地方?
答案 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 "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat" 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)
您可以按照以下流程执行相同操作:
完成!!!!
答案 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
参数(您可以使用r
或R
)