Tôi đang làm việc trên dự án C++ sử dụng autoconf
& automake
và tôi đang cố gắng thiết lập chính xác đường dẫn bao gồm trong *CPPFLAGS
. Tôi đã đọc tài liệu trị giá khoảng 3 giờ và tôi chưa thể tìm ra được. Tôi không tìm kiếm một hack, nhưng đối với cách chính xác để làm điều này. Đây là câu hỏi hóc búa của tôi.cách đặt bao gồm đường dẫn bằng tự động
Như tôi đã nhìn thấy nó, có 3 nguồn hoàn toàn khác nhau cho bao gồm đường dẫn:
- thư viện bên ngoài mà phải được cài đặt cùng với gói của tôi, mà được cấu hình bởi
configure --with-XXX=<PATH>
. - Trong gói của tôi, một số tệp nguồn sử dụng
#include <file.h>
ngay cả khifile.h
là một phần của gói, do đó, để biên dịch chúng, tôi phải đặt đường dẫn bao gồm chính xác. (Lưu ý, đó không phải là tùy chọn để chỉnh sửa tất cả các tệp này.) - Các tiêu chuẩn hay thay đổi (hay không) chỉ định người dùng phải được phép chỉ định đường dẫn riêng của họ. Đó là, tôi không nên thiết lập
CPPFLAGS
ở tất cả.
Trong thiết lập hiện tại của tôi:
- Loại 1 đường dẫn được thiết lập bên trong
configure.ac
bởiAC_SUBST(CPPFLAGS, "$CPPFLAGS -I<path>")
. - Đường dẫn loại 2 được đặt bên trong
Makefile.am
theotest_CPPFLAGS = -I<path>
. - Không thể đặt loại 3. Chính xác hơn, nếu người dùng đặt
CPPFLAGS
trước khi chạymake
, điều này sẽ ghi đè cài đặt Loại 1, làm cho quá trình biên dịch thất bại. Tất nhiên, người dùng có thể thử sử dụngCXXFLAGS
thay vào đó, nhưng người dùng đó có cách sử dụng khác (hãy nhớ, tôi yêu cầu cách chính xác để thực hiện việc này, không phải là hack).
Tôi đã cố khắc phục điều này bằng cách đặt đường dẫn Loại 1 sử dụng AM_CPPFLAGS
bên trong configure.ac
. (Để tham khảo: nếu bạn đặt AM_CPPFLAGS
thay vì CPPFLAGS
, nhưng bạn vẫn cần chạy một số kiểm tra chẳng hạn như AC_CHECK_HEADERS
, bạn cần tạm thời đặt CPPFLAGS
và sau đó hoàn nguyên để kiểm tra hoạt động; điều này được giải thích here.) Điều này giải phóng CPPFLAGS
đối với đường dẫn Loại 3, nhưng tiếc là quá trình biên dịch không thành công do Makefile
-s được sản xuất bởi configure
sẽ chỉ sử dụng AM_CPPFLAGS
nếu không có <target>_CPPFLAGS
chuyên biệt nào tồn tại. Vì vậy, nếu test_CPPFLAGS
tồn tại với đường dẫn Loại 2, biên dịch test
sẽ không thành công vì nó không có đường dẫn Loại 1.
Sửa chữa sẽ chỉ định bên trong Makefile.am
để luôn sử dụng AM_CPPFLAGS
. Nhưng đây có phải là "bởi cuốn sách" không? Tôi có thể làm điều này một cách toàn cầu hay tôi phải chỉnh sửa từng đơn target_CPPFLAGS
? Có một giải pháp "chính xác" nào khác không?
Bằng cách "hay thay đổi", bạn có bao gồm tài liệu tự động chính thức nêu rõ rằng CPPFLAGS là biến người dùng không nên được sửa đổi bởi người duy trì không? (Xem phần 4.8.1 tại http://www.gnu.org/software/autoconf/manual/autoconf.html) –
Mặc dù một ví dụ ít mơ hồ hơn từ tài liệu tự động chính thức có thể rõ ràng hơn, trong đó nêu rõ "Bạn không bao giờ nên xác định lại biến người dùng như CPPFLAGS trong Makefile.am. " trong phần 27.6 tại http://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html#Flag-Variables-Ordering –