在automake中使用通配符

时间:2016-04-14 15:05:09

标签: c++ automake

我有以下makefile.am:

AUTOMAKE_OPTIONS = foreign
bin_PROGRAMS = prog
DEFS =
CFLAGS =
prog_SOURCES := $(wildcard src/GUI_dialogs.cpp) src/GUI_main_win.cpp
$(info **$(prog_SOURCES)**)

如果我生成了makefile(autoreconf && ./configure),然后运行make

我得到以下输出:

**src/GUI_dialogs.cpp src/GUI_main_win.cpp**
g++  -I.     -g -O2 -MT GUI_main_win.o -MD -MP -MF .deps/GUI_main_win.Tpo -c -o GUI_main_win.o `test -f 'src/GUI_main_win.cpp' || echo './'`src/GUI_main_win.cpp
src/GUI_main_win.cpp:1:24: fatal error: ...Header not found as expected...

第一行显示prog_SOURCES变量设置正确,但它没有首先编译GUI_dialogs对象。

如果我将prog_SOURCES更改为:

 prog_SOURCES := src/GUI_dialogs.cpp src/GUI_main_win.cpp

然后GUI_dialogs对象首先按预期编译。

我知道订单可能没有定义。但如果我在那里有通配符:

prog_SOURCES := $(wildcard src/GUI_dialogs.cpp)

然后我得到:

**src/GUI_dialogs.cpp**
gcc     -o prog   
gcc: fatal error: no input files
compilation terminated.

为什么只是跳过通配符文件?即使它显然在变量中?

1 个答案:

答案 0 :(得分:0)

遇到了类似的问题,从文档来看,这似乎不是一个好主意。

https://www.gnu.org/software/automake/manual/html_node/Wildcards.html

“即使您不关心可移植性,并且由于只针对GNU Make而试图使用'$(通配符...)',您都应该知道在很多地方Automake需要确切地知道哪个文件应该被处理。由于Automake不知道如何扩展'$ {wildcard ...)',因此您不能在这些地方使用它。'$ {wildcard ...)'是一个黑盒,与AC_SUBSTed变量可比为对于Automake而言。

您可以使用-Wportability标志获得有关“ $(通配符...”)构造的警告。”