我的项目相当简单但并非微不足道。我浪费了前几天的时间,试图弄清楚如何直接或使用CMake生成自己的nmake makefile。尽管我有相当多的GNU make经验,但这让我失去了生存的意志。在经历了康复之后,我决定继续使用Visual Studio项目文件来构建自己的项目,并定义一个“预构建事件”来在我的开源库的供应商提供的makefile上执行nmake。
例如,在我的Visual Studio 2010项目页面上,对于32位Release构建,使用Intel 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角色的任何环境变量,也看不出定义环境变量的简单方法。那么,在这里做我正在尝试的事情有什么办法吗,还是说我在无法实现它?
ipsxe-comp-vars.bat
?通常情况下,nmake不在你的PATH中,我猜ipsxe-comp-vars.bat设置了所有需要进行正确构建的环境变量。创建一个批处理文件包含这些命令,在“普通”命令行中执行它(即不调用ipsxe-comp-vars.bat或任何VS的xxvars.bat),运行批处理文件,检查是否有效。只有在有效的情况下,你才能使用Exec。 - stijn