2008-11-27 34 views
17

Tôi có một dự án với nhiều nguồn thư mục:Autotools: làm thế nào để thiết lập toàn cầu biên soạn cờ

src/A 
    /B 
    /C 

Trong mỗi, các Makefile.am chứa

AM_CXXFLAGS = -fPIC -Wall -Wextra 

Làm thế nào có thể tránh lặp lại điều này trong mỗi nguồn thư mục ?

Tôi đã cố gắng sửa đổi src/Makefile.am và configure.in nhưng không thành công. Tôi nghĩ rằng tôi có thể sử dụng AC_PROG_CXX để thiết lập các cờ biên dịch trên toàn cầu nhưng không thể tìm thấy nhiều tài liệu về cách sử dụng các macro đó (bạn có bất kỳ con trỏ nào đến tài liệu đó không?).

Cảm ơn trước

Trả lời

23

Bạn có thể làm một vài điều:

(1) Một giải pháp là để bao gồm một mảnh makefile phổ biến trên tất cả Makefile.am của bạn:

include $(top_srcdir)/common.mk 
... 
bin_PROGRAMS = foo 
foo_SOURCES = ... 

trong trường hợp đó bạn sẽ viết

AM_CXXFLAGS = -fpic -Wall -Wextra 

đến common.mk và trong tương lai, sẽ dễ dàng thêm nhiều macro hoặc quy tắc hơn cho tất cả Makefile.am giây bằng cách chỉ chỉnh sửa tệp này.

(2) Một giải pháp khác sẽ được thiết lập các biến toàn cầu trong bạn configure.ac (tên configure.in đã bị phản đối từ lâu), như trong:

... 
AC_SUBST([AM_CXXFLAGS], [-fpic -Wall -Wextra]) 
... 

Sau đó, bạn thậm chí không cần phải nói bất cứ điều gì trong các số Makefile.am của bạn, chúng tự động kế thừa định nghĩa toàn cầu này. Nhược điểm là bạn không thể chọn không tham gia dễ dàng (với giải pháp đầu tiên dễ dàng quyết định không bao gồm common.mk) và sự phụ thuộc không thực sự rõ ràng đối với người thứ ba (khi họ đọc Makefile.am họ không có gợi ý về vị trí những lá cờ có thể đến từ).

(3) Giải pháp thứ ba sẽ được thực hiện như orsogufo đề xuất: ghi đè biến người dùng CXXFLAGS trong configure.ac. Tôi sẽ khuyên bạn nên chống lại nó, bởi vì nó đánh bại một trong các tính năng của GNU Build System: người dùng được phép ghi đè biến này tại make -time. Ví dụ bạn có thể muốn gõ

make CXXFLAGS='-O0 -ggdb' 

khi gỡ lỗi một đoạn mã, và điều này sẽ ghi đè lên bất kỳ định nghĩa của CXXFLAGS (nhưng không những trong AM_CXXFLAGS). Thành thật mà nói, hầu hết các dự án không hỗ trợ điều này một cách chính xác bởi vì họ chơi thủ đoạn với CXXFLAGS.

Cuối cùng, tôi nên đề cập rằng -fpic, -Wall-Werror không phải là tùy chọn di động. Tùy thuộc vào phạm vi dự án của bạn, bạn có thể muốn thêm cấu hình kiểm tra các (gần đây đã mua macro mới để kiểm tra cờ cảnh báo và libtool có thể được sử dụng để xây dựng thư viện được chia sẻ).

+0

Sử dụng bao gồm thành ngữ trong Makefile.am sẽ làm cho nguyên nhân automake để phụ thuộc đầu ra cho Makefile và Makefile.in mà cuối cùng có được trở lại bao gồm tệp và tệp tự động. Vì vậy, việc thay đổi điều này cũng sẽ dẫn đến các bản cập nhật sau này. – johnny

+1

Nó thực sự rất dễ dàng để chọn không tham gia nếu bạn AC_SUBST cờ. Trong Makefile.am, nếu bạn gán AM_CPPFLAGS, chúng sẽ ghi đè lên. Bạn có thể chọn tham gia bằng cách không làm gì hoặc bằng cách thực hiện AM_CPPFLAGS = @ AM_CPPFLAGS @ ... hoặc chọn không tham gia bằng cách không đưa @ AM_CPPFLAGS @ vào bài tập. –

+1

Cờ cảnh báo không thuộc CPPFLAGS như bạn yêu cầu, vì chúng được trình biên dịch sử dụng như trái ngược với bộ xử lý trước. – kusma

0

Sử dụng EXTRA_CFLAGS trong cấu hình.ac

Ví dụ cho trường hợp của bạn nó sẽ là thế này:

EXTRA_CFLAGS=-fPIC -Wall -Wextra

Các vấn đề liên quan