Tôi có một dự án autotools quản lý (sscce tar.gz gói here) với cấu trúc này:Tự động phát hiện Makefile có tự động xem xét các tệp tiêu đề được bao gồm dưới dạng phụ thuộc không?
My configure.ac
là:
AC_INIT([foo], [1.0], [[email protected]])
AM_INIT_AUTOMAKE([foreign -Wall -Werror])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
My Makefile.am
là :
bin_PROGRAMS = main
main_SOURCES = main.c foo.c foo.h
Nó được biên dịch và chạy hoàn hảo ... nhưng sau đó tôi lưu ý Makefile.am
của tôi không chính xác. Nó nói rằng mã chính của tôi phụ thuộc vào foo.h
, nhưng tệp thực sự là foo/foo.h
. Tôi đã thay đổi nó và quá trình biên soạn đã hoạt động như mong đợi, như trước đây:
bin_PROGRAMS = main
main_SOURCES = main.c foo.c foo/foo.h
Tuy nhiên, tôi tự hỏi: làm thế nào nó hoạt động khi các phụ thuộc sai? Nó hoạt động rất tốt đến nỗi tôi thậm chí có thể chỉnh sửa foo/foo.h
và make
sẽ biên dịch lại các tệp phụ thuộc. Thực ra, tôi thậm chí có thể loại bỏ các tập tin tiêu đề từ sự phụ thuộc ...
bin_PROGRAMS = main
main_SOURCES = main.c foo.c
... và nó sẽ được vẫn quét một sẽ kích hoạt các biên dịch lại các tập tin phụ thuộc.
Vì vậy, câu hỏi của tôi là:
- như thế nào autotools tạo
Makefile
biết rằngfoo/foo.h
là một sự phụ thuộc để được phân tích trong thời gianmake
gọi? - Tôi có nên thêm các tệp tiêu đề vào biến số
main_SOURCES
không? - Không nên
make
không thành công trong trường hợp đầu tiên, vì tôi tuyên bố rằng tệp không tồn tại là phụ thuộc?
Ngoài sự tò mò, bạn có bỏ sót một số chi tiết không? Làm thế nào là '-I $ (srcdir)/foo' vào' CPPFLAGS'? –
@WilliamPursell Vâng, tôi bỏ qua một số chi tiết về kịch bản * thực * của tôi, nhưng ví dụ bên dưới biên dịch như mong đợi. Trong trường hợp này, không cần '-I $ (srcdir)/foo' vì cả hai' foo.c' và 'main.c' đều chứa tập tin có tên dir:' #include "foo/foo.h" 'như đã thấy [ở đây] (http://pastebin.com/p9d1XNcU). – brandizzi