如果用一句话来概括Makefile,我个人认为就是:以编程的风格来编译程序。当然,根据每个人使用情况的不同,也都会有自己的见解。和C++一样,我这里就不讲它的行文结构了,一个是因为其教程满大街,再一个是官方已经为我们写好了Makefile文件,用户即使没有使用经验也无妨,直接调用即可,所以咱们还是直击重点。和上一篇文章一样,只演示windows下的创建方法。
Step1:首先是添加环境变量,和上一篇相同,将C:\Program Files\Side Effects Software\Houdini 18.0.391\bin目录添加进path环境变量,将C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.15.26726添加进MSVCDir环境变量,除此以外再加一个,将C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.15.26726\bin\Hostx64\x64目录也添加进path环境变量,因为在该目录下有nmake.exe程序,它负责解释执行Makefile文件。
Step2:进到C:\Program Files\Side Effects Software\Houdini 18.0.391\toolkit\makefiles目录下,创建一个文本文件,命名为Makefile,无需后缀名,并将源文件拷贝到该目录下(不拷贝也可以,将来Makefile中可以写绝对路径,或者使用宏来定义路径,但为了初学者考虑,我还是本着尽量少的去写Makefile代码),如下图所示:
用记事本打开刚刚新建的Makefile文件,写入如下文本:
DSONAME表示生成目标文件的名称,也就是插件名,名字可以随便写,这里是lxx.dll。SOURCES表示源文件,因为源文件和Makefile在同一目录下,所以直接写名称即可,无需路径,而且注意,源文件只写.C文件即可,无需.h文件,这里源文件名为SOP_CPPWave.C。!INCLUDE表示包含的外部文件,换句话说,一个Makefile文件可以有多个文件组成,非常适合团体协作的大工程,其实USD(solaris)就是这个套路,当前它包含的外部文件就是该目录下的Makefile.nmake文件,它就是核心文件,官方已经为开发者写好了,当然对于想学习Makefile结构的朋友可以自行研究,看不懂也不影响使用。值得注意的是,$(HFS)表示Houdini的安装目录。
注:Makefile和上一篇的hcustom方法的优势之一就是可以将不同功能的多个源文件编译成一个插件文件,具体可见https://www.sidefx.com/docs/hdk/_h_d_k__intro__compiling.html
Step3:Houdini在windows下的插件开发用到了C标准库,而这些标准库放到了Windows Kits(随vs2017自动安装,也可单独下载安装)目录中,而且要注意,一定将Makefile.win(该文件定义了一些宏以表路径)文件中WIN32_KIT_VERSION改为Windows Kits中的版本号:
注:Makefile.win文件内容可以用hcustom --output_makevars命令来生成
Step4:打开Houdini的命令行工具,如下图所示:
进到C:\Program Files\Side Effects Software\Houdini 18.0.391\toolkit\makefiles目录下,输入nmake lxx.dll install,即可在C:\Users\lxx\Documents\houdini18.0\dso目录中生成插件,如图所示:
注:如果执行中出现了fatal error U1050: ==== Unknown version of Visual C++错误,可以打开Makefile.nmake文件,将该语句!IF ([$(CC) 2>&1 | findstr /C:"Version 19.1" > nul] == 0)改为!IF ([$(CC) 2>&1 | findstr /C:"Version 19.1" > nul] != 0)即可。具体原因涉及输出流和dos,这里不细说了,要看懂Makefile.nmake文件内容可自行学习Makefile和nmake命令。
结束语:其实对于HDK的开发更常用的还是在VC的IDE里来完成,毕竟又方便又直观,是最推荐的方式。但是从开发的角度来说,最好还是了解些Makefile行文结构(毕竟不是编程语言,所以我不叫语法结构,称呼随意),否则你将和开源世界无缘,但是对于绝大多数特效师来说,还是把Houdini软件本身吃透更为重要,也更具现实意义!