2016-05-18 19 views
5

Gần đây tôi đã thực hiện một bước đột phá trong việc xây dựng các hệ thống nhúng dựa trên Linux, rất xa so với các công cụ nhúng thông thường của tôi nơi tôi có tổng số kiểm soát mọi thứ.Yêu cầu làm rõ về kế thừa Yocto

Là một phần trong đó, tôi đang xem xét hệ thống xây dựng Yocto/bitbake/OpenEmbedded.

Có một điều tôi đang vật lộn với và đó là khái niệm phân tầng, vì vậy tôi đang cố gắng tìm ra cách thức mà các lớp sử dụng/ảnh hưởng đến các lớp khác.

Từ hiểu biết của tôi cho đến nay, một tập tin .bb công thức sử dụng require chỉ đơn giản bao gồm một tập tin, tương tự như C #include "myheader.h"thường trông cục bộ.

Một tệp .bbappend trong lớp "phía trên" sẽ tự động bao gồm tệp cơ sở một cách kỳ diệu, sau đó thực hiện thay đổi cho nó, sắp xếp một tài khoản cố định require.

Ngược lại, các từ khóa inherit tìm kiếm một tập tin .bbclass lớp theo cách giống như nó nằm trong .bb tập tin, và được thừa hưởng tất cả các detials từ họ (loại giống như #include <stdio.h> đó, một lần nữa thường, trông trong vùng hệ thống (a)).

Vì vậy, phần đầu tiên của câu hỏi của tôi là: sự hiểu biết của tôi có đúng không? Hay tôi quá đơn giản?

Phần thứ hai của câu hỏi của tôi sau đó liên quan đến việc sử dụng BBEXTENDS theo hiểu biết hiện tại của tôi. Nếu chúng tôi đã có khả năng mở rộng công thức bằng cách sử dụng require, mục đích của việc liệt kê các công thức nấu ăn đã nói ở biến số BBEXTENDS là gì?


(a) Vâng, tôi biết họ đang cả hoàn toàn thực hiện phụ thuộc về nơi tiêu đề đến từ đâu, tôi chỉ đơn giản nói về chung sử dụng của họ.

Trả lời

7

Đường cong học tập cho Yocto khác với hệ thống tòa nhà khác, đó là lý do tại sao tôi hiểu sự nhầm lẫn của bạn nhưng tôi tin tưởng, điều này đáng giá. Câu hỏi của bạn có liên quan đến BitBake vì vậy tôi khuyên bạn nên BitBake User Manual. Chỉ cần đảm bảo rằng bạn đang đọc cùng phiên bản với bản sửa đổi poky của bạn.

require tương tự như include và có thể được so sánh với #include từ C và C++ giống như bạn đã viết. Mặc dù thông thường, cả hai đều nên được sử dụng để thêm một số phần mở rộng vào công thức (* .bb) phổ biến cho một số lượng công thức nấu ăn (đơn giản - có thể được sử dụng lại). Ví dụ: định nghĩa đường dẫn, tác vụ tùy chỉnh được sử dụng bởi công thức nấu ăn vài. Mục đích chung là làm cho công thức sạch hơn và tách riêng một số hằng số để sử dụng lại.

Điều rất quan trọng -> chênh lệch giữa includerequire (từ BitBake thủ công):

Các chỉ thị bao gồm không tạo ra một lỗi khi tập tin không thể được tìm thấy.Do đó, chúng tôi khuyên rằng nếu tệp bạn đang bao gồm dự kiến ​​tồn tại, bạn nên sử dụng yêu cầu thay vì bao gồm. Làm như vậy đảm bảo rằng lỗi được tạo ra nếu không thể tìm thấy tệp.

Kết quả là: khi bạn bao gồm một tập tin vào * .bb và nó đã không được tìm thấy, các BitBake sẽ không nâng cao một lỗi trong quá trình phân tích cú pháp công thức này. Nếu bạn sử dụng require, lỗi sẽ được nâng lên. Bạn nên sử dụng yêu cầu khi tệp tin trỏ phải tồn tại vì nó chứa các biến quan trọng/nhiệm vụ bắt buộc để xử lý.

Trong trường hợp *.bbappend - nó rất mạnh mẽ. Trường hợp điển hình là bạn đang thêm một số sửa đổi tùy chỉnh vào công thức từ lớp khác bởi *.bbappend vì (ví dụ): bạn không phải là người duy trì công thức gốc hoặc sửa đổi chỉ được sử dụng trong dự án của bạn (sau đó nó phải được đặt trong meta của bạn -layer). Nhưng bạn cũng có thể bbappend công thức trên cùng một lớp. BitBake phân tích tất cả các lớp và sau đó 'tạo' một đầu ra và thực thi nó. Xem thêm trong chương Execution from BitBake man.

Cơ chế inherit có thể được sử dụng để kế thừa *.bbclass nhiệm vụ nơi phổ biến đối với một số mục đích cụ thể được xác định, do đó bạn không cần phải viết chúng trên của riêng bạn, ví dụ: bạn sử dụng inhert cmake hoặc inherit autotools đến công thức của bạn khi nó cần phải cung cấp đầu ra cho các nguồn được xây dựng tương ứng bởi CMake (và bạn đã xác định CMakeLists.txt) hoặc các autotools (Makefile.am, v.v.). Các định nghĩa về các lớp được cung cấp bởi OpenEmbedded được đặt trong/meta/classes/nếu bạn đang sử dụng Yocto phát hành với poky. Bạn có thể kiểm tra chúng và bạn sẽ thấy rằng ví dụ: autotools.bbclass đã được xác định (trong số những người khác) nhiệm vụ: autotools_do_configure() do đó bạn không cần phải viết nó từ đầu. Tuy nhiên bạn có thể xác định lại nó trong công thức của bạn (bằng cách chỉ cung cấp định nghĩa của riêng bạn về chức năng này). Nếu công thức không thể thay đổi, bạn chỉ cần tạo một tệp *.bbappend và viết hàm của riêng bạn do_configure() sẽ ghi đè hàm này từ *.bbclass. Cũng giống như trong các ngôn ngữ OO như C++ hoặc Java.

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