我正在编译一个依赖于其他几个开源项目(特别是Zlib和LibTIFF)的项目,其中提供了Windows (用于nmake)。我想安排这样的事情,每当我在我的项目上执行“重建”时,开放源码项目也会用适当的配置(调试/发布,32/64位等等)重新构建。
我自己的项目相当直截了当,但并不琐碎。我浪费了头几天的时间,试图弄清楚如何直接或使用CMake生成自己的nmake。尽管有相当多的GNU make的经验,这使我失去了生活的意愿。从康复中心出来后,我决定继续使用Visual项目文件来构建自己的项目,并定义一个“预构建事件”,在供应商提供的makefile上为我的开源库执行nmake。
例如,在Visual 2010项目页面中,使用Intel C++编译器生成32位版本,我将预构建事件命令行编写为:
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‘,以确保它们是用我的新配置重建的,类似于:
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角色的环境变量,我也看不到一种简单的定义方法。那么,有没有办法做我在这里想做的事,还是我什么都没做?
发布于 2014-05-20 21:38:49
Stijn使我走上了正确的道路:最后的解决方案是在我的.vcxproj文件的末尾手动添加以下部分(在最后一行之前):
<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>这确保了,根据需要,每次从“构建”菜单中选择“清洁解决方案”或“重建解决方案”时,都会运行“nmake清洁”命令。这正是我希望达到的目标。
发布于 2014-05-20 07:27:34
一旦您意识到Rebuild目标只是一个存根,并且实际上包含调用由Build折叠的Clean (就像在典型的gnu makefile btw中一样),解决方案就会出现:使用两个单独的目标,一个用于清洁,另一个用于构建。您可以将预构建事件保留为-原样,并添加一个用于清洁。在文本编辑器中打开项目文件,并在末尾添加如下内容:
<Target Name="OnCleanOnly" AfterTargets="Clean">
<Message Text="OnCleanOnly" Importance="High"/>
</Target>当调用Clean目标时,将自动调用此目标。在从VS内部进行清理或重建时,或者例如通过在命令行调用msbuild myproject /t:Rebuild,都是这种情况。
注意,您说我意识到我可以将上面的内容放入一个批处理文件中,并调用这个批处理文件,但是我不想给自己另一个文件来跟踪,但我不会这么快地否定这个想法,因为它有一个主要的优势,您可以通过运行批处理文件来测试构建事件本身是否正常。如果您想对嵌入在项目文件中的目标执行同样的操作,则必须启动命令行,确定要准确调用的目标,并运行msbuild projectfile /t:target来测试它。(更多的工作:)跟踪文件也是您的版本控制系统的工作,所以您不需要担心它。
发布于 2014-11-26 06:43:23
您可以通过以下过程进行相同的操作:
完成了!
https://stackoverflow.com/questions/23747085
复制相似问题