Bookmark

OpenWrt SDK, toolchain và cách chọn đúng công cụ

Bản draft để review: SDK và toolchain có thể tạo package không tương thích nếu khác branch, target hoặc ABI. Luôn dùng công cụ tương ứng với firmware đích.

SDK, toolchain và build system là gì?

Ba khái niệm này liên quan nhưng không giống nhau:

  • Build system: toàn bộ hệ thống build OpenWrt, có thể tạo toolchain, kernel, root filesystem, package và firmware image.
  • Toolchain: bộ compiler và công cụ cross-compilation dùng để biên dịch cho kiến trúc đích, ví dụ ARM hoặc MIPS thay vì CPU của máy build.
  • SDK: bộ công cụ rút gọn, thường dùng để biên dịch package bên ngoài dựa trên một firmware target đã xác định.[14][16]

SDK phù hợp khi bạn muốn build package riêng mà không cần build lại toàn bộ firmware.

Khi nào dùng công cụ nào?

Nhu cầuCông cụ phù hợp
Tạo firmware tùy biến từ package có sẵnImageBuilder
Build package riêng cho targetSDK
Sửa package source/patchSDK hoặc build system
Sửa kernel, driver, targetBuild system
Tạo toolchain từ đầuBuild system
Tạo toàn bộ firmwareBuild system

Tải SDK đúng target

SDK cần khớp tối thiểu với:

  • Phiên bản/branch OpenWrt.
  • Target và subtarget.
  • Kiến trúc CPU.
  • ABI và toolchain.

SDK được phát hành cùng hệ thống image tương ứng. Hãy bắt đầu từ:

1
https://downloads.openwrt.org/

Không dùng SDK của target khác chỉ vì package của bạn có vẻ đơn giản. Lỗi ABI có thể chỉ xuất hiện khi cài hoặc chạy package trên router.

Chuẩn bị source package

Có thể lấy package từ source OpenWrt:

1
2
git clone https://github.com/openwrt/openwrt.git
cd openwrt

Nếu dùng SDK archive đã tải sẵn, giải nén rồi chuyển vào thư mục SDK:

1
2
3
mkdir -p ~/openwrt-sdk
# giải nén archive SDK vào thư mục này
cd ~/openwrt-sdk/openwrt-sdk-*/

Cấu trúc thư mục có thể thay đổi theo phiên bản. Hãy kiểm tra xem có Makefile, include/ và thư mục package hay không.

Cập nhật feeds trong SDK

Một số package cần feeds:

1
2
./scripts/feeds update -a
./scripts/feeds install -a

Nếu package nằm trong source checkout, kiểm tra đường dẫn package trước khi build. Không nên copy package từ branch khác vào SDK mà không kiểm tra dependency và API.

Chọn target trong SDK

Mở cấu hình:

1
make menuconfig

Trong SDK, mục tiêu quan trọng là chọn đúng target/kiến trúc và các lựa chọn cần thiết cho package. Nếu SDK đã được phát hành cho một target cố định, vẫn đọc thông tin cấu hình để tránh chọn nhầm biến thể.

Có thể tạo cấu hình mặc định:

1
make defconfig

Build một package

Ví dụ package nằm trong package/aiot/hello/:

1
make package/aiot/hello/compile V=s

Một số tree dùng tên package khác. Có thể tìm Makefile package rồi thay đường dẫn cho phù hợp.

Build toàn bộ package đã chọn:

1
make package/compile V=s

Package .ipk thường được tạo trong thư mục bin/packages/ hoặc thư mục output tương ứng.

Cài thử package trên router

Trước khi cài, kiểm tra kiến trúc và dependency:

1
opkg print-architecture

Trên router:

1
2
3
scp ./bin/packages/<feed>/<arch>/<package>.ipk root@<router-ip>:/tmp/
ssh root@<router-ip>
opkg install /tmp/<package>.ipk

Chỉ dùng package trên router có target/ABI tương thích. Nếu opkg báo thiếu dependency, không nên ép cài bằng cách bỏ qua kiểm tra trừ khi bạn hiểu rõ hậu quả.

Toolchain nằm ở đâu?

Khi build OpenWrt từ source, toolchain được tạo trong tree build và được dùng để biên dịch các thành phần cho target. Người mới thường không cần tự gọi compiler bằng tay; hãy để Makefile của OpenWrt thiết lập biến môi trường và cờ biên dịch.

Nếu cần xem thông tin môi trường build:

1
make V=s package/aiot/hello/compile

Log verbose giúp nhìn thấy compiler, sysroot, CFLAGS và đường dẫn staging. Không nên lấy một compiler hệ thống bất kỳ thay cho toolchain của OpenWrt.

Lỗi thường gặp

Exec format error

Thường do package được build cho sai kiến trúc CPU.

cannot find -l...

Thường do thiếu dependency hoặc package development tương ứng trong staging directory.

Kernel too old hoặc lỗi symbol

Có thể package được build cho branch/kernel khác với firmware đang chạy.

Package cài được nhưng không chạy

Kiểm tra ABI, dynamic linker, quyền thực thi, dependency runtime và log service trên router.

Checklist tương thích

Trước khi phân phối package:

  • Branch OpenWrt giống firmware đích.
  • Target/subtarget đúng.
  • Kiến trúc và ABI đúng.
  • Dependency đã khai báo trong Makefile.
  • Đã test trên router hoặc image tương ứng.
  • Không chứa secret, token hoặc đường dẫn máy build.

Nguồn chính thức

Bài này được AIoT.IO.VN biên soạn lại bằng tiếng Việt, có bổ sung giải thích cho người mới.


0 Bình luận

Góp Ý / Bình Luận / Đánh giá