2012-07-22 28 views
5

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?

./main.c
./foo.c
./foo/foo.h

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.hmake 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ằng foo/foo.h là một sự phụ thuộc để được phân tích trong thời gian make 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?
+0

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'? –

+0

@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

Trả lời

5

Hãy xem qua số automake manual. Tính toán phụ thuộc được thực hiện tại thời gian xây dựng, như là một tác dụng phụ của quá trình biên dịch. history of dependency tracking cũng có thể thú vị với bạn. Lưu ý rằng có một lỗi trong cuốn hướng dẫn ở đây: nó làm cho nó âm thanh như depcomp là vô điều kiện gọi, mà không phải là trường hợp (một thử nghiệm tại configure kiểm tra thời gian nếu trình biên dịch của bạn có thể làm mà không có nó. Thấy @[email protected] dòng trong Makefile.in

Vì vậy, những gì xảy ra là các tệp liệt kê các phụ thuộc của từng đối tượng được lưu trữ trong một thư mục con ẩn được gọi là .deps. .)

Bạn hoàn toàn nên liệt kê các tiêu đề của mình trong biến số main_SOURCES, để Makefile của bạn sẽ đóng gói chúng khi bạn chạy make dist (hoặc tốt hơn, make distcheck).

make sẽ không thành công nếu bạn liệt kê tiêu đề không tồn tại, vì bạn không thực sự liệt kê các phụ thuộc trong dòng main_SOURCES của mình. automake sẽ xử lý nhiệm vụ đó và sau đó viết ra các quy tắc để xây dựng main (chỉ phụ thuộc vào tệp đối tượng) và các tệp đối tượng khác nhau (thông qua quy tắc hậu tố). Tiêu đề không phải là tệp đầu vào trực tiếp cho bất kỳ thứ gì trong quá trình xây dựng, do đó bạn có thể trượt qua. Chạy make dist trên dự án mẫu của bạn đưa ra lỗi: