首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅在重新生成时运行预生成事件。

仅在重新生成时运行预生成事件。
EN

Stack Overflow用户
提问于 2014-05-19 20:57:29
回答 4查看 5.2K关注 0票数 4

我正在编译一个依赖于其他几个开源项目(特别是Zlib和LibTIFF)的项目,其中提供了Windows (用于nmake)。我想安排这样的事情,每当我在我的项目上执行“重建”时,开放源码项目也会用适当的配置(调试/发布,32/64位等等)重新构建。

我自己的项目相当直截了当,但并不琐碎。我浪费了头几天的时间,试图弄清楚如何直接或使用CMake生成自己的nmake。尽管有相当多的GNU make的经验,这使我失去了生活的意愿。从康复中心出来后,我决定继续使用Visual项目文件来构建自己的项目,并定义一个“预构建事件”,在供应商提供的makefile上为我的开源库执行nmake。

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

代码语言:javascript
复制
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‘,以确保它们是用我的新配置重建的,类似于:

代码语言:javascript
复制
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角色的环境变量,我也看不到一种简单的定义方法。那么,有没有办法做我在这里想做的事,还是我什么都没做?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-20 21:38:49

Stijn使我走上了正确的道路:最后的解决方案是在我的.vcxproj文件的末尾手动添加以下部分(在最后一行之前):

代码语言:javascript
复制
  <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>

这确保了,根据需要,每次从“构建”菜单中选择“清洁解决方案”或“重建解决方案”时,都会运行“nmake清洁”命令。这正是我希望达到的目标。

票数 4
EN

Stack Overflow用户

发布于 2014-05-20 07:27:34

一旦您意识到Rebuild目标只是一个存根,并且实际上包含调用由Build折叠的Clean (就像在典型的gnu makefile btw中一样),解决方案就会出现:使用两个单独的目标,一个用于清洁,另一个用于构建。您可以将预构建事件保留为-原样,并添加一个用于清洁。在文本编辑器中打开项目文件,并在末尾添加如下内容:

代码语言:javascript
复制
<Target Name="OnCleanOnly" AfterTargets="Clean">
  <Message Text="OnCleanOnly" Importance="High"/>
</Target>

当调用Clean目标时,将自动调用此目标。在从VS内部进行清理或重建时,或者例如通过在命令行调用msbuild myproject /t:Rebuild,都是这种情况。

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

票数 6
EN

Stack Overflow用户

发布于 2014-11-26 06:43:23

您可以通过以下过程进行相同的操作:

  1. 在项目中添加可执行文件
  2. 右键单击可执行文件的->properties。
  3. 将“项类型”更改为“自定义生成工具”
  4. 应用
  5. 转到新创建的“自定义构建工具”选项卡。
  6. 将您的命令添加到“命令行”部分。
  7. 指定命令行生成的输出文件的名称。
  8. 根据您的要求相应地选择其他选项。
  9. 点击“确定”
  10. 对调试和发布配置都需要自定义构建的所有文件执行此操作。

完成了!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23747085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档