2009-04-07 42 views
8

Tôi đang học makefiles và tôi biết cách tạo một makefile đơn giản. Tôi đang chuyển sang makefiles lồng nhau. Dưới đây là cấu trúc thư mục của tôiTạo makefile lồng nhau

/src 
...makefile 
...main.cpp 
...foo 
......makefile 
......foo.cpp 
......foo.h 

Khi gốc makefile được gọi, nó gọi là makefile trong thư mục foo. Dưới đây là các câu hỏi của tôi

  1. makefile Tôi nên sử dụng để viết mã để liên kết tất cả các tệp đối tượng? Nếu nó nằm trong makefile gốc, tôi có cần phải chỉ định tất cả các tên tệp đối tượng không?
  2. Đây có phải là tệp thực thi lồng nhau hay nhất không? Hoặc là nó tốt để chỉ có một makefile mà là ở gốc?

Mọi trợ giúp sẽ tuyệt vời!

Trả lời

15

Có rất nhiều điều để nói cho không phải là làm việc này. Đọc Recursive Make Considered Harmful. Cũng trong PDF form.

Phiên bản ngắn ngắn gọn là đệ quy tạo hiệu quả một số phân tán nhưng có thể chồng chéo cây phụ thuộc và không thể đảm bảo được một bản dựng chính xác hoặc hiệu quả tối đa. Vấn đề trở nên tồi tệ hơn nếu bạn hy vọng xây dựng song song.

Để giải quyết vấn đề bạn sắp xếp một, không đệ quy làm cho xây dựng một cây phụ thuộc toàn bộ spanning cho phép thực hiện để giải quyết tất cả các vấn đề trên.

cấu trúc Ví dụ về làm phi đệ quy và giải pháp cho một số vấn đề khó khăn mà đi lên bằng văn bản họ có thể được tìm thấy trong giấy bản gốc và trong câu trả lời cho:

+1

Nếu không làm như vậy là một ý tưởng tồi, có lẽ giải pháp thay thế nên được đề xuất làm câu trả lời. – deadalnix

+1

Vâng. Câu trả lời này ở dạng không còn được chấp nhận trên trang web nữa. Các chỉnh sửa chỉ sửa chữa một phần sự thiếu hụt, nhưng đó là một cái gì đó. – dmckee

3

Thực hiện đệ quy thường được coi là có hại.

Nếu bạn thực sự muốn có khả năng gõ "thực hiện" trong thư mục gốc và để nó xây dựng mọi thứ chỉ bằng cách sử dụng POSIX makefiles, đó là cách duy nhất. Trong trường hợp đó, liên kết các tiểu dự án trong thư mục riêng của họ và các công cụ cuối cùng với nhau trong thư mục gốc.

Nếu bạn sẵn sàng để sử dụng cú pháp gmake, hãy nhìn vào các Makefiles đây: http://github.com/singpolyma/theveeb-ecosystem

+1

Bạn có thể sử dụng POSIX (không phải GNU) để thực hiện xây dựng không đệ quy bằng cách chia nhỏ thành hai bước: 1) nối tất cả các tệp make.inc trong tất cả các subdir; 2) chạy makefile kết quả. Nhưng hầu hết mọi người sử dụng GNU làm cho dù sao, trong đó có chỉ thị "bao gồm". –

+0

Ah, đó là sự thật, tôi không bao giờ mặc dù hack nối. Tôi có xu hướng sử dụng bao gồm. Thông thường tôi muốn rất POSIX, nhưng với makefiles đôi khi đó là một chút lông vì không có chỉ thị bao gồm :) – singpolyma

0

Có hệ thống xây dựng hiện đại hơn như SCons Đó có một cú pháp dễ dàng hơn thực hiện và tránh được nhiều cạm bẫy thực hiện. Ví dụ: SCons quét các tệp nguồn để xác định các phụ thuộc trên đó là tệp riêng, trong khi đó, hãy thực hiện một cách thủ công để xác định các phụ thuộc theo cách thủ công. Nếu bạn, ví dụ: thêm câu lệnh #include mới vào tệp triển khai sẽ không biên dịch lại tệp triển khai đó nếu tiêu đề thay đổi (trừ khi bạn thêm phụ thuộc mới). SCons sẽ tự động phát hiện sự phụ thuộc mới và biên dịch lại mọi thứ cần thiết.