【发布时间】:2012-07-21 03:29:46
【问题描述】:
我有一个由 autotools 管理的项目(ssccetar.gz 包here),结构如下:
我的configure.ac 是:
AC_INIT([foo], [1.0], [foo@bar.ba])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
我的Makefile.am 是:
bin_PROGRAMS = main
main_SOURCES = main.c foo.c foo.h
它编译并运行得很好......但后来我注意到我的Makefile.am 不正确。它说我的主要代码依赖于foo.h,但真正的文件是foo/foo.h。我更改了它,并且编译按预期工作,就像以前一样:
bin_PROGRAMS = main
main_SOURCES = main.c foo.c foo/foo.h
然而,这让我想知道:当依赖关系错误时,它是如何工作的?它运行得非常好,我什至可以编辑 foo/foo.h 和 make 将重新编译依赖文件。实际上,我什至可以从依赖项中删除头文件...
bin_PROGRAMS = main
main_SOURCES = main.c foo.c
...它仍然会被扫描并且会触发依赖文件的重新编译。
所以,我的问题是:
- 自动工具生成的
Makefile如何知道foo/foo.h是在make调用期间要分析的依赖项? - 是否应该将头文件添加到
main_SOURCES变量中? -
make不应该在第一种情况下失败,因为我声明一个不存在的文件是一个依赖项?
【问题讨论】:
-
出于好奇,您是否省略了一些细节?
-I$(srcdir)/foo是如何进入CPPFLAGS的? -
@WilliamPursell 好吧,我省略了我的 real 场景的一些细节,但下面的示例按预期编译。在这种情况下,不需要
-I$(srcdir)/foo,因为foo.c和main.c都包含目录名称为:#include "foo/foo.h"的文件,如here 所示。
标签: c makefile autotools automake