如何在Makefile.am中替换模式

3

我有一个应用程序,其中包含多个子目录,我想以非递归方式进行编译。为此,我将所有子目录的源文件分别存储在几个变量中,然后在最终的源代码集合中使用这些变量。类似于以下内容:

GUI_SOURCEFILES = Gui/MainWindow.cc \
                  Gui/StatusBar.cc
...
foo_SOURCES = $(GUI_SOURCEFILES) \
              $(DATABASE_SOURCEFILES) \
              main.cc

现在,我必须为所有GUI源文件写“Gui/”,并在所有数据库文件前面写“Db\”。我认为应该可以自动创建此前缀,但我找不到正确的方法。我尝试了通常的制作方式:
GUI_SOURCEFILES = MainWindow.cc \
                  StatusBar.cc
...
foo_SOURCES = $(GUI_SOURCEFILES) \
              $(patsubst %,Gui/%,$(DATABASE_SOURCEFILES)) \
              main.cc

但是,Autotools根本不会编译这个Makefile.am文件。

有没有办法让Autotools为我完成这个任务呢?


$(addprefix Gui/, $(DATABASE_SOURCEFILES))是怎么样的呢? - dma_k
@dma_k:这个问题和之前的一样:src/Makefile.am:12: addprefix Gui/, $(GUI_SOURCEFILES: non-POSIX variable name src/Makefile.am:12: (probably a GNU make extension)。我认为必须有一种非常特定的Autotools/m4方法来解决这个问题,但是我从未广泛地使用过其中任何一个。所有的Makefile方法可能都行不通。 - LiKao
1
@LiKao:一些传统的Makefile结构,如后缀替换,在Automake中也可以使用。但是,我不知道有没有前缀方法。 - thiton
你的问题也在这篇帖子中提到了。我也很惊讶。一般建议是:将autotools更新到最新版本,并确保make是唯一的,而且它是GNU make。从这里那里来看,我认为你有一个环境问题。你在运行Linux吗? - dma_k
@dma_k:是的,我正在使用来自2010年的autotools版本2.67,在kubuntu 11.4上运行。对我来说似乎相当新。没有安装其他make,因此这不应该使autotools混淆。我认为,你提供的示例中使用addprefixpatsubst的部分将传递给最终的Makefile,而不是由autotools处理。 - LiKao
1个回答

3

这里没有什么办法,所有的文件名必须在自动化构建时可用,这就排除了某些make-time的函数(这些函数是不可移植的)。


文件名是完全可用的。我只是不想每次都显式添加目录前缀。就这样。我猜对于这个问题,使用autotools是没有帮助的。 - LiKao
1
automake可以扩展*$(addprefix...),前提是参数在AM时间是常量且已知的,就像它对include*所做的那样。但遗憾的是,目前它并没有这样做,这导致了“如果你能想出一个补丁,你可以尝试提交”的情况。 - jørgensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接