从递归到非递归构建系统

Posted

技术标签:

【中文标题】从递归到非递归构建系统【英文标题】:moving from recursive to non-recursive build system 【发布时间】:2017-09-14 09:58:57 【问题描述】:

我正在尝试将我们的构建系统更新为非递归的。系统的当前布局(我们在其中构建 GNU Octave 和 Matlab mex 文件)是:

---project/
|  ---mex/
|  |  +--src/ (contains common source files)
|  |  +--matlab-mex/ (contains compiled Matlab mex files)
|  |  +--octave-mex/ (contains compiled Octave mex files)
|  |  ---build/
|  |  |  mex1.am
|  |  |  ...
|  |  |  mexN.am
|  |  |  ---matlab/
|  |  |  |    Makefile.am
|  |  |  |    configure.ac
|  |  |  |    commonmex.am
|  |  |  |    ---mex1/
|  |  |  |    |    Makefile.am
|  |  |  |    ...
|  |  |  |    ---mexN/
|  |  |  |    |    Makefile.am
|  |  |  +--octave/ (... same layout as project/mex/build/matlab/)

目前,commonmex.am 包含 EXEEXT=$(MEXEXT) 行,允许使用适当的扩展名(.mex.mexmaci.mexmaci64 等)编译 mex 文件,具体取决于 Matlab 版本和 OS 系统/architecture 由 configure 找到。作为一个递归系统,这工作得很好。

问题

在转向非递归构建系统(已读取 autotools-mythbuster 和 Karel Zak's blog)时,我不使用 SUBDIRS,而是使用 include commonmex.amproject/mex/build/matlab/Makefile.am 中的 mex*.am。我在进行此更改时遇到的问题是我无法像上面那样覆盖EXEEXT。当我运行 autoreconf -si 时,我收到以下警告:

./commonmex.am:1: warning: EXEEXT was already defined in condition TRUE, which includes condition DO_SOMETHING ...
Makefile.am:10:   'mex1/mex1.am' included from here
mex1/mex1.am:1:   './commonmex.am' included from here
configure.ac:59: ... 'EXEEXT' previously defined here

注意:if DO_SOMETHINGMakefile.am 中的一个条件句,它封装了整个 Makefile,因此如果构建的人有 GNU Octave 或 Matlab 中的一个,但没有另一个,则忽略它。 p>

当我运行make 时,mex 文件已构建,但根本没有任何扩展名(我在 macOS 上构建,但我想在 GNU/Linux 上的结果是一样的)。当我们编译这些 mex 文件以在 GNU/Linux、macOS 和 Windows 上分发时,扩展对我们来说非常重要。

如何在用同样在 configure.ac 中设置的MEXEXT 变量覆盖configure.ac 中设置的EXEEXT 时转移到非递归构建系统?

【问题讨论】:

【参考方案1】:

最后,这很容易。只需覆盖configure.acEXEEXT的定义即可:

EXEEXT=$MEXEXT

【讨论】:

以上是关于从递归到非递归构建系统的主要内容,如果未能解决你的问题,请参考以下文章

JTree,如何用递归算法构建树

数据结构&算法篇--二叉树的构建与遍历2-非递归遍历

数据结构&算法篇--二叉树的构建与遍历2-非递归遍历

树的非递归遍历

3.4.4 利用栈将递归转换成非递归的方法

二叉树的非递归遍历