Table of Contents
Giới thiệu
Xây dựng tự động là một thành phần quan trọng của phát triển phần mềm hiện đại, và tầm quan trọng của nó khi các dự án phải chạy trên Windows, Linux, và macOS. Một hệ thống đạo đức hoá chéo xây dựng tự động trong C cung cấp quyền kiểm soát tốt, kiểm tra, và triển khai, không cần thiết một ngôn ngữ bên ngoài. Bằng cách viết lõi tự động trong C, các nhà phát triển đạt được khả năng chuyển đổi tối đa các phụ thuộc thời gian chạy tối thiểu, và khả năng tích hợp sâu sắc với công cụ tự động của hệ điều hành. Bài này khám phá thiết kế, và thử nghiệm chéo tự động cơ bản, và kiểm tra tự động hóa hệ thống tự động xây dựng hoàn toàn trong việc bao gồm các thành phần, thực hiện, và tìm kiếm các ví dụ thực tế, và xây dựng các yếu tố, và thực tế các ví dụ, bạn đã tạo ra các giải pháp.
Tại sao lại xây dựng tự động ở C cho dự án Cross-Platform?
Nhiều nhà phát triển đạt tới Python, Perl, hoặc hệ vỏ khi tự động xây dựng. Tuy nhiên, C cung cấp những ưu điểm độc nhất cho tự động sao chép chéo:
- khả năng xuất hiện: Một chương trình C được viết đúng trên bất kỳ nền tảng nào với trình biên dịch chuẩn (GCC, Clang, MSVC), tránh quan hệ phụ thuộc bộ giải thích.
- Khả năng tập tin cấp thấp của C cho phép tập tin có hiệu quả I/O, tiến trình chạy bộ và quản lý bộ nhớ, thiết yếu để xử lý đồ thị xây dựng lớn.
- Sự kết hợp:) trực tiếp truy cập vào hệ thống APIs (v., , ) cho ta quyền kiểm soát tốt hơn việc thực hiện lệnh.
- Không cần thời gian chạy Python hay Java; hệ nhị phân tự động là nhỏ và dễ dàng gói gọn.
Trong khi các công cụ như C Make và GNU Make tồn tại, một hệ thống tự động dựa trên C tùy chỉnh là có giá trị khi cần thiết xây dựng logic, độ phân giải quan hệ phụ thuộc phức tạp, hoặc tích hợp chặt chẽ với các mã kế hoạch C.
Thành phần lõi của hệ thống tự động xây dựng chéo
Mỗi hệ thống tự động hóa cần một tập hợp các khả năng cơ bản. ở C, những thành phần này phải được thực hiện với khả năng lưu trữ trong tâm trí.
Phân tích tập tin cấu hình
Hệ thống tự động hóa nên đọc tập tin cấu hình định nghĩa mục tiêu, nguồn, quan hệ phụ thuộc, cờ biên dịch. Định dạng chuyển tiếp bao gồm JSON, IN, hoặc một bộ lập trình giá trị riêng đơn giản. Tránh định dạng nền như « Cửa sổ Regisry » hay XML (mặc dù thư viện như libxm2 tồn tại, họ thêm quan hệ phụ thuộc vào phụ thuộc).
Một phân tích giống Ii-i tối thiểu có thể được viết trong tiêu chuẩn C mà không cần thư viện bên ngoài:
)
) )
)
)
)
)
)
Đối với việc phân tích nghiêm ngặt, hãy sử dụng thư viện JSON nhẹ như [FLT: 0] [FLT: 1] – một tập tin C duy nhất không có quan hệ phụ thuộc bên ngoài.
Trừu tượng thực thi lệnh
Chạy bộ biên dịch, liên kết và thử ra cần thiết tiến trình sinh sản. Chức năng chuẩn C hoạt động ở khắp nơi nhưng có giới hạn: không điều khiển dòng lệnh I/O, không thu được kết quả và ngăn chặn hành vi của trẻ. Để tự động hóa mạnh mẽ, tiến trình tạo ra trong một lớp di động.
- Hệ thốngPOSIX (Linux, macOS): Dùng + với để bắt Stdout/strir.
- Cửa sổ:) Hãy dùng với và .
- Gói bọc có khả năng kéo bằng tay:) Hãy dùng (có thể trên PISIX và trên Windows thông qua trong MSVC] cho trường hợp sử dụng đơn giản hơn nơi chỉ cần thu kết xuất.
Chức năng thực hiện lệnh di động:
)
)
)
Luôn luôn kiểm tra các lỗi và xử lý chi tiết cụ thể nền tảng như trích dẫn (dùng cho các đường dẫn Unicode trên Windows).
Phát hiện nền tảng thời gian chạy
Hệ thống tự động của bạn cần phải biết hệ điều hành nào nó đang chạy. Phát hiện có thể xảy ra vào thời điểm biên dịch (các tiến trình sẵn từ vựng) hay vào lúc chạy. Cả hai phương pháp đều hữu ích.
Phát hiện thời gian đa dạng:)
Phát hiện thời gian chạy:
- Trên các hệ thống giống Unix, gọi và kiểm tra .
- Trên Windows, hãy dùng (hoặc bộ mới cho Windows 8.1+).
Kết hợp cả hai điều này cho phép bạn thích nghi với việc xây dựng các lệnh một cách năng động — chẳng hạn, dùng trên các cửa sổ, trên Linux, và trên máy tính cá nhân.
Xử lý lỗi và ghi lưu
Một hệ thống xây dựng sản xuất phải ghi lại tiến trình, cảnh báo và lỗi. Phát triển một mô- đun ghi nhật ký đơn giản với mức độ nghiêm trọng (INFO, ERROR), EROR. Hãy dùng để tìm lỗi và để tìm thông tin. Để bền bỉ ghi vào tập tin có nhãn giờ.
Gặp lỗi khi xử lý lỗi phục hồi (v. d., lệnh phi- 0) và lỗi dẫn đến trường hợp chết (v. d., ra bộ nhớ). Hãy dùng để phục hồi lỗi trong phân cách phức tạp, nhưng thích mã trả về để đơn giản hóa.
Lỗi ví dụ quản lý mẫu:
Thiết kế một kiến trúc kiến trúc kiến trúc kiến trúc
Để giữ cho hệ thống tự động được duy trì trên các nền tảng, hãy sử dụng một thiết kế mô-đun với sự tách biệt rõ ràng của các mối quan tâm:
- Môđun cấu hình: Đọc và xác thực tập tin cấu hình, phơi bày một cửa hàng giá trị phím.
- Môđun bảo vệ: xử lý lệnh thực hiện, nhập/ xuất, và quản lý mã thoát.
- Môđun Platform: Cung cấp các chức năng riêng (bộ phân cách đường dẫn, biến môi trường, phát hiện).
- Môđun Logger: việc ghi nhật ký trung tâm với kết xuất có khả năng cấu hình.
- [FLT: 0] Môđun cấu trúc: có thể sắp xếp các mục tiêu và phụ thuộc, có khả năng sắp xếp địa chất cho việc thực hiện song song.
Mỗi mô- đun nên hiển thị một hệ thống CN đơn giản với các cấu trúc xây dựng mờ nhạt. Ví dụ, mô- đun nền tảng có thể cung cấp:
Sự trừu tượng này cho phép bạn biên dịch hệ thống trên một nền tảng mới bằng cách chỉ thực hiện các móc nền tảng.
Những đoạn phụ đề trong gương
Phát hiện hệ điều hành (thời gian chạy)
Các chức năng C sau đây hoạt động trên cả ba nền tảng chính bằng cách sử dụng các chỉ thị tiền xử lý và chức năng nơi có:
Thực hiện lệnh và cấu hình kết xuất
Một chức năng của Giáo Hoàng mang theo để thực hiện một lệnh và lấy được stdit của nó:
Đang phân tích một cấu hình i II đơn giản
Giả sử tập tin cấu hình giống:
Phân tích sử dụng chức năng chuỗi C chuẩn:
Comment
Tự động thử nghiệm hệ thống tự động xây dựng là quan trọng. Thiết lập một đường ống liên tục (CI) mà biên dịch và chạy hệ thống trên tất cả các nền tảng mục tiêu. Dịch vụ CN phổ biến như [FLT: 0] Hành động , GitLLab CI, hoặc Jenkins cho phép xây dựng cho Windows, Linux và ma trận.
Đối với mỗi nền tảng, công việc của CIA nên:
- Hãy lấy phép tính từ công cụ biên dịch bản địa.
- Chạy thử nghiệm đơn vị (dùng một khung thử nghiệm C nhẹ như [FLT: 0] [FLT: 1] hoặc Hợp nhất).
- Thực hiện thử nghiệm tích hợp: tạo một dự án thử nghiệm nhỏ, chạy công cụ tự động hóa, và xác minh kết quả xuất xây dựng.
- Kiểm tra các trường hợp: còn thiếu tập tin cấu hình, lệnh không hợp lệ, đồ thị phụ thuộc lớn.
Dùng hộp chứa (Docker) cho môi trường Linux và máy ảo để đảm bảo trạng thái sạch. Hơn nữa, hãy xem xét việc thử ra cú pháp: soạn thảo công cụ tự động cho một cấu trúc khác và chạy dưới một trình giả lập (QEMU) để kiểm tra độ trung tâm và kích cỡ bộ chỉnh sửa.
Những cạm bẫy và việc làm chung của nền tảng
Phân cách đường dẫn tập tin
Windows dùng gạch lát (), trong khi Unix dùng dao động trước (. Trong C, hãy dùng hoặc phát hiện vào lúc chạy. Khi xây dựng đường, luôn luôn sử dụng các đường phân cách thích hợp. Để cấu hình, hãy dùng khả năng di chuyển trong tập tin cấu hình — kể cả các chức năng Windows API như chấp nhận cách rạch về phía trước.
Biến
PISIX sử dụng /; Windows dùng /. Tạo một wrapper::
Kết thúc dòng
Windows dùng CRLF; Unix dùng tập tin cấu hình LF. Khi đọc tập tin cấu hình, chuỗi lưu trữ theo dõi trở lại. Hãy dùng và gỡ bỏ nếu có mặt.
Trích dẫn dòng lệnh
Không gian theo đường dẫn hay đối số cần thiết trích dẫn. Trên PSIX, hãy dùng những câu trích dẫn đơn trên Windows, dấu kép. Hãy xây dựng chức năng riêng để xây dựng chuỗi lệnh có quyền trích dẫn trên mỗi nền tảng.
Xử lý tín hiệu
Khi đang chạy tiến trình trẻ em, hệ thống Unix có thể cung cấp SIGCHL. Bỏ qua hoặc xử lý những tín hiệu này để ngăn chặn tiến trình zombie. Trên các cửa sổ, hãy dùng để tắt tùy ý.
Kết hợp với các hệ thống xây dựng đang tồn tại
Công cụ tự động hoá C không cần phải thay thế Make or C Make; nó có thể tăng cường chúng. Ví dụ, công cụ của bạn có thể tạo ra Makefiles or CMakeLists.txt dựa trên một cấu hình cấp cao hơn. Hoặc nó có thể hoạt động như một bệ phóng để dàn xếp nhiều hoặc lệnh qua các thư mục con khác nhau.
Ví dụ: Công cụ của bạn đọc một mô- đun, rồi cho mỗi mô- đun gọi và . Cách tiếp cận lai này cho bạn sự linh hoạt của một hệ thống xây dựng tùy chỉnh trong khi sử dụng các công cụ thành thục để thu thập sự thu thập thông tin.
Hiệu suất và tính song song
Để tăng tốc độ xây dựng, thực hiện tiến trình song song của mục tiêu độc lập. Dùng chỉ (POSISX chỉ trên Unix, trên Windows) hoặc tiến trình không chặn. Một phương pháp đơn giản: duy trì một nhóm trẻ em tiến trình với giới hạn tối đa. Mô- đun đồ thị xây dựng thực hiện mục tiêu loại top và gửi mục tiêu tới một hồ sơ chỉ.
Hãy cẩn thận với tài nguyên chia sẻ (v. d., tập tin bản ghi). Dùng soundxes hoặc các thao tác nguyên tử để nối tiếp thư.
Những sự xem xét an ninh
Xây dựng tự động thường chạy với đặc quyền cao.
- Không bao giờ sử dụng với chuỗi người dùng- ứng dụng mà không cần độ tinh sạch.
- Nếu bạn phải xây dựng một chuỗi lệnh, hãy dùng để trích dẫn đúng cách.
- Kiểm tra tất cả các dữ liệu nhập vào cấu hình — từ chối các ký tự hay đường dẫn bất ngờ.
- Khi tải về các phụ thuộc (nếu hệ thống của bạn hỗ trợ điều đó), hãy dùng hệ thống chính tả kiểu USD (libcril) và kiểm tra tổng kiểm tra.
Hướng tương lai
Hệ thống tự động dựng C có thể mở rộng bằng:
- Hỗ trợ thao tác chung: [FLT: 1] Cho phép xác định mục tiêu ba tầng và tiền tố công cụ.
- Cách tối ưu hoá bộ nhớ tạm: Theo dõi tập tin thời gian và tổng kiểm tra để tránh phục hồi (như ccache).
- Các nhà phát triển tái tạo: Phân phối được xây dựng trên nhiều máy bằng lỗ hổng hay SSH.
- Hệ thốngPlugin: 0] tải thư viện động (.so/.dll) để hỗ trợ các bước xây dựng tự chọn mà không cần sửa chữa lại lõi.
Kết luận
Xây dựng hệ thống tự động bằng chữ thập chéo xây dựng tự động ở C là một nỗ lực khó khăn nhưng đáng giá. Bằng cách thiết kế cẩn thận các thiết kế cơ chế trừu tượng hóa di động để thực hiện tiến trình, phát hiện nền tảng, cấu hình phân tích và xử lý lỗi, bạn có thể tạo một công cụ hoạt động không thể tin được trên Windows, Linux, và macOS. Kết quả là một khung tự động được tổ chức nhanh, tự động mà tích hợp chặt chẽ với các dự án C/C++ và CI. Trong khi các giải quyết không bao gồm nhiều nhu cầu, một tùy chọn thực hiện tùy chọn C không có khả năng kiểm soát và tối thiểu tùy thích hợp với các phụ thuộc của các nhà phát triển và hiệu suất cao.