2015-04-20 17 views
5

Tôi hiện đang làm việc trên một dự án Linux bằng cách sử dụng các autotools. Mã được gửi trong SCM (Perforce) và chúng tôi có kịch bản cấu hình, Makefile.am, Makefile.in - các bản mẫu tự động thường dùng. Gần đây, ai đó đã thay đổi Makefile.am, nhưng quên tạo lại Makefile.in; khi tôi đã cố gắng để xây dựng, tôi đã nhận lỗi này:phiên bản tự động (am__api_version) được mã hóa cứng trong tập lệnh cấu hình

WARNING: `automake-1.11' is missing on your system. You should only need it if 
     you modified `Makefile.am', `acinclude.m4' or `configure.ac'. 
     You might want to install the `Automake' and `Perl' packages. 
     Grab them from any GNU archive site. 
cd . && /bin/bash ./config.status Makefile depfiles 

tôi thấy phiên bản automake là hardcoded trong kịch bản cấu hình (và dường như đến từ aclocal.m4):

am__api_version='1.11' 

Vì vậy, tôi đoán Tôi cần automake-1.11 (không 1.10, không phải bất cứ điều gì mới hơn) để tái tạo các tập tin Makefile.in.

Tại sao lại như vậy? Tại sao chúng ta nên gắn liền với một phiên bản automake cụ thể? Chúng tôi chủ yếu xây dựng trên Ubuntu 14.04, trong đó 1.14 là phiên bản mặc định được cài đặt. Có cách nào để nói với hệ thống xây dựng để chỉ đơn giản là sử dụng bất kỳ phiên bản của automake được cài đặt? Hoặc là nó an toàn để có thể loại bỏ các định nghĩa am__api_version từ aclocal.m4?

+0

tôi sẽ xác định "bản mẫu autotools bình thường" để được 'configure.ac' và 'Makefile.am' .Đó là mục đích của hai tệp này là tạo ra kịch bản lệnh 'configure',' Makefile.in', 'Makefile' và các tạo phẩm khác hỗ trợ xây dựng. Các tệp được tạo không cần (thực sự, không nên) được thêm vào bất kỳ điều khiển nguồn nào. – rubicks

Trả lời

0

Câu hỏi quan trọng là tại sao ai đó sửa lỗi am__api_versions. Câu trả lời có thể xảy ra nhất là: Bởi vì automake có xu hướng thay đổi đối số của macro hoặc thậm chí xóa toàn bộ các macro của bản phát hành trước. Trong mỗi thông báo phát hành automake có một phần gọi là

WARNING: Future backward-incompatibilities!

và một người kia gọi là

Obsolete features removed

Bạn có thể tham khảo thông cáo 1.12, 1.13, 1.14

Vì vậy, các configure.ac hoặc Makefile.am sức chứa một số macro đã trở nên lỗi thời trong các bản phát hành sau. Khi gặp phải vấn đề này bạn có hai khả năng. Tìm hiểu tính năng nào đã thay thế tính năng lỗi thời hoặc dính vào một phiên bản automake. Hầu hết các nhà phát triển không cảm thấy rằng các tệp autotools là một phần của mã nguồn dự án. Họ chỉ muốn giữ cho phiên bản làm việc chạy và dính vào phiên bản am hiện tại.

Lưu ý rằng tất cả các bản phân phối đều hỗ trợ các phiên bản cũ hơn của automake. Trong ubuntu bạn có thể tìm thấy:

$ apt-cache search automake | grep automake 
automake - Tool for generating GNU Standards-compliant Makefiles 
automake1.4 - A tool for generating GNU Standards-compliant Makefiles 
automake1.9 - A tool for generating GNU Standards-compliant Makefiles 
automake1.10 - Tool for generating GNU Standards-compliant Makefiles 
automake1.11 - Tool for generating GNU Standards-compliant Makefiles 

Có nghĩa là bạn có thể cài đặt phiên bản yêu cầu automake.

Vì vậy, bạn có thể xóa dòng am__api_version='1.11' và tìm hiểu macro nào đã lỗi thời. Sau đó, bạn sẽ phải quyết định giải pháp nào trong hai giải pháp trên bạn sẽ làm theo.

+0

Đoạn mã nơi phiên bản được ghim được tạo bởi chính bản thân - nó tạo ra các tệp chỉ có thể được tạo lại một phần (ví dụ: tạo lại Makefile.in nhưng không phải là aclocal.m4 v.v.) với cùng một phiên bản của chính nó. Ít nhất đó là sự hiểu biết của tôi. Tôi có thể sửa đổi cấu hình, nhưng nếu nó có thể được tạo lại, nó sẽ bị ghi đè. – fencekicker

+0

@fencekicker xin lỗi vì sự hiểu lầm của tôi. Trong câu hỏi, nó ngụ ý rằng phiên bản 'am' đã được người dùng cố định. – ztik

1

Sự cố là bạn đang cố gắng tạo lại Makefile.in với phiên bản autotools khác. Nó sẽ dẫn đến phiên bản không phù hợp như aclocal.m4 được xây dựng với phiên bản khác nhau và nó được sử dụng để tạo ra các tập tin còn lại.

Thay vì tái chỉ Makefile.in, hãy thử cũng để tái aclocal.m4 và tất cả autotools còn lại tập tin được tạo:

autoreconf --force --install 
+0

Vì vậy, tôi đoán sự lựa chọn giữa: - không lưu trữ bất kỳ tệp được tạo nào trong Perforce và luôn chạy 'autoreconf -fvi' - lưu trữ aclocal.m4, cấu hình, Makefile.in trong Perforce, nhưng sau đó bạn cần chính xác automake phiên bản đã tạo chúng bất cứ khi nào bạn sửa đổi bất kỳ tệp đầu vào nào? Tất nhiên, luôn có tùy chọn 3 - autotools mương :). – fencekicker

+0

Vấn đề của bạn là: "ai đó đã thay đổi Makefile.am, nhưng quên tạo lại Makefile.in". Nếu không, mọi thứ sẽ hoạt động như được thiết kế :) – baf

+0

@fencekicker Nếu bạn lưu trữ aclocal.m4, cấu hình, Makefile.in được tạo bởi cùng một phiên bản autotools bạn không phải quan tâm đến phiên bản tự động – baf

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