从递归到非递归构建系统
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.am
和 project/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_SOMETHING
是 Makefile.am
中的一个条件句,它封装了整个 Makefile,因此如果构建的人有 GNU Octave 或 Matlab 中的一个,但没有另一个,则忽略它。 p>
当我运行make
时,mex
文件已构建,但根本没有任何扩展名(我在 macOS 上构建,但我想在 GNU/Linux 上的结果是一样的)。当我们编译这些 mex 文件以在 GNU/Linux、macOS 和 Windows 上分发时,扩展对我们来说非常重要。
如何在用同样在 configure.ac 中设置的MEXEXT
变量覆盖configure.ac
中设置的EXEEXT
时转移到非递归构建系统?
【问题讨论】:
【参考方案1】:最后,这很容易。只需覆盖configure.ac
中EXEEXT
的定义即可:
EXEEXT=$MEXEXT
【讨论】:
以上是关于从递归到非递归构建系统的主要内容,如果未能解决你的问题,请参考以下文章