Tiếng AnhTiếng PhápTiếng Tây Ban Nha

Ad


Biểu tượng yêu thích OnWorks

khuyết điểm - Trực tuyến trên đám mây

Chạy khuyết điểm trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks trên Ubuntu Online, Fedora Online, trình giả lập trực tuyến Windows hoặc trình giả lập trực tuyến MAC OS

Đây là khuyết điểm lệnh có thể chạy trong nhà cung cấp dịch vụ lưu trữ miễn phí OnWorks bằng cách sử dụng một trong nhiều máy trạm trực tuyến miễn phí của chúng tôi như Ubuntu Online, Fedora Online, trình giả lập trực tuyến Windows hoặc trình giả lập trực tuyến MAC OS

CHƯƠNG TRÌNH:

TÊN


Nhược điểm - Hệ thống xây dựng phần mềm

MÔ TẢ


Hướng dẫn và tài liệu tham khảo cho phiên bản 2.2.0

Bản quyền (c) 1996-2000 Free Software Foundation, Inc.

Chương trình này là phần mềm miễn phí; bạn có thể phân phối lại nó và / hoặc sửa đổi nó theo các điều khoản của
Giấy phép Công cộng GNU do Tổ chức Phần mềm Tự do xuất bản; một trong hai
phiên bản 2 của Giấy phép hoặc (tùy chọn của bạn) bất kỳ phiên bản mới hơn.

Chương trình này được phân phối với hy vọng rằng nó sẽ hữu ích, nhưng KHÔNG CÓ BẤT KỲ BẢO HÀNH NÀO;
thậm chí không có sự bảo đảm ngụ ý về KHẢ NĂNG LÊN LỚN hoặc SỰ PHÙ HỢP VỚI MỤC ĐÍCH CỤ THỂ.
Xem Giấy phép Công cộng GNU để biết thêm chi tiết.

Bạn sẽ nhận được một bản sao của Giấy phép Công cộng GNU cùng với chương trình này;
xem tệp SAO CHÉP. Nếu không, hãy viết thư cho Free Software Foundation, Inc., 59 Temple
Địa điểm - Phòng 330, Boston, MA 02111-1307, Hoa Kỳ.

Giới thiệu


Nhược điểm là một hệ thống để xây dựng, chủ yếu, là phần mềm, nhưng hoàn toàn khác với
các hệ thống xây dựng phần mềm trước đó. Nhược điểm được thiết kế từ đầu để đối phó
dễ dàng với việc xây dựng phần mềm trải rộng trên nhiều thư mục nguồn. Nhược điểm
giúp bạn dễ dàng tạo các tập lệnh xây dựng đơn giản, dễ hiểu và có thể bảo trì.
Nhược điểm đảm bảo rằng phần mềm phức tạp có thể tái tạo dễ dàng và chính xác.

Nhược điểm sử dụng một số kỹ thuật để thực hiện tất cả những điều này. Các kịch bản xây dựng chỉ là
Các tập lệnh Perl, làm cho chúng vừa dễ hiểu và rất linh hoạt. Phạm vi toàn cầu của
các biến được thay thế bằng cơ chế nhập / xuất để chia sẻ thông tin giữa
script, cải thiện đáng kể khả năng đọc và khả năng bảo trì của mỗi script.
Xây dựng môi trường được giới thiệu: đây là các đối tượng Perl nắm bắt
thông tin cần thiết để kiểm soát quá trình xây dựng. Nhiều môi trường được sử dụng
khi các ngữ nghĩa khác nhau được yêu cầu để tạo sản phẩm trong cây xây dựng. Nhược điểm
triển khai phân tích phụ thuộc tự động và sử dụng điều này để sắp xếp toàn bộ toàn bộ
xây dựng. Các bản dựng biến thể dễ dàng được tạo ra từ một cây nguồn duy nhất. Xây dựng thông minh
có thể đặt con khi làm việc với các thay đổi được bản địa hóa. Ghi đè có thể được thiết lập thành
dễ dàng ghi đè các hướng dẫn xây dựng mà không cần sửa đổi bất kỳ tập lệnh nào. Mật mã MD5
chữ ký được liên kết với các tệp dẫn xuất và được sử dụng để xác định chính xác liệu
một tệp nhất định cần được xây dựng lại.

Mặc dù cung cấp tất cả những điều trên và hơn thế nữa, Nhược điểm vẫn đơn giản và dễ sử dụng. Điều này sẽ,
hy vọng, trở nên rõ ràng khi bạn đọc phần còn lại của tài liệu này.

Tại sao Nhược điểm? Tại sao không Chế tạo?


Nhược điểm là một làm cho sự thay thế. Trong các đoạn sau, chúng ta xem xét một số
các đặc điểm không mong muốn của chế tạo - và môi trường xây dựng điển hình dựa trên chế tạo - đó
thúc đẩy sự phát triển của Nhược điểm.

Xây dựng phức tạp

Các hệ thống sản xuất dựa trên truyền thống ở bất kỳ quy mô nào có xu hướng trở nên khá phức tạp. Bản gốc làm
tiện ích và các dẫn xuất của nó đã góp phần vào xu hướng này theo một số cách. Make là
không giỏi trong việc xử lý các hệ thống nằm rải rác trên nhiều thư mục. Nhiều công việc-
các nền tảng được sử dụng để vượt qua khó khăn này; lựa chọn thông thường là thực hiện để gọi
chính nó đệ quy cho mỗi thư mục con của một bản dựng. Điều này dẫn đến mã phức tạp, trong
mà người ta thường không rõ cách một biến được đặt hoặc ảnh hưởng của việc thiết lập một biến
sẽ có trên toàn bộ quá trình xây dựng. Ngôn ngữ kịch bản tạo đã dần được mở rộng
để cung cấp nhiều khả năng hơn, nhưng những điều này phần lớn đã làm lộn xộn một
ngôn ngữ quá mức. Thông thường, các bản dựng được thực hiện nhiều lần để cung cấp
sản phẩm thích hợp từ thư mục này sang thư mục khác. Điều này thể hiện một
tăng độ phức tạp của bản dựng.

Xây dựng Khả năng tái lập

Điểm mấu chốt của tất cả các vấn đề luôn là xử lý chính xác các phụ thuộc. Thông thường, một
cố gắng thực hiện một công việc hợp lý của các phụ thuộc trong một thư mục duy nhất, nhưng không
nỗ lực nghiêm túc được thực hiện để thực hiện công việc giữa các thư mục. Ngay cả khi phụ thuộc
hoạt động chính xác, dựa vào so sánh tem thời gian đơn giản để xác định xem
một tệp đã lỗi thời đối với những người phụ thuộc của nó, nói chung, không đủ cho
xác định khi nào cần khôi phục lại tệp. Ví dụ: nếu một thư viện bên ngoài
được xây dựng lại và sau đó được `` gắn '' vào vị trí, dấu thời gian trên các tệp mới được tạo của nó có thể
cũng sớm hơn so với bản dựng cục bộ cuối cùng, vì nó đã được xây dựng trước khi nó được nhìn thấy.

biến thể xây dựng

Make chỉ cung cấp các phương tiện hạn chế để xử lý các bản dựng biến thể. Với sự sinh sôi nảy nở
của nền tảng phần cứng và nhu cầu về mã có thể gỡ lỗi so với mã được tối ưu hóa, khả năng
dễ dàng tạo ra các biến thể này là điều cần thiết. Quan trọng hơn, nếu các biến thể được tạo, nó
điều quan trọng là có thể tách các biến thể hoặc có thể tái tạo
nguyên bản hoặc biến thể tùy ý. Với làm cho rất khó để tách các bản dựng thành
nhiều thư mục xây dựng, tách biệt với nguồn. Và nếu kỹ thuật này không được sử dụng,
cũng hầu như không thể đảm bảo tại bất kỳ thời điểm nào đã cho biết biến thể nào hiện diện trong
cây, mà không cần dùng đến việc xây dựng lại hoàn toàn.

Kho

Make chỉ cung cấp hỗ trợ hạn chế cho việc xây dựng phần mềm từ mã tồn tại trong một
cấu trúc thư mục kho lưu trữ trung tâm. Tính năng VPATH của GNU make (và một số
thực hiện triển khai) nhằm cung cấp điều này, nhưng không hoạt động như mong đợi: nó
thay đổi đường dẫn của tệp đích thành tên VPATH quá sớm trong phân tích của nó, và do đó
tìm kiếm tất cả các phụ thuộc trong thư mục VPATH. Để đảm bảo sự phát triển chính xác
bản dựng, điều quan trọng là có thể tạo tệp trong thư mục bản dựng cục bộ và có
bất kỳ tệp nào trong kho lưu trữ mã (thư mục VPATH, nói cách khác) phụ thuộc vào địa phương
tập tin được xây dựng lại đúng cách. Điều này không thể xảy ra với VPATH mà không cần mã hóa nhiều
kho kiến ​​thức phức tạp trực tiếp vào các tệp makefiles.

Duy trì it đơn giản


Một số khó khăn với make đã được trích dẫn ở trên. Trong này và tiếp theo
, chúng tôi sẽ giới thiệu Nhược điểm và chỉ ra cách giải quyết những vấn đề này.

Perl kịch bản

Nhược điểm là dựa trên Perl. Đó là, các tập lệnh Nhược điểm--Lãnh sựxây dựng tệp, tương đương
đến makefile or trang điểm- tất cả đều được viết bằng Perl. Điều này mang lại lợi ích tức thì:
ngôn ngữ để viết script là một ngôn ngữ quen thuộc. Ngay cả khi bạn không tình cờ là Perl
lập trình viên, cần biết rằng Perl về cơ bản chỉ là một ngôn ngữ khai báo đơn giản,
với quy trình kiểm soát được xác định rõ ràng và ngữ nghĩa quen thuộc. Nó có các biến hoạt động
về cơ bản theo cách bạn mong đợi chúng, các chương trình con, luồng điều khiển, v.v. Ở đó
không có cú pháp đặc biệt nào được giới thiệu cho Nhược điểm. Việc sử dụng Perl làm ngôn ngữ kịch bản
đơn giản hóa nhiệm vụ thể hiện giải pháp thích hợp cho sự phức tạp thường
yêu cầu của một công trình.

Chào bạn, Thế giới!

Để tạo cơ sở cho cuộc thảo luận sau, đây là cách bạn có thể xây dựng Chào bạn, Thế giới! C
ứng dụng có Khuyết điểm:

$ env = khuyết điểm mới ();
Chương trình $ env 'hello', 'hello.c';

Nếu bạn cài đặt tập lệnh này trong một thư mục, hãy đặt tên cho tập lệnh xây dựngvà tạo
chào c tệp nguồn trong cùng một thư mục, sau đó bạn có thể gõ `` khuyết điểm xin chào '' để xây dựng
ứng dụng:

% khuyết điểm xin chào
cc -c xin chào.c -o xin chào.o
cc -o xin chào xin chào.o

Xây dựng môi trường

Một sự đơn giản hóa chính của Nhược điểm là ý tưởng về một xây dựng môi trường. Một công trình
môi trường là một vật được đặc trưng bởi một tập hợp các cặp khóa / giá trị và một tập hợp phương pháp.
Để nói với Cons làm thế nào để xây dựng một cái gì đó, bạn gọi phương thức thích hợp thông qua một
môi trường xây dựng thích hợp. Hãy xem xét ví dụ sau:

$ env = khuyết điểm mới (
CC => 'gcc',
LIBS => 'libworld.a'
);

Chương trình $ env 'hello', 'hello.c';

Trong trường hợp này, thay vì sử dụng môi trường xây dựng mặc định, chúng ta có
ghi đè giá trị của `CC 'để thay vào đó, trình biên dịch GNU C tương đương được sử dụng. Từ
phiên bản này của Chào bạn, Thế giới! yêu cầu một thư viện, libworld.a, chúng tôi đã chỉ định rằng bất kỳ
chương trình được liên kết trong môi trường này nên được liên kết với thư viện đó. Nếu thư viện
đã tồn tại rồi, tốt và tốt, nhưng nếu không, thì chúng tôi cũng sẽ phải bao gồm câu lệnh:

Thư viện $ env 'libworld', 'world.c';

Bây giờ nếu bạn gõ `` khuyết điểm xin chào '', thư viện sẽ được xây dựng trước khi chương trình được liên kết và,
tất nhiên, `gcc 'sẽ được sử dụng để biên dịch cả hai mô-đun:

% khuyết điểm xin chào
gcc -c xin chào.c -o xin chào.o
gcc -c world.c -o world.o
ar r libworld.a world.o
ar: tạo libworld.a
ranlib libworld.a
gcc -o xin chào hello.o libworld.a

Tự động hoàn thành phụ thuộc phân tích

Với Nhược điểm, các phụ thuộc được xử lý tự động. Tiếp tục ví dụ trước, lưu ý
điều đó khi chúng tôi sửa đổi thế giới.c, thế giới.o được biên dịch lại, libworld.a tái tạo, và xin chào
liên kết lại:

% vi world.c
[CHỈNH SỬA]
% khuyết điểm xin chào
gcc -c world.c -o world.o
ar r libworld.a world.o
ar: tạo libworld.a
ranlib libworld.a
gcc -o xin chào hello.o libworld.a

Đây là một ví dụ tương đối đơn giản: Nhược điểm `` biết '' thế giới.o phụ thuộc vào thế giới.c, bởi vì
phần phụ thuộc được thiết lập rõ ràng bằng phương thức `Thư viện '. Nó cũng biết rằng libworld.a
phụ thuộc vào thế giới.oxin chào phụ thuộc vào libworld.a, tất cả vì những lý do tương tự.

Bây giờ nó chỉ ra rằng chào c cũng bao gồm tệp định nghĩa giao diện, thế giới.h:

% emacs thế giới.h
[CHỈNH SỬA]
% khuyết điểm xin chào
gcc -c xin chào.c -o xin chào.o
gcc -o xin chào hello.o libworld.a

Làm sao Cons biết điều đó chào c bao gồm thế giới.h, Và rằng xin chào.o do đó phải
biên dịch lại? Hiện tại, đủ để nói rằng khi cân nhắc có nên hay không xin chào.o lên-
cho đến nay, Cons gọi một máy quét cho sự phụ thuộc của nó, chào c. Máy quét này liệt kê
các tệp được bao gồm bởi chào c để đưa ra một danh sách các phụ thuộc khác, ngoài những
được thực hiện rõ ràng bởi tập lệnh Nhược điểm. Quá trình này là đệ quy: bất kỳ tệp nào được bao gồm bởi
các tập tin bao gồm cũng sẽ được quét.

Cái này không đắt phải không? Câu trả lơi con phụ thuộc vao nhiêu thư. Nếu bạn xây dựng đầy đủ một hệ thống lớn,
thời gian quét là không đáng kể. Nếu bạn xây dựng lại một hệ thống lớn, thì Nhược điểm sẽ
dành một khoảng thời gian hợp lý để suy nghĩ về nó trước khi quyết định rằng không có gì phải
thực hiện (mặc dù không nhất thiết phải nhiều thời gian hơn thực hiện!). Tin tốt là Khuyết điểm làm cho nó
rất dễ dàng để thiết lập con bản dựng của bạn một cách thông minh, khi bạn đang thực hiện các thay đổi được bản địa hóa.

Tự động toàn cầu xây dựng giải trình tự

Bởi vì Cons thực hiện phân tích phụ thuộc đầy đủ và chính xác và thực hiện điều này trên toàn cầu, cho
toàn bộ bản dựng, Cons có thể sử dụng thông tin này để kiểm soát hoàn toàn giải trình tự
của tòa nhà. Trình tự này được thể hiện rõ trong các ví dụ trên và tương đương với những gì
bạn sẽ mong đợi để thực hiện, cung cấp một tập hợp đầy đủ các phụ thuộc. Với Nhược điểm, điều này kéo dài
tầm thường đối với các bản dựng lớn hơn, nhiều thư mục. Kết quả là, tất cả sự phức tạp liên quan
trong việc đảm bảo rằng một bản dựng được tổ chức chính xác - bao gồm phân cấp nhiều lần
xây dựng - bị loại bỏ. Chúng ta sẽ thảo luận thêm về vấn đề này trong các phần tiếp theo.

Xây dựng lớn cây cối - vẫn chỉ as đơn giản


A hệ thống cấp bậc of xây dựng kịch bản

Một bản dựng lớn hơn, về Nhược điểm, được tổ chức bằng cách tạo ra một hệ thống phân cấp của xây dựng kịch bản. Ở trên cùng
của cây là một tập lệnh được gọi là xây dựng. Phần còn lại của các tập lệnh, theo quy ước, là mỗi tập lệnh
gọi là Lãnh sự. Các tập lệnh này được kết nối với nhau, rất đơn giản, bằng cách xây dựng,
Các lệnh `` Xuất '' và `` Nhập ''.

Sản phẩm Xây dựng lệnh

Lệnh `` Build '' có một danh sách Lãnh sự tên tệp và sắp xếp để chúng trở thành
bao gồm trong bản dựng. Ví dụ:

Xây dựng qw (
trình điều khiển / hiển thị / Conscript
driver / mouse / Conscript
parser / Conscript
tiện ích / Conscript
);

Đây là một hệ thống phân cấp hai cấp đơn giản của các tập lệnh xây dựng: tất cả các công ty con Lãnh sự các tập tin
được đề cập ở cấp cao nhất xây dựng tập tin. Lưu ý rằng không phải tất cả các thư mục trong cây
nhất thiết phải có các kịch bản xây dựng liên kết với chúng.

Điều này cũng có thể được viết dưới dạng một kịch bản đa cấp. Ví dụ, xây dựng tập tin có thể
chứa lệnh này:

Xây dựng qw (
parser / Conscript
trình điều khiển / Conscript
tiện ích / Conscript
);

Lãnh sự tập tin trong trình điều khiển thư mục có thể chứa cái này:

Xây dựng qw (
display / Conscript
chuột / Conscript
);

Kinh nghiệm cho thấy rằng mô hình cũ dễ hiểu hơn một chút, vì
toàn bộ cây xây dựng được đặt trước mặt bạn, ở tầng cao nhất. Đề án kết hợp là
cũng có thể. Một thành phần được duy trì riêng biệt cần được kết hợp vào một
xây dựng cây, chẳng hạn, có thể móc vào cây xây dựng ở một nơi, nhưng xác định
phân cấp xây dựng.

Theo mặc định, Cons không thay đổi thư mục làm việc của nó thành thư mục chứa
công ty con Lãnh sự tập tin nó được bao gồm. Hành vi này có thể được kích hoạt cho một bản dựng bởi
chỉ định, ở cấp cao nhất xây dựng tập tin:

Bản ghi_chdir 1;

Khi được bật, Nhược điểm sẽ chuyển thành công ty con Lãnh sự tập tin chứa thư mục
trong khi đọc trong tệp đó, rồi thay đổi trở lại thư mục cấp cao nhất sau khi tệp
đang được tiến hành.

Dự kiến ​​rằng hành vi này sẽ trở thành mặc định trong một số phiên bản tương lai của Cons.
Để chuẩn bị cho quá trình chuyển đổi này, các bản dựng mong đợi Nhược điểm vẫn ở đầu bản dựng
trong khi nó đọc trong một công ty con Lãnh sự tệp nên tắt tính năng này một cách rõ ràng như
sau:

Bản ghi_chdir 0;

Quan hệ, họ hàng đầu, tuyệt đối hồ sơ tên

Bạn có thể nhận thấy rằng tên tệp được chỉ định cho lệnh Xây dựng có liên quan đến
vị trí của tập lệnh mà nó được gọi. Điều này thường đúng với tên tệp khác
đối số cho các lệnh khác, mặc dù chúng tôi cũng có thể đề cập ở đây rằng nếu bạn bắt đầu
tên tệp có dấu thăng, `` # '', thì tệp đó được diễn giải liên quan đến phần trên cùng-
thư mục cấp (nơi xây dựng tập tin cư trú). Và, không có gì đáng ngạc nhiên, nếu bạn bắt đầu nó
với `` / '', thì nó được coi là một tên đường dẫn tuyệt đối. Điều này đúng ngay cả trên các hệ thống
sử dụng dấu gạch chéo ngược thay vì dấu gạch chéo lên phía trước để đặt tên cho các đường dẫn tuyệt đối.

Sử dụng mô-đun in xây dựng kịch bản

Bạn có thể kéo các mô-đun vào từng Lãnh sự tập tin sử dụng Perl bình thường 'sử dụng' hoặc 'yêu cầu'
các câu lệnh:

sử dụng tiếng Anh;
yêu cầu My :: Mô-đun;

Mỗi `` sử dụng '' hoặc `` yêu cầu '' chỉ ảnh hưởng đến một Lãnh sự tệp mà nó xuất hiện. Để sử dụng một
mô-đun trong nhiều Lãnh sự các tệp, bạn phải đặt câu lệnh `` use '' hoặc `` request '' trong mỗi
một trong những cần mô-đun.

Phạm vi of biến

Cấp cao nhất xây dựng tập tin và tất cả Lãnh sự các tệp bắt đầu cuộc sống trong một Perl chung, riêng biệt
Gói. Nhược điểm điều khiển bảng ký hiệu cho gói sao cho bảng ký hiệu cho
mỗi tập lệnh đều trống, ngoại trừ xây dựng tệp, nhận một số dòng lệnh
tranh luận. Do đó, tất cả các biến được đặt hoặc sử dụng đều do tập lệnh đặt
chính nó - không phải bởi một số tập lệnh bên ngoài.

Các biến có thể được rõ ràng nhập khẩu bởi một tập lệnh từ tập lệnh mẹ của nó. Để nhập một
biến, nó phải được xuất khẩu bởi cha mẹ và được khởi tạo (nếu không sẽ xảy ra lỗi
sẽ xảy ra).

Sản phẩm Xuất khẩu lệnh

Lệnh `` Xuất '' được sử dụng như trong ví dụ sau:

$ env = khuyết điểm mới ();
$ INCLUDE = "# xuất / bao gồm";
$ LIB = "# xuất / lib";
Xuất qw (env INCLUDE LIB);
Xây dựng qw (use / Conscript);

Giá trị của các biến đơn giản được đề cập trong danh sách `` Xuất '' sẽ bị loại bỏ
bằng mọi lệnh `` Xây dựng '' tiếp theo. Lệnh `` Export '' sẽ chỉ xuất Perl vô hướng
các biến, nghĩa là, các biến có tên bắt đầu bằng `$ '. Các biến, đối tượng khác, v.v.
có thể được xuất bằng cách tham chiếu - nhưng tất cả các tập lệnh sẽ tham chiếu đến cùng một đối tượng và điều này
đối tượng nên được coi là chỉ đọc bởi các tập lệnh phụ và bởi bản gốc
xuất tập lệnh. Tuy nhiên, có thể chấp nhận được việc gán một giá trị mới cho đại lượng vô hướng đã xuất
biến - điều đó sẽ không thay đổi biến cơ bản được tham chiếu. Trình tự này, cho
ví dụ, là OK:

$ env = khuyết điểm mới ();
Xuất qw (env INCLUDE LIB);
Xây dựng qw (use / Conscript);
$ env = khuyết điểm mới (CFLAGS => '-O');
Xây dựng qw (other / Conscript);

Không quan trọng việc biến được đặt trước hay sau lệnh `` Xuất ''. Các
điều quan trọng là giá trị của biến tại thời điểm lệnh `` Xây dựng '' được thực thi.
Đây là những gì bị sóc đi. Nhân tiện, mọi lệnh `` Xuất '' tiếp theo,
làm mất hiệu lực đầu tiên: bạn phải đề cập đến tất cả các biến bạn muốn xuất trên mỗi
Lệnh `` Xuất ''.

Sản phẩm Nhập khẩu lệnh

Các biến được xuất bằng lệnh `` Xuất '' có thể được nhập vào các tập lệnh con bằng
Lệnh `` Nhập ''. Tập lệnh phụ luôn nhập các biến trực tiếp từ
kịch bản cao cấp. Hãy xem xét ví dụ này:

Nhập qw (env INCLUDE);

Điều này chỉ hợp pháp nếu tập lệnh gốc được xuất cả `$ env 'và` $ INCLUDE'. Nó cũng phải
đã cho từng giá trị biến này. Chỉ kịch bản công ty con là được
nhập một tập hợp con của các biến đã xuất (trong ví dụ này, `` $ LIB '', được xuất bởi
ví dụ trước, không được nhập).

Tất cả các biến đã nhập sẽ tự động được xuất lại, do đó, chuỗi:

Nhập qw (env INCLUDE);
Xây dựng qw (bên dưới-tôi / Conscript);

sẽ cung cấp cả $ env và $ INCLUDE cho tệp phụ. Nếu chỉ có $ env là
được xuất, thì những điều sau sẽ đủ:

Nhập qw (env INCLUDE);
Xuất qw (env);
Xây dựng qw (bên dưới-tôi / Conscript);

Không cần phải nói, các biến có thể được sửa đổi cục bộ trước khi gọi `` Xây dựng '' trên
kịch bản công ty con.

Xây dựng kịch bản đánh giá gọi món

Hạn chế duy nhất về thứ tự các tập lệnh xây dựng là các tập lệnh vượt trội là
đánh giá trước các kịch bản kém cỏi của họ. Cấp cao nhất xây dựng tập tin, chẳng hạn, là
được đánh giá đầu tiên, tiếp theo là bất kỳ tập lệnh kém hơn nào. Đây là tất cả những gì bạn thực sự cần biết
về thứ tự đánh giá, vì thứ tự thường không liên quan. Hãy xem xét những điều sau
Lệnh `` Build '':

Xây dựng qw (
trình điều khiển / hiển thị / Conscript
driver / mouse / Conscript
parser / Conscript
tiện ích / Conscript
);

Chúng tôi đã chọn đặt các tên tập lệnh theo thứ tự bảng chữ cái, đơn giản vì đó là
thuận tiện cho các mục đích bảo trì. Thay đổi thứ tự sẽ không có gì khác biệt với
xây dựng.

A Mô hình cho chia sẻ các tập tin


Một số đơn giản ước

Trong bất kỳ hệ thống phần mềm phức tạp nào, một phương pháp để chia sẻ các sản phẩm xây dựng cần phải
thành lập. Chúng tôi đề xuất một tập hợp các quy ước đơn giản mà không cần thực hiện với
Nhược điểm, nhưng rất hiệu quả.

Quy tắc cơ bản là yêu cầu tất cả các sản phẩm xây dựng cần được chia sẻ giữa
các thư mục được chia sẻ thông qua một thư mục trung gian. Chúng tôi thường gọi đây là
xuất khẩuvà, trong môi trường C, được cung cấp các thư mục con thông thường của thư mục này,
như là bao gồm, lib, bin, Vv

Các thư mục này được xác định bởi cấp cao nhất xây dựng tập tin. Một đơn giản xây dựng nộp cho
a Chào bạn, Thế giới! ứng dụng, được tổ chức bằng cách sử dụng nhiều thư mục, có thể trông giống như sau:

# Xây dựng tệp cho Hello, World!

# Nơi đặt tất cả các sản phẩm được chia sẻ của chúng tôi.
$ EXPORT = '#export';

Xuất qw (CONS BAO GỒM LIB BIN);

# Thư mục tiêu chuẩn để chia sẻ sản phẩm.
$ INCLUDE = "$ XUẤT / bao gồm";
$ LIB = "$ XUẤT / lib";
$ BIN = "$ XUẤT / thùng";

# Một môi trường xây dựng tiêu chuẩn.
$ CONS = khuyết điểm mới (
CPPPATH => $ INCLUDE, # Bao gồm đường dẫn cho Tổng hợp C
LIBPATH => $ LIB, # Đường dẫn thư viện để liên kết các chương trình
LIBS => '-lworld', # Danh sách các thư viện tiêu chuẩn
);

Xây dựng qw (
xin chào / Conscript
thế giới / Conscript
);

Sản phẩm thế giới thư mục của Lãnh sự tệp trông như thế này:

# Tệp Conscript cho thế giới thư mục
Nhập qw (CONS BAO GỒM LIB);

# Cài đặt các sản phẩm của thư mục này
Cài đặt $ CONS $ LIB, 'libworld.a';
Cài đặt $ CONS $ INCLUDE, 'world.h';

# Sản phẩm nội
Thư viện $ CONS 'libworld.a', 'world.c';

xin chào thư mục của Lãnh sự tệp trông như thế này:

# Tệp Conscript cho thư mục xin chào
Nhập qw (CONS BIN);

# Sản phẩm xuất khẩu
Cài đặt $ CONS $ BIN, 'xin chào';

# Sản phẩm nội
Chương trình $ CONS 'hello', 'hello.c';

Để xây dựng một Chào bạn, Thế giới! chương trình với cấu trúc thư mục này, chuyển đến cấp cao nhất
thư mục và gọi `cons 'với các đối số thích hợp. Trong ví dụ sau, chúng tôi
nói với Cons để xây dựng thư mục xuất khẩu. Để xây dựng một thư mục, Cons đệ quy xây dựng tất cả
các sản phẩm đã biết trong thư mục đó (tất nhiên chỉ khi chúng cần xây dựng lại). Nếu có
những sản phẩm đó phụ thuộc vào các sản phẩm khác trong các thư mục khác, sau đó những sản phẩm đó sẽ được xây dựng,
quá.

% khuyết điểm xuất khẩu
Cài đặt world / world.h dưới dạng export / include / world.h
cc -Xuất khẩu / bao gồm -c hello / hello.c -o hello / hello.o
cc -Xuất khẩu / bao gồm -c world / world.c -o world / world.o
ar r world / libworld.a world / world.o
ar: tạo thế giới / libworld.a
ranlib world / libworld.a
Cài đặt world / libworld.a dưới dạng export / lib / libworld.a
cc -o hello / hello hello / hello.o -Lexport / lib -lworld
Cài đặt hello / hello dưới dạng export / bin / hello

Dọn dẹp, có thể hiểu được, vị trí độc lập kịch bản

Bạn sẽ lưu ý rằng hai Lãnh sự các tệp rất sạch sẽ và chính xác. Họ chỉ đơn giản là
chỉ định các sản phẩm của thư mục và cách xây dựng các sản phẩm đó. Hướng dẫn xây dựng
tối thiểu: chúng chỉ định môi trường xây dựng sẽ sử dụng, tên của sản phẩm,
và tên của các đầu vào. Cũng lưu ý rằng các tập lệnh không phụ thuộc vào vị trí: nếu bạn
muốn tổ chức lại cây nguồn của bạn, bạn có thể tự do làm như vậy: bạn chỉ phải thay đổi
xây dựng (trong ví dụ này), để chỉ định các vị trí mới của Lãnh sự các tập tin. Các
việc sử dụng cây xuất khẩu làm cho mục tiêu này trở nên dễ dàng.

Cũng cần lưu ý, cách Cons chăm sóc từng chi tiết nhỏ cho bạn. Tất cả xuất khẩu thư mục, cho
ví dụ, đã được thực hiện tự động. Và các tệp đã cài đặt thực sự được liên kết chặt chẽ với
thư mục xuất khẩu tương ứng, để tiết kiệm không gian và thời gian. Sự chú ý đến chi tiết này giúp tiết kiệm
công việc đáng kể và giúp việc tạo các tập lệnh đơn giản, dễ bảo trì thậm chí còn dễ dàng hơn.

Tách nguồn xây dựng cây


Người ta thường mong muốn giữ mọi tệp có nguồn gốc từ bản dựng hoàn toàn tách biệt với
các tập tin nguồn. Điều này giúp dễ dàng hơn nhiều để theo dõi đâu là tệp nguồn và
cũng làm cho nó đơn giản hơn để xử lý biến thể các bản dựng, đặc biệt nếu bạn muốn các bản dựng biến thể
để cùng tồn tại.

Tách xây dựng nguồn thư mục sử dụng các liên kết lệnh

Nhược điểm cung cấp một cơ chế đơn giản để xử lý tất cả các yêu cầu này. Liên kết
lệnh được gọi như trong ví dụ này:

Liên kết 'xây dựng' => 'src';

Các thư mục được chỉ định được `` liên kết '' với thư mục nguồn được chỉ định. Giả sử
rằng bạn thiết lập một thư mục nguồn, src, với các thư mục con thế giớixin chào bên dưới nó,
như trong ví dụ trước. Sau đó, bạn có thể thay thế cho các dòng xây dựng ban đầu bằng
Sau đây:

Xây dựng qw (
build / world / Conscript
build / hello / Conscript
);

Lưu ý rằng bạn đối xử với Lãnh sự như thể nó tồn tại trong thư mục xây dựng. Bây giờ nếu
bạn gõ lệnh tương tự như trước, bạn sẽ nhận được kết quả sau:

% khuyết điểm xuất khẩu
Cài đặt build / world / world.h dưới dạng export / include / world.h
cc -Xuất hiện / bao gồm -c build / hello / hello.c -o build / hello / hello.o
cc -Xuất hiện / bao gồm -c build / world / world.c -o build / world / world.o
ar r build / world / libworld.a build / world / world.o
ar: tạo build / world / libworld.a
ranlib build / world / libworld.a
Cài đặt build / world / libworld.a dưới dạng export / lib / libworld.a
cc -o build / hello / hello build / hello / hello.o -Lexport / lib -lworld
Cài đặt build / hello / hello dưới dạng export / bin / hello

Một lần nữa, Cons đã chăm sóc các chi tiết cho bạn. Đặc biệt, bạn sẽ nhận thấy rằng tất cả
các bản dựng được thực hiện bằng cách sử dụng tệp nguồn và tệp đối tượng từ thư mục bản dựng. Vì
thí dụ, build / world / world.o được biên dịch từ build / world / world.c
export / include / world.h được cài đặt từ build / world / world.h. Điều này được thực hiện trên hầu hết
hệ thống bằng cách đơn giản của `` cứng '' liên kết các tệp được yêu cầu từ mỗi nguồn
vào thư mục xây dựng thích hợp.

Các liên kết được duy trì một cách chính xác bởi Cons, bất kể bạn làm gì với thư mục nguồn.
Nếu bạn sửa đổi một tệp nguồn, trình chỉnh sửa của bạn có thể thực hiện việc này `` tại chỗ '' hoặc có thể đổi tên nó
đầu tiên và tạo một tệp mới. Trong trường hợp sau, bất kỳ liên kết cứng nào sẽ bị mất. Nhược điểm sẽ
phát hiện điều kiện này vào lần tiếp theo tệp nguồn là cần thiết và sẽ liên kết lại
thích hợp.

Nhân tiện, bạn cũng sẽ nhận thấy rằng Không những thay đổi được yêu cầu đối với cơ bản Lãnh sự
các tập tin. Và chúng ta có thể đi xa hơn, như chúng ta sẽ thấy trong phần tiếp theo.

biến thể xây dựng


Chào bạn, Thế giới! cho trái chuối đào hệ điều hành

Các bản dựng biến thể chỉ yêu cầu một phần mở rộng đơn giản khác. Hãy lấy ví dụ như một
yêu cầu cho phép các bản dựng cho cả hệ điều hành baNaNa và peAcH. Trong trường hợp này,
chúng tôi đang sử dụng hệ thống tệp phân tán, chẳng hạn như NFS để truy cập vào hệ thống cụ thể và
chỉ một hoặc hệ thống khác phải được biên dịch cho bất kỳ lệnh gọi nào
`khuyết điểm '. Đây là một cách chúng tôi có thể thiết lập xây dựng nộp cho chúng tôi Chào bạn, Thế giới!
ứng dụng:

# Xây dựng tệp cho Hello, World!

die qq (OS phải được chỉ định) trừ khi $ OS = $ ARG {OS};
die qq (OS phải là "đào" hoặc "chuối")
nếu $ OS ne "đào" && $ OS ne "banana";

# Nơi đặt tất cả các sản phẩm được chia sẻ của chúng tôi.
$ EXPORT = "# export / $ OS";

Xuất qw (CONS BAO GỒM LIB BIN);

# Thư mục tiêu chuẩn để chia sẻ sản phẩm.
$ INCLUDE = "$ XUẤT / bao gồm";
$ LIB = "$ XUẤT / lib";
$ BIN = "$ XUẤT / thùng";

# Một môi trường xây dựng tiêu chuẩn.
$ CONS = khuyết điểm mới (
CPPPATH => $ INCLUDE, # Bao gồm đường dẫn cho Tổng hợp C
LIBPATH => $ LIB, # Đường dẫn thư viện để liên kết các chương trình
LIBS => '-lworld', # Danh sách các thư viện tiêu chuẩn
);

# $ BUILD là nơi chúng tôi sẽ lấy ra mọi thứ.
$ BUILD = "# build / $ OS";

# Cho biết khuyết điểm về vị trí của các tệp nguồn cho $ BUILD.
Liên kết $ BUILD => 'src';

Xây dựng (
"$ BUILD / xin chào / Conscript",
"$ BUILD / world / Conscript",
);

Bây giờ nếu chúng tôi đăng nhập vào hệ thống peAcH, chúng tôi có thể xây dựng Chào bạn, Thế giới! ứng dụng cho điều đó
nền tảng:

% khuyết điểm xuất OS = đào
Cài đặt bản dựng / đào / thế giới / thế giới.h dưới dạng xuất / đào / bao gồm / thế giới.h
cc -Xuất khẩu / đào / bao gồm -c xây dựng / đào / xin chào / hello.c -o xây dựng / đào / xin chào / xin chào.o
cc -Xuất khẩu / đào / bao gồm -c xây dựng / đào / thế giới / thế giới.c -o xây dựng / đào / thế giới / thế giới.o
ar r xây dựng / đào / thế giới / libworld.a xây dựng / đào / thế giới / thế giới.o
ar: tạo bản dựng / đào / thế giới / libworld.a
ranlib build / đào / world / libworld.a
Cài đặt build / đào / world / libworld.a dưới dạng export / đào / lib / libworld.a
cc -o xây dựng / đào / xin chào / xin chào xây dựng / đào / xin chào / xin chào.o -Lexport / đào / lib -lworld
Cài đặt bản dựng / đào / xin chào / xin chào dưới dạng xuất / đào / bin / xin chào

Biến thể on a chủ đề

Có thể có các biến thể khác của mô hình này. Ví dụ: bạn có thể quyết định rằng bạn muốn
để tách các tệp bao gồm của bạn thành các tệp phụ thuộc vào nền tảng và các tệp độc lập với nền tảng.
Trong trường hợp này, bạn phải xác định một giải pháp thay thế cho $ INCLUDE để phụ thuộc vào nền tảng
các tập tin. Phần lớn Lãnh sự các tệp, tạo ra các tệp bao gồm hoàn toàn độc lập với nền tảng, sẽ
không phải thay đổi.

Bạn cũng có thể muốn biên dịch toàn bộ hệ thống của mình với gỡ lỗi hoặc biên dịch,
ví dụ, đã bật. Bạn có thể làm điều này với các tùy chọn dòng lệnh thích hợp, chẳng hạn như
`DEBUG = on '. Điều này sau đó sẽ được dịch sang nền tảng phù hợp cụ thể
yêu cầu để bật gỡ lỗi (điều này có thể bao gồm việc tắt tối ưu hóa, cho
thí dụ). Bạn có thể tùy ý thay đổi không gian tên cho các loại hệ thống khác nhau này,
nhưng, như chúng ta sẽ thấy trong phần tiếp theo, nó không thiết yếu để làm điều này, vì Nhược điểm là khá
thông minh về việc xây dựng lại mọi thứ khi bạn thay đổi các tùy chọn.

Chữ ký


MD5 mật mã chữ ký

Bất cứ khi nào Cons tạo một tệp dẫn xuất, nó sẽ lưu trữ chữ ký cho tệp đó. Chữ ký
được lưu trữ trong một tệp riêng biệt, một tệp cho mỗi thư mục. Sau khi ví dụ trước được biên dịch,
các .consign tập tin trong xây dựng / đào / thế giới thư mục trông như thế này:

world.o:834179303 23844c0b102ecdc0b4548d1cd1cbd8c6
libworld.a:834179304 9bf6587fa06ec49d864811a105222c00

Số đầu tiên là dấu thời gian - đối với hệ thống UNIX, đây thường là số
giây kể từ ngày 1 tháng 1970 năm 5. Giá trị thứ hai là tổng kiểm tra MDXNUMX. Các Tin nhắn Tiêu
Thuật toán là một thuật toán, được cung cấp một chuỗi đầu vào, tính toán một mật mã mạnh
chữ ký cho chuỗi đó. Tổng kiểm tra MD5 được lưu trữ trong .consign trên thực tế, tệp là một
tóm tắt của tất cả thông tin phụ thuộc cho tệp được chỉ định. Vì vậy, ví dụ, đối với
thế giới.o tệp này bao gồm ít nhất thế giới.c tệp và cả bất kỳ tệp tiêu đề nào có nhược điểm
biết về điều đó được bao gồm, trực tiếp hoặc gián tiếp bởi thế giới.c. Không chỉ vậy, mà
dòng lệnh thực tế đã được sử dụng để tạo thế giới.o cũng được đưa vào tính toán của
chữ ký. Tương tự, libworld.a nhận được một chữ ký `` bao gồm '' tất cả
chữ ký của các thành phần của nó (và do đó, tạm thời, chữ ký của cung cấp their dịch
thành phần), cũng như dòng lệnh đã tạo tệp.

Chữ ký của một tệp không có nguồn gốc được tính toán, theo mặc định, bằng cách lấy hiện tại
thời gian sửa đổi tệp và tên mục nhập của tệp (trừ khi xảy ra
hiện hành .consign mục nhập cho tệp đó, chữ ký đó được sử dụng trong trường hợp nào).

Lưu ý rằng không cần tệp dẫn xuất phụ thuộc vào bất kỳ xây dựng or
Lãnh sự tệp - nếu các thay đổi đối với các tệp này ảnh hưởng đến tệp được đề cập, thì điều này sẽ
được phản ánh tự động trong chữ ký của nó, vì các phần có liên quan của dòng lệnh là
bao gồm trong chữ ký. Những thay đổi không liên quan sẽ không có hiệu lực.

Khi Cons xem xét có lấy một tệp cụ thể hay không, thì trước tiên, nó sẽ tính toán
chữ ký dự kiến ​​của tệp. Sau đó, nó so sánh thời gian sửa đổi cuối cùng của tệp với
thời gian được ghi lại trong .consign mục nhập, nếu tồn tại. Nếu những thời điểm này trùng khớp, thì
chữ ký được lưu trữ trong .consign tập tin được coi là chính xác. Nếu tệp trước đó
chữ ký không khớp với chữ ký mới, dự kiến, khi đó tệp phải được khôi phục lại.

Lưu ý rằng một tệp sẽ được khôi phục lại bất cứ khi nào bất kỳ điều gì về tệp phụ thuộc thay đổi. Trong
đặc biệt, lưu ý rằng bất kì thay đổi thời gian sửa đổi của người phụ thuộc (chuyển tiếp hoặc
ngược thời gian) sẽ buộc biên dịch lại tệp dẫn xuất.

Việc sử dụng những chữ ký này là một phương pháp cực kỳ đơn giản, hiệu quả và
cải thiện đáng kể - khả năng tái tạo của một hệ thống.

Chúng tôi sẽ chứng minh điều này bằng một ví dụ đơn giản:

# Đơn giản "Hello, World!" Xây dựng tệp
$ CFLAGS = '-g' if $ ARG {DEBUG} eq 'on';
$ CONS = khuyết điểm mới (CFLAGS => $ CFLAGS);
Chương trình $ CONS 'hello', 'hello.c';

Lưu ý cách Cons biên dịch lại vào những thời điểm thích hợp:

% khuyết điểm xin chào
cc -c xin chào.c -o xin chào.o
cc -o xin chào xin chào.o
% khuyết điểm xin chào
khuyết điểm: "xin chào" là cập nhật.
% cons DEBUG = xin chào
cc -g -c xin chào.c -o xin chào.o
cc -o xin chào xin chào.o
% cons DEBUG = xin chào
khuyết điểm: "xin chào" là cập nhật.
% khuyết điểm xin chào
cc -c xin chào.c -o xin chào.o
cc -o xin chào xin chào.o

Kho


Nhiều tổ chức phát triển phần mềm sẽ có một hoặc nhiều thư mục kho lưu trữ trung tâm
cây chứa mã nguồn hiện tại cho một hoặc nhiều dự án, cũng như
tệp đối tượng, thư viện và tệp thực thi. Để giảm biên dịch lại không cần thiết,
sẽ hữu ích khi sử dụng các tệp từ kho lưu trữ để xây dựng phần mềm phát triển - giả sử,
tất nhiên, không có tệp phụ thuộc mới hơn tồn tại trong cây xây dựng cục bộ.

Kho

Nhược điểm cung cấp một cơ chế để chỉ định danh sách các kho mã sẽ được tìm kiếm,
theo thứ tự, đối với các tệp nguồn và tệp dẫn xuất không được tìm thấy trong cây thư mục xây dựng cục bộ.

Các dòng sau trong một xây dựng tệp sẽ hướng dẫn Khuyết điểm nhìn đầu tiên dưới
/ usr / testing / repository thư mục và sau đó trong / usr / product / repository danh mục:

Kho lưu trữ qw (
/ usr / testing / repository
/ usr / product / repository
);

Các thư mục kho lưu trữ được chỉ định có thể chứa tệp nguồn, tệp dẫn xuất (đối tượng,
thư viện và tệp thực thi), hoặc cả hai. Nếu không có tệp cục bộ (nguồn hoặc dẫn xuất) trong
thư mục trong đó Cons được thực thi, sau đó tìm thấy bản sao đầu tiên của tệp cùng tên
dưới một thư mục kho lưu trữ sẽ được sử dụng để xây dựng bất kỳ tệp dẫn xuất cục bộ nào.

Cons duy trì một danh sách toàn cầu của các thư mục kho lưu trữ. Nhược điểm sẽ loại bỏ
thư mục hiện tại và bất kỳ thư mục không tồn tại nào từ danh sách.

Tìm kiếm các xây dựng hồ sơ in a Kho

Nhược điểm cũng sẽ tìm kiếm xây dựngLãnh sự các tệp trong cây hoặc cây kho lưu trữ.
Tuy nhiên, điều này dẫn đến tình trạng gà và trứng: làm thế nào để bạn tìm kiếm trong cây kho lưu trữ
cho một xây dựng nộp hồ sơ nếu xây dựng tập tin cho bạn biết kho lưu trữ ở đâu? Để có được
xung quanh điều này, các kho lưu trữ có thể được chỉ định thông qua tùy chọn `-R 'trên dòng lệnh:

% cons -R / usr / testing / repository -R / usr / product / repository.

Bất kỳ thư mục kho lưu trữ nào được chỉ định trong xây dựng or Lãnh sự các tập tin sẽ được thêm vào
đến các thư mục kho lưu trữ được chỉ định bởi các tùy chọn dòng lệnh `-R '.

Kho nguồn các tập tin

Nếu mã nguồn (bao gồm Lãnh sự tệp) cho phiên bản thư viện của Chào bạn,
Thế giới! Ứng dụng C nằm trong kho lưu trữ (không có tệp dẫn xuất), Nhược điểm sẽ sử dụng
tệp nguồn kho lưu trữ để tạo tệp đối tượng cục bộ và tệp thực thi:

% cons -R / usr / src_only / repository xin chào
gcc -c /usr/src_only/repository/hello.c -o xin chào.o
gcc -c /usr/src_only/repository/world.c -o world.o
ar r libworld.a world.o
ar: tạo libworld.a
ranlib libworld.a
gcc -o xin chào hello.o libworld.a

Tạo một tệp nguồn cục bộ sẽ gây ra Nhược điểm để xây dựng lại tệp dẫn xuất thích hợp hoặc
các tập tin:

% pico thế giới.c
[CHỈNH SỬA]
% cons -R / usr / src_only / repository xin chào
gcc -c world.c -o world.o
ar r libworld.a world.o
ar: tạo libworld.a
ranlib libworld.a
gcc -o xin chào hello.o libworld.a

Và việc xóa tệp nguồn cục bộ sẽ khiến Nhược điểm trở lại xây dựng
các tệp từ nguồn kho lưu trữ:

%rm thế giới.c
% cons -R / usr / src_only / repository xin chào
gcc -c /usr/src_only/repository/world.c -o world.o
ar r libworld.a world.o
ar: tạo libworld.a
ranlib libworld.a
gcc -o xin chào hello.o libworld.a

Kho nguồn gốc các tập tin

Nếu một cây kho chứa các tệp dẫn xuất (thường là tệp đối tượng, thư viện hoặc
thực thi), Cons sẽ thực hiện tính toán chữ ký bình thường của nó để quyết định xem
tệp kho lưu trữ được cập nhật hoặc tệp dẫn xuất phải được tạo cục bộ. Điều này có nghĩa rằng,
để đảm bảo tính toán chữ ký chính xác, cây kho lưu trữ cũng phải chứa
.consign tệp được tạo bởi Cons khi tạo tệp dẫn xuất.

Điều này thường sẽ được thực hiện bằng cách xây dựng phần mềm trong kho lưu trữ (hoặc,
cách khác, trong một thư mục xây dựng, và sau đó sao chép kết quả vào kho lưu trữ):

% cd / usr / all / repository
% khuyết điểm xin chào
gcc -c xin chào.c -o xin chào.o
gcc -c world.c -o world.o
ar r libworld.a world.o
ar: tạo libworld.a
ranlib libworld.a
gcc -o xin chào hello.o libworld.a

(Điều này là an toàn ngay cả khi xây dựng tập tin liệt kê / usr / all / repository thư mục trong một
Lệnh `` Kho lưu trữ '' vì Cons sẽ xóa thư mục hiện tại khỏi kho lưu trữ
danh sách.)

Bây giờ, nếu chúng ta muốn tạo một bản sao của ứng dụng của riêng mình chào c tập tin, chúng tôi chỉ cần
để tạo một tệp nguồn cần thiết và sử dụng tùy chọn `-R 'để có Nhược điểm sử dụng tệp khác
các tệp từ kho lưu trữ:

% mkdir $ HOME / bản dựng1
% cd $ HOME / bản dựng1
%ed xin chào.c
[CHỈNH SỬA]
% cons -R / usr / all / repository xin chào
gcc -c xin chào.c -o xin chào.o
gcc -o xin chào hello.o /usr/all/repository/libworld.a

Lưu ý rằng Cons đã không bận tâm đến việc tạo lại một địa chỉ libworld.a thư viện (hoặc biên dịch lại
thế giới.o mô-đun), nhưng thay vào đó sử dụng phiên bản đã được biên dịch từ kho lưu trữ.

Bởi vì các chữ ký MD5 mà Cons đặt trong .consign tệp chứa dấu thời gian cho
các tệp dẫn xuất, dấu thời gian chữ ký phải khớp với dấu thời gian tệp cho một chữ ký
được coi là hợp lệ.

Một số hệ thống phần mềm có thể thay đổi dấu thời gian trên các tệp kho lưu trữ (bằng cách sao chép chúng,
ví dụ), trong trường hợp đó Cons sẽ, theo mặc định, giả sử các chữ ký của kho lưu trữ không hợp lệ
và xây dựng lại các tệp không cần thiết. Hành vi này có thể được thay đổi bằng cách chỉ định:

Kho_hàng_Sig_Times_OK 0;

Điều này nói với Cons nên bỏ qua dấu thời gian khi quyết định xem một chữ ký có hợp lệ hay không. (Ghi chú
rằng việc tránh kiểm tra sự tỉnh táo này có nghĩa là phải có sự kiểm soát thích hợp đối với kho lưu trữ
cây để đảm bảo rằng các tệp dẫn xuất không thể được sửa đổi nếu không cập nhật .consign
Chữ ký.)

Địa phương bản sao of các tập tin

Nếu cây kho chứa kết quả hoàn chỉnh của một lần xây dựng và chúng tôi cố gắng xây dựng từ
kho lưu trữ không có bất kỳ tệp nào trong cây cục bộ của chúng tôi, một điều gì đó vừa phải đáng ngạc nhiên
xảy ra:

% mkdir $ HOME / bản dựng2
% cd $ HOME / bản dựng2
% cons -R / usr / all / repository xin chào
khuyết điểm: "xin chào" là cập nhật.

Tại sao Cons lại nói rằng xin chào chương trình được cập nhật khi không có xin chào chương trình trong
thư mục xây dựng cục bộ? Bởi vì kho lưu trữ (không phải thư mục cục bộ) chứa
up-to-date xin chào chương trình và Khuyết điểm xác định một cách chính xác rằng không cần phải làm gì để
xây dựng lại bản sao cập nhật này của tệp.

Tuy nhiên, có nhiều lần, trong đó, việc đảm bảo rằng một bản sao cục bộ của một
tệp luôn tồn tại. Ví dụ: một kịch bản đóng gói hoặc thử nghiệm có thể giả định rằng
các tệp được tạo tồn tại cục bộ. Thay vì làm cho các tập lệnh phụ này nhận biết được
thư mục kho lưu trữ, lệnh `` Cục bộ '' có thể được thêm vào xây dựng or Lãnh sự tập tin để
chỉ định rằng một tệp hoặc các tệp nhất định phải xuất hiện trong thư mục bản dựng cục bộ:

Qw địa phương (
xin chào
);

Sau đó, nếu chúng ta chạy lại cùng một lệnh, Cons sẽ tạo một bản sao cục bộ của chương trình từ
bản sao kho lưu trữ (cho bạn biết rằng nó đang làm như vậy):

% cons -R / usr / all / repository xin chào
Bản sao cục bộ của hello từ / usr / all / repository / hello
khuyết điểm: "xin chào" là cập nhật.

Lưu ý rằng, vì hành động tạo bản sao cục bộ không được coi là "bản dựng" của
xin chào , Nhược điểm vẫn báo cáo rằng nó được cập nhật.

Tạo bản sao cục bộ hữu ích nhất cho các tệp đang được cài đặt vào
thư mục trung gian (để chia sẻ với các thư mục khác) thông qua lệnh `` Cài đặt ''.
Đi kèm với lệnh `` Cài đặt '' cho một tệp với lệnh `` Cục bộ '' đi kèm là như vậy
phổ biến là Cons cung cấp lệnh `` Install_Local '' như một cách thuận tiện để thực hiện cả hai:

Install_Local $ env, '#export', 'hello';

chính xác tương đương với:

Cài đặt $ env '#export', 'hello';
'# Export / hello' địa phương;

Cả hai lệnh `` Local '' và `` Install_Local '' đều cập nhật cục bộ .consign tập tin với
chữ ký tệp thích hợp để các bản dựng trong tương lai được thực hiện chính xác.

Kho phụ thuộc phân tích

Do tính năng quét tích hợp của nó, Cons sẽ tìm kiếm các cây kho lưu trữ được chỉ định để đưa vào
.h các tập tin. Tuy nhiên, trừ khi trình biên dịch cũng biết về cây kho lưu trữ, nó sẽ
không thể tìm thấy .h các tệp chỉ tồn tại trong một kho lưu trữ. Ví dụ, nếu chào c
tập tin bao gồm chào h tệp trong thư mục hiện tại của nó:

% cons -R / usr / all / repository xin chào
gcc -c /usr/all/repository/hello.c -o hello.o
/usr/all/repository/hello.c:1: hello.h: Không có tệp hoặc thư mục nào như vậy

Giải quyết vấn đề này buộc một số yêu cầu đối với cách môi trường xây dựng
được định nghĩa và theo cách chỉ thị tiền xử lý C `#include 'được sử dụng để bao gồm các tệp.

Để thông báo cho trình biên dịch về các cây kho lưu trữ, Cons sẽ thêm `` -I '' thích hợp
cờ cho các lệnh biên dịch. Điều này có nghĩa là biến `` CPPPATH '' trong
môi trường xây dựng phải chỉ định rõ ràng tất cả các thư mục con sẽ được tìm kiếm
cho các tệp được bao gồm, bao gồm cả thư mục hiện tại. Do đó, chúng tôi có thể sửa lỗi ở trên
ví dụ bằng cách thay đổi tạo môi trường trong xây dựng tập tin như sau:

$ env = khuyết điểm mới (
CC => 'gcc',
CPPPATH => '.',
LIBS => 'libworld.a',
);

Do định nghĩa của biến `` CPPPATH '', điều này mang lại, khi chúng tôi thực thi lại
chỉ huy:

% cons -R / usr / all / repository xin chào
gcc -c -Tôi. -I / usr / all / repository /usr/all/repository/hello.c -o hello.o
gcc -o xin chào hello.o /usr/all/repository/libworld.a

Thứ tự của các cờ `I 'sao chép, đối với bộ tiền xử lý C, cùng một kho lưu trữ-
đường dẫn tìm kiếm thư mục mà Cons sử dụng để phân tích sự phụ thuộc của chính nó. Nếu có
nhiều kho lưu trữ và nhiều thư mục `` CPPPATH '', Cons sẽ thêm vào kho lưu trữ
các thư mục ở đầu mỗi thư mục `CPPPATH ', nhanh chóng nhân số
của cờ `I '. Như một ví dụ điển hình, một xây dựng tệp chứa:

Kho lưu trữ qw (
/ u1
/ u2
);

$ env = khuyết điểm mới (
CPPPATH => 'a: b: c',
);

Sẽ mang lại một lệnh biên dịch của:

cc -Ia -I / u1 / a -I / u2 / a -Ib -I / u1 / b -I / u2 / b -Ic -I / u1 / c -I / u2 / c -c hello.c -o xin chào.o

Bởi vì Nhược điểm dựa vào các cờ `` I '' của trình biên dịch để truyền đạt thứ tự trong đó
thư mục kho lưu trữ phải được tìm kiếm, Việc xử lý các thư mục kho lưu trữ là
về cơ bản không tương thích với việc sử dụng dấu ngoặc kép trên chỉ thị `#include 'trong C của bạn
mã nguồn:

#include "file.h" / * KHÔNG SỬ DỤNG CÁC BÁO GIÁ GẤP ĐÔI NHƯ THẾ NÀY * /

Điều này là do hầu hết các bộ tiền xử lý C, khi đối mặt với chỉ thị như vậy, trước tiên sẽ luôn
tìm kiếm thư mục chứa tệp nguồn. Điều này làm suy yếu công phu `` I ''
các tùy chọn mà Cons xây dựng để làm cho bộ tiền xử lý phù hợp với tìm kiếm ưa thích của nó
con đường.

Do đó, khi sử dụng cây kho trong Cons, luôn luôn sử dụng dấu ngoặc nhọn để bao gồm
các tập tin:

#bao gồm / * SỬ DỤNG ANGLE-BRACKETS INSTEAD * /

Kho_Danh sách

Cons cung cấp lệnh `Repository_List 'để trả về danh sách tất cả các thư mục kho lưu trữ
theo thứ tự tìm kiếm hiện tại của họ. Điều này có thể được sử dụng để gỡ lỗi hoặc để thực hiện Perl phức tạp hơn
đồ đạc:

@ danh sách = Repository_List;
print join ('', @list), "\ n";

Kho tương tác với khác Nhược điểm Tính năng, đặc điểm

Nhược điểm 'xử lý cây kho lưu trữ tương tác chính xác với các tính năng Nhược điểm khác - đó là
phải nói rằng, nó thường làm những gì bạn mong đợi.

Đáng chú ý nhất, các cây kho lưu trữ tương tác chính xác và khá mạnh mẽ, với 'Liên kết'
yêu cầu. Một cây kho lưu trữ có thể chứa một hoặc nhiều thư mục con cho các bản dựng phiên bản
được thiết lập thông qua `` Liên kết '' đến một thư mục con nguồn. Nhược điểm sẽ tìm kiếm các tệp có nguồn gốc trong
các thư mục con xây dựng thích hợp dưới cây kho lưu trữ.

Mặc định mục tiêu


Cho đến bây giờ, chúng tôi đã chứng minh việc gọi ra Khuyết điểm với một mục tiêu rõ ràng để xây dựng:

% khuyết điểm xin chào

Thông thường, Cons không xây dựng bất cứ điều gì trừ khi một mục tiêu được chỉ định, nhưng chỉ định '.'
(thư mục hiện tại) sẽ xây dựng mọi thứ:

% khuyết điểm # không xây dựng bất cứ điều gì

% khuyết điểm. # xây dựng mọi thứ trong thư mục cấp cao nhất

Thêm phương thức `` Mặc định '' vào bất kỳ xây dựng or Lãnh sự tệp sẽ thêm các
nhắm mục tiêu đến một danh sách các mục tiêu mặc định. Nhược điểm sẽ xây dựng các giá trị mặc định này nếu không có
mục tiêu được chỉ định trên dòng lệnh. Vì vậy, thêm dòng sau vào cấp cao nhất
xây dựng tệp sẽ bắt chước hành vi điển hình của Make là xây dựng mọi thứ theo mặc định:

Vỡ nợ '.';

Sau đây sẽ thêm xin chàoTạm biệt lệnh (trong cùng thư mục với
xây dựng or Lãnh sự tệp) vào danh sách mặc định:

Qw mặc định (
xin chào
Tạm biệt
);

Phương thức `` Mặc định '' có thể được sử dụng nhiều lần để thêm mục tiêu vào danh sách mặc định.

Chọn lọc xây dựng


Nhược điểm cung cấp hai phương pháp để giảm kích thước của bản dựng đã cho. Đầu tiên là bằng cách chỉ định
mục tiêu trên dòng lệnh và thứ hai là một phương pháp để cắt tỉa cây xây dựng. Tốt
xem xét đặc điểm kỹ thuật mục tiêu trước tiên.

Chọn lọc nhắm mục tiêu

Giống như make, Cons cho phép đặc tả các `` mục tiêu '' trên dòng lệnh. Mục tiêu nhược điểm
có thể là tệp hoặc thư mục. Khi một thư mục được chỉ định, đây chỉ đơn giản là một đoạn ngắn-
ký hiệu tay cho mọi sản phẩm phái sinh - mà Nhược điểm biết về - trong
thư mục và bên dưới. Ví dụ:

% khuyết điểm xây dựng / hello / hello.o

có nghĩa là xây dựng xin chào.o và mọi thứ xin chào.o có thể cần. Đây là từ trước
phiên bản của Chào bạn, Thế giới! chương trình trong đó xin chào.o phụ thuộc vào
export / include / world.h. Nếu tệp đó không được cập nhật (vì ai đó đã sửa đổi
src / world / world.h), sau đó nó sẽ được xây dựng lại, mặc dù nó nằm trong một thư mục từ xa
xây dựng / xin chào.

Trong ví dụ này:

% khuyết điểm xây dựng

Mọi thứ trong xây dựng thư mục được xây dựng, nếu cần thiết. Một lần nữa, điều này có thể gây ra nhiều tệp hơn
được xây dựng. Đặc biệt, cả hai export / include / world.hexport / lib / libworld.a đang
yêu cầu của xây dựng / xin chào thư mục, và vì vậy chúng sẽ được xây dựng nếu chúng đã lỗi thời.

Nếu chúng tôi làm, thay vào đó:

% khuyết điểm xuất khẩu

thì chỉ những tệp cần được cài đặt trong thư mục xuất mới được xây dựng lại, nếu
cần thiết, và sau đó được cài đặt ở đó. Lưu ý rằng `` bản dựng khuyết điểm '' có thể tạo các tệp tin 'khuyết điểm
export 'không xây dựng và ngược lại.

Không `` đặc biệt '' mục tiêu

Với Nhược điểm, các mục tiêu `` đặc biệt '' theo phong cách trang điểm không bắt buộc. Tương tự đơn giản nhất với nhược điểm
là sử dụng đặc biệt xuất khẩu thư mục, thay vào đó. Ví dụ, giả sử rằng bạn có một
toàn bộ loạt bài kiểm tra đơn vị được liên kết với mã của bạn. Các bài kiểm tra trực tiếp trong
thư mục nguồn gần mã. Tuy nhiên, thông thường, bạn không muốn xây dựng các bài kiểm tra này.
Một giải pháp là cung cấp tất cả các hướng dẫn xây dựng để tạo các bài kiểm tra, sau đó
cài đặt các bài kiểm tra vào một phần riêng biệt của cây. Nếu chúng tôi cài đặt các bài kiểm tra ở cấp cao nhất
thư mục được gọi là kiểm tra, sau đó:

% khuyết điểm kiểm tra

sẽ xây dựng tất cả các bài kiểm tra.

% khuyết điểm xuất khẩu

sẽ xây dựng phiên bản sản xuất của hệ thống (nhưng không phải thử nghiệm) và:

% khuyết điểm xây dựng

có lẽ nên tránh (vì nó sẽ biên dịch các bài kiểm tra không liên tục).

Nếu bạn chỉ muốn xây dựng một thử nghiệm duy nhất, thì bạn có thể đặt tên cho thử nghiệm một cách rõ ràng (trong
hoặc là kiểm tra thư mục hoặc xây dựng danh mục). Bạn cũng có thể tổng hợp các bài kiểm tra
thành một hệ thống phân cấp thuận tiện trong thư mục kiểm tra. Hệ thống phân cấp này không cần
nhất thiết phải khớp với hệ thống phân cấp nguồn, giống như cách thức mà hệ thống phân cấp bao gồm
có thể không khớp với phân cấp nguồn (phân cấp bao gồm không chắc hơn
sâu hơn hai cấp, đối với các chương trình C).

Nếu bạn muốn xây dựng hoàn toàn mọi thứ trong cây (tùy thuộc vào bất kỳ tùy chọn nào bạn
chọn), bạn có thể sử dụng:

% khuyết điểm.

Điều này không đặc biệt hiệu quả, vì nó sẽ đi lại tất cả các cây,
kể cả cây nguồn. Tất nhiên, cây nguồn có thể có các đối tượng có thể xây dựng trong
nó - không có gì ngăn cản bạn làm điều này, ngay cả khi bạn thường xây dựng trong một bản dựng riêng biệt
cây.

Xây dựng Cắt tỉa


Cùng với việc lựa chọn mục tiêu, xây dựng cắt tỉa có thể được sử dụng để giảm phạm vi của
xây dựng. Trong ví dụ peAcH và baNaNa trước đó, chúng ta đã thấy cách điều khiển tập lệnh
việc cắt tỉa xây dựng có thể được sử dụng để chỉ cung cấp một nửa số công trình tiềm năng cho bất kỳ
lời kêu gọi của `` khuyết điểm ''. Nhược điểm cũng cung cấp, như một sự tiện lợi, một quy ước dòng lệnh
cho phép bạn chỉ định cái nào Lãnh sự các tệp thực sự được `` xây dựng '' - nghĩa là, được kết hợp
vào cây xây dựng. Ví dụ:

% khuyết điểm xây dựng + thế giới

Đối số `+ 'giới thiệu một biểu thức chính quy Perl. Tất nhiên, điều này phải được trích dẫn tại
mức shell nếu có bất kỳ siêu ký tự shell nào trong biểu thức. Các
biểu thức được so khớp với mỗi Lãnh sự tệp đã được đề cập trong một `` Bản dựng ''
và chỉ những tập lệnh có tên phù hợp mới thực sự được kết hợp vào
dựng cây. Cho phép nhiều đối số như vậy, trong trường hợp đó đối số phù hợp với bất kỳ đối số nào trong số chúng
là đủ để đưa vào một tập lệnh.

Trong ví dụ ở trên, xin chào chương trình sẽ không được xây dựng, vì Nhược điểm sẽ không có
kiến thức về chữ viết xin chào / Conscript. Các libworld.a kho lưu trữ sẽ được xây dựng, tuy nhiên, nếu
Cần được.

Có một số cách sử dụng để cắt tỉa xây dựng thông qua dòng lệnh. Có lẽ hữu ích nhất
là khả năng thực hiện các thay đổi cục bộ và sau đó, với đủ kiến ​​thức về
hậu quả của những thay đổi đó, hạn chế kích thước của cây xây dựng để tăng tốc độ
thời gian xây dựng lại. Cách sử dụng thứ hai để cắt tỉa xây dựng là chủ động ngăn chặn việc biên dịch lại
của một số tệp nhất định mà bạn biết sẽ được biên dịch lại, chẳng hạn như tệp tiêu đề đã sửa đổi.
Bạn có thể biết rằng những thay đổi đối với tệp tiêu đề là không quan trọng hoặc
các thay đổi có thể bị bỏ qua một cách an toàn đối với hầu hết các cây, cho mục đích thử nghiệm.
cho rằng việc thừa nhận kiểu hành vi này là thực dụng, với sự hiểu biết rằng
vào lần xây dựng đầy đủ tiếp theo sẽ có mọi thứ cần được xây dựng lại. Không có tương đương
sang lệnh `` make touch '', để đánh dấu các tệp là cập nhật vĩnh viễn. Vì vậy, bất kỳ rủi ro nào
phát sinh do cắt tỉa xây dựng được giảm thiểu. Đối với công việc chất lượng phát hành, rõ ràng, chúng tôi khuyên bạn nên
mà bạn không sử dụng tính năng cắt tỉa bản dựng (hoàn toàn có thể sử dụng trong quá trình tích hợp, tuy nhiên,
để kiểm tra biên dịch, v.v. Chỉ cần đảm bảo thực hiện một bản dựng không bị hạn chế trước khi cam kết
hội nhập).

Thẻ Tạm thời ghi đè


Cons cung cấp một cơ chế rất đơn giản để ghi đè các khía cạnh của một bản dựng. Bản chất là
rằng bạn viết một tệp ghi đè có chứa một hoặc nhiều lệnh `` Ghi đè '' và bạn
chỉ định điều này trên dòng lệnh, khi bạn chạy `khuyết điểm ':

% cons -o so với xuất khẩu

sẽ xây dựng xuất khẩu thư mục, với tất cả các tệp dẫn xuất phải tuân theo các ghi đè hiện tại
trong kết thúc tập tin. Nếu bạn bỏ qua tùy chọn `` -o ', thì mọi thứ cần thiết để xóa
tất cả các ghi đè sẽ được xây dựng lại.

Ghi đè môi trường biến

Tệp ghi đè có thể chứa hai loại ghi đè. Đầu tiên là môi trường đến
biến. Chúng thường có thể truy cập được bởi xây dựng tệp từ băm `% ENV '
Biến đổi. Những điều này có thể được ghi đè một cách đáng kể trong tệp ghi đè bằng cách đặt
các phần tử thích hợp của `% ENV '(những phần tử này cũng có thể bị ghi đè trong môi trường của người dùng,
tất nhiên rồi).

Sản phẩm Ghi đè lên lệnh

Loại ghi đè thứ hai được thực hiện bằng lệnh `` Ghi đè '', trông giống như
điều này:

Ghi đè , => , => , ...;

Biểu thức chính quy regexp được so khớp với mọi tệp dẫn xuất là một ứng cử viên
cho bản dựng. Nếu tệp dẫn xuất khớp, thì các cặp biến / giá trị được sử dụng để
ghi đè các giá trị trong môi trường xây dựng được liên kết với tệp dẫn xuất.

Giả sử rằng chúng ta có một môi trường xây dựng như thế này:

$ CONS = khuyết điểm mới (
COPT => '',
CDBG => '-g',
CFLAGS => '% COPT% CDBG',
);

Sau đó, nếu chúng tôi có một tệp ghi đè kết thúc chứa lệnh này:

Ghi đè '\ .o $', COPT => '-O', CDBG => '';

thì bất kỳ lệnh gọi `` khuyết điểm '' nào với `-o over 'sẽ tạo ra .o các tệp thông qua môi trường này sẽ
khiến chúng được biên dịch bằng `-O 'và không có` -g'. Tất nhiên, ghi đè có thể là
bị giới hạn trong một thư mục duy nhất bởi sự lựa chọn thích hợp của một biểu thức chính quy.

Đây là phiên bản gốc của Hello, World! chương trình, được xây dựng với môi trường này.
Lưu ý rằng Cons xây dựng lại các phần thích hợp khi ghi đè được áp dụng hoặc loại bỏ:

% khuyết điểm xin chào
cc -g -c xin chào.c -o xin chào.o
cc -o xin chào xin chào.o
% cons -o xin chào
cc -O -c xin chào.c -o xin chào.o
cc -o xin chào xin chào.o
% cons -o xin chào
khuyết điểm: "xin chào" là cập nhật.
% khuyết điểm xin chào
cc -g -c xin chào.c -o xin chào.o
cc -o xin chào xin chào.o

Điều quan trọng là lệnh `` Ghi đè '' chỉ được sử dụng cho mục đích tạm thời, nhanh chóng
các ghi đè cần thiết cho sự phát triển vì các ghi đè không độc lập với nền tảng và
bởi vì họ dựa quá nhiều vào kiến ​​thức sâu sắc về hoạt động của các tập lệnh. Vì
sử dụng tạm thời, tuy nhiên, chúng chính xác là những gì bạn muốn.

Lưu ý rằng nó vẫn hữu ích khi cung cấp, chẳng hạn như khả năng tạo một
phiên bản của một hệ thống để sử dụng trong sản xuất - từ xây dựngLãnh sự các tập tin. Cách này
bạn có thể điều chỉnh hệ thống được tối ưu hóa cho phù hợp với nền tảng. Trường hợp cần phải đánh đổi trình tối ưu hóa
được thực hiện (ví dụ: các tệp cụ thể có thể không được biên dịch với tối ưu hóa đầy đủ), sau đó
những điều này có thể được ghi lại cho hậu thế (và khả năng tái tạo) trực tiếp trong các tập lệnh.

Hơn on xây dựng môi trường


Mặc định xây dựng biến

Chúng tôi đã đề cập và sử dụng khái niệm về một xây dựng môi trường, nhiều lần trong
các trang trước. Bây giờ là lúc để làm cho điều này cụ thể hơn một chút. Với những điều sau đây
tuyên bố:

$ env = khuyết điểm mới ();

một tham chiếu đến môi trường xây dựng mới, mặc định được tạo. Điều này chứa một số
của các biến xây dựng và một số phương pháp. Hiện tại, danh sách mặc định của
các biến xây dựng được định nghĩa như sau:

CC => 'cc',
CFLAGS => '',
CCCOM => '% CC% CFLAGS% _IFLAGS -c% <-o%>',
INCDIRPREFIX => '-Tôi',
CXX => '% CC',
CXXFLAGS => '% CFLAGS',
CXXCOM => '% CXX% CXXFLAGS% _IFLAGS -c% <-o%>',
LINK => '% CXX',
LINKCOM => '% LINK% LDFLAGS -o%>% <% _LDIRS% LIBS',
LINKMODULECOM => '% LD -r -o%>% <',
LIBDIRPREFIX => '-L',
AR => 'ar',
ARFLAGS => 'r',
ARCOM => "% AR% ARFLAGS%>% <\ n% RANLIB%>",
RANLIB => 'ranlib',
AS => 'as',
ASFLAGS => '',
ASCOM => '% AS% ASFLAGS% <-o%>',
LD => 'ld',
LDFLAGS => '',
PREFLIB => 'lib',
SUFLIB => '.a',
SUFLIBS => '.so: .a',
SUFOBJ => '.o',
ENV => {'PATH' => '/ thùng rác:/ usr / bin'},

Trên hệ thống Win32 (Windows NT), các biến xây dựng sau được ghi đè trong
mặc định:

CC => 'cl',
CFLAGS => '/ nologo',
CCCOM => '% CC% CFLAGS% _IFLAGS / c% </ Fo%>',
CXXCOM => '% CXX% CXXFLAGS% _IFLAGS / c% </ Fo%>',
INCDIRPREFIX => '/ I',
LINK => 'liên kết',
LINKCOM => '% LINK% LDFLAGS / out:%>% <% _LDIRS% LIBS',
LINKMODULECOM => '% LD / r / o%>% <',
LIBDIRPREFIX => '/ LIBPATH:',
AR => 'lib',
ARFLAGS => '/ nologo',
ARCOM => "% AR% ARFLAGS / ra:%>% <",
RANLIB => '',
LD => 'liên kết',
LDFLAGS => '/ nologo',
PREFLIB => '',
SUFEXE => '.exe',
SUFLIB => '.lib',
SUFLIBS => '.dll: .lib',
SUFOBJ => '.obj',

Các biến này được sử dụng bởi các phương pháp khác nhau liên quan đến môi trường, trong
cụ thể là bất kỳ phương thức nào cuối cùng gọi một lệnh bên ngoài sẽ thay thế các
các biến vào lệnh cuối cùng, nếu thích hợp. Ví dụ, phương thức `` Đối tượng '' sử dụng
một số tệp nguồn và sắp xếp để dẫn xuất, nếu cần, đối tượng tương ứng
các tập tin. Ví dụ:

Đối tượng $ env 'foo.c', 'bar.c';

Điều này sẽ sắp xếp để sản xuất, nếu cần thiết, foo.othanh.o. Lệnh được gọi đơn giản là
`% CCCOM ', mở rộng thông qua thay thế, thành lệnh bên ngoài thích hợp được yêu cầu
để xây dựng từng đối tượng. Chúng tôi sẽ khám phá thêm các quy tắc thay thế trong `` Lệnh ''
dưới đây.

Các biến xây dựng cũng được sử dụng cho các mục đích khác. Ví dụ, `` CPPPATH '' là
được sử dụng để chỉ định một đường dẫn được phân tách bằng dấu hai chấm của các thư mục include. Những thứ này nhằm mục đích
được chuyển tới bộ tiền xử lý C và cũng được sử dụng bởi máy quét tệp C để
xác định các phần phụ thuộc liên quan đến một Tổng hợp C. Các biến bắt đầu bằng
gạch dưới, được tạo bằng nhiều phương pháp khác nhau và thường được coi là `` nội bộ ''
biến. Ví dụ: khi một phương thức được gọi, phương thức này yêu cầu việc tạo một đối tượng
từ nguồn C, biến `_IFLAGS 'được tạo: biến này tương ứng với các công tắc` -I'
được yêu cầu bởi trình biên dịch C để đại diện cho các thư mục được chỉ định bởi `CPPPATH '.

Lưu ý rằng, đối với bất kỳ môi trường cụ thể nào, giá trị của một biến được đặt một lần và sau đó
không bao giờ đặt lại (để thay đổi một biến, bạn phải tạo một môi trường mới. Các phương thức được cung cấp
để sao chép các môi trường hiện có cho mục đích này). Một số biến nội bộ, chẳng hạn như
`_IFLAGS 'được tạo theo yêu cầu, nhưng sau khi được thiết lập, chúng vẫn cố định trong vòng đời của
môi trường.

Các biến `` CFLAGS '', `LDFLAGS 'và` ARFLAGS' đều cung cấp một vị trí để chuyển các tùy chọn đến
trình biên dịch, trình tải và trình lưu trữ, tương ứng. Ít rõ ràng hơn, `` INCDIRPREFIX ''
biến chỉ định chuỗi tùy chọn được thêm vào đầu mỗi bao gồm
thư mục để trình biên dịch biết nơi tìm .h các tập tin. Tương tự,
Biến LIBDIRPREFIX chỉ định chuỗi tùy chọn được nối vào đầu
mỗi thư mục mà trình liên kết nên tìm kiếm các thư viện.

Một biến khác, `` ENV '', được sử dụng để xác định môi trường hệ thống trong quá trình thực thi
của một lệnh bên ngoài. Theo mặc định, biến môi trường duy nhất được đặt là `` PATH '',
là đường dẫn thực thi cho một lệnh UNIX. Để có khả năng tái tạo tối đa, bạn nên
thực sự sắp xếp để thiết lập đường dẫn thực thi của riêng bạn, ở cấp cao nhất của bạn xây dựng tập tin (hoặc
có lẽ bằng cách nhập một gói xây dựng thích hợp với lệnh Perl `use '). Các
các biến mặc định nhằm giúp bạn phát triển.

Nội suy xây dựng biến

Các biến môi trường xây dựng có thể được nội suy trong tên tệp nguồn và tệp đích
bằng cách thêm tiền tố tên biến xây dựng với `% '.

$ env = khuyết điểm mới (
DESTDIR => 'chương trình',
SRCDIR => 'src',
);
Chương trình $ env '% DESTDIR / hello', '% SRCDIR / hello.c';

Việc mở rộng các biến xây dựng là đệ quy - tức là tệp tên(các) sẽ được tái
mở rộng cho đến khi không thể thay thế được nữa. Nếu một biến xây dựng không
được xác định trong môi trường, sau đó chuỗi null sẽ được thay thế.

Mặc định xây dựng phương pháp


Danh sách các phương pháp xây dựng mặc định bao gồm:

Sản phẩm `mới ' constructor

Phương thức `` mới '' là một phương thức khởi tạo đối tượng Perl. Nghĩa là, nó không được gọi thông qua một tham chiếu
đến một môi trường xây dựng hiện có tài liệu tham khảo, nhưng, về mặt tĩnh, sử dụng tên
của Perl gói nơi mà hàm tạo được xác định. Phương thức được gọi như thế này:

$ env = khuyết điểm mới ( );

Môi trường bạn nhận lại được may mắn vào gói `` khuyết điểm '', có nghĩa là nó sẽ
đã liên kết với nó các phương thức mặc định được mô tả bên dưới. Xây dựng riêng lẻ
có thể ghi đè các biến bằng cách cung cấp các cặp tên / giá trị trong danh sách ghi đè. Lưu ý rằng
để ghi đè bất kỳ biến môi trường lệnh nào (tức là bất kỳ biến nào trong `` ENV ''), bạn sẽ phải
ghi đè tất cả chúng. Bạn có thể giải quyết khó khăn này bằng cách sử dụng phương pháp `` sao chép '' trên một
môi trường xây dựng hiện có.

Sản phẩm `` nhân bản '' phương pháp

Phương pháp `` nhân bản '' tạo ra một bản sao của môi trường xây dựng hiện có và có thể
được gọi như trong ví dụ sau:

$ env2 = $ env1-> bản sao ( );

Bạn có thể cung cấp ghi đè theo cách thông thường để tạo môi trường khác với
nguyên bản. Nếu bạn chỉ muốn một tên mới cho cùng một môi trường (có thể hữu ích khi
xuất môi trường sang các thành phần hiện có), bạn chỉ có thể sử dụng phép gán đơn giản.

Sản phẩm `` sao chép '' phương pháp

Phương thức `` sao chép '' trích xuất các biến xây dựng được xác định bên ngoài từ một
môi trường và trả về chúng dưới dạng danh sách các cặp tên / giá trị. Ghi đè cũng có thể được
được cung cấp, trong trường hợp đó, các giá trị ghi đè sẽ được trả về, nếu thích hợp. Các
danh sách trả về có thể được gán cho một hàm băm, như được hiển thị trong nguyên mẫu bên dưới, nhưng nó cũng có thể
được thao túng theo những cách khác:

% env = $ env1-> copy ( );

Giá trị của `ENV ', bản thân nó là một hàm băm, cũng được sao chép sang một hàm băm mới, vì vậy đây có thể là
đã thay đổi mà không sợ ảnh hưởng đến môi trường ban đầu. Vì vậy, chẳng hạn, nếu bạn thực sự
chỉ muốn ghi đè biến `` PATH '' trong môi trường mặc định, bạn có thể thực hiện
Sau đây:

% cons = new khuyết điểm () -> copy ();
$ khuyết điểm {ENV} {PATH} = " ";
$ cons = khuyết điểm mới (% khuyết điểm);

Điều này sẽ để lại bất kỳ thứ gì khác có thể nằm trong môi trường thực thi mặc định
không bị xáo trộn.

Sản phẩm `Cài đặt ' phương pháp

Phương thức `` Cài đặt '' sắp xếp các tệp được chỉ định sẽ được cài đặt trong
danh mục. Cài đặt được tối ưu hóa: tệp không được sao chép nếu nó có thể được liên kết. Nếu như
đây không phải là hành vi mong muốn, bạn sẽ cần sử dụng một phương pháp khác để cài đặt
tập tin. Nó được gọi như sau:

Cài đặt $ env , ;

Lưu ý rằng, trong khi các tệp được cài đặt có thể được đặt tên tùy ý, chỉ tệp cuối cùng
thành phần của mỗi tên được sử dụng cho tên đích đã cài đặt. Vì vậy, ví dụ, nếu bạn
sắp xếp để cài đặt foo / bar in căn cứ, điều này sẽ tạo ra một thanh tập tin trong căn cứ thư mục (không phải
foo / bar).

Sản phẩm `InstallAs ' phương pháp

Phương thức `InstallAs 'sắp xếp cho nguồn được chỉ định hồ sơ(các) sẽ được cài đặt làm
mục tiêu cụ thể hồ sơ(S). Nhiều tệp phải được chỉ định dưới dạng danh sách tệp. Các
cài đặt được tối ưu hóa: tệp không được sao chép nếu nó có thể được liên kết. Nếu đây không phải là
hành vi mong muốn, bạn sẽ cần sử dụng một phương pháp khác để cài đặt tệp. Nó là
được gọi như sau:

`` InstallAs '' hoạt động theo hai cách:

Cài đặt một tệp:

InstallAs $ env TgtFile, SrcFile;

Cài đặt nhiều tệp:

InstallAs $ env ['tgt1', 'tgt2'], ['src1', 'src2'];

Hoặc, thậm chí như:

@srcs = qw (src1 src2 src3);
@tgts = qw (tgt1 tgt2 tgt3);
InstallAs $ env [@tgts], [@srcs];

Cả danh sách mục tiêu và danh sách nguồn phải có cùng độ dài.

Sản phẩm Quý giá phương pháp

Phương thức `` Precious '' yêu cầu khuyết điểm là không xóa tệp hoặc danh sách tệp đã chỉ định trước đó
xây dựng lại chúng. Nó được gọi là:

Quí ;

Điều này đặc biệt hữu ích để cho phép cập nhật gia tăng cho thư viện hoặc gỡ lỗi
các tệp thông tin được cập nhật thay vì được xây dựng lại mỗi lần. Nhược điểm vẫn sẽ
xóa các tệp khi cờ `-r 'được chỉ định.

Sản phẩm `` Lệnh '' phương pháp

Phương thức `` Command '' là một phương thức catchall có thể được sử dụng để sắp xếp cho bất kỳ
lệnh được gọi để cập nhật mục tiêu. Đối với lệnh này, một tệp đích và danh sách
đầu vào được cung cấp. Ngoài ra, một dòng lệnh xây dựng hoặc các dòng, được cung cấp dưới dạng
chuỗi (chuỗi này có thể có nhiều lệnh được nhúng bên trong nó, được phân tách bằng lệnh mới
dòng). `Lệnh 'được gọi như sau:

Lệnh $ env , , ;

Mục tiêu được thực hiện phụ thuộc vào danh sách các tệp đầu vào được chỉ định và các đầu vào phải
được xây dựng thành công hoặc Nhược điểm sẽ không cố gắng xây dựng mục tiêu.

Trong lệnh xây dựng, bất kỳ biến nào từ môi trường xây dựng có thể
được giới thiệu bằng cách thêm tiền tố vào tên của biến cấu trúc với `% '. Đây là đệ quy:
lệnh được mở rộng cho đến khi không thể thực hiện thay thế nữa. Nếu một công trình xây dựng
biến không được xác định trong môi trường, thì chuỗi null sẽ được thay thế. MỘT
nhân đôi `%% 'sẽ được thay thế bằng một`%' duy nhất trong lệnh xây dựng.

Có một số biến giả cũng sẽ được mở rộng:

%> Tên tệp đích (trong lệnh nhiều mục tiêu, đây luôn là mục tiêu đầu tiên
đề cập).

% 0 Tương tự như `%> '.

% 1,% 2, ...,% 9
Chúng đề cập đến tệp đầu vào đầu tiên đến thứ chín, tương ứng.

% <Tập hợp đầy đủ các đầu vào. Nếu bất kỳ cái nào trong số này đã được sử dụng ở bất kỳ nơi nào khác trong
dòng lệnh hiện tại (qua `% 1 ',`% 2', v.v.), sau đó những dòng lệnh đó sẽ bị xóa khỏi
danh sách được cung cấp bởi `% <'. Hãy xem xét lệnh sau được tìm thấy trong một Lãnh sự hồ sơ
trong thử nghiệm danh mục:

Lệnh $ env 'tgt', qw (foo bar baz), qq (
echo% <-i% 1>%>
echo% <-i% 2 >>%>
echo% <-i% 3 >>%>
);

If tgt cần được cập nhật, thì điều này sẽ dẫn đến việc thực thi
các lệnh sau, giả sử rằng không có ánh xạ lại nào được thiết lập cho thử nghiệm
danh mục:

kiểm tra tiếng vang / kiểm tra thanh / kiểm tra baz -i / foo> kiểm tra / tgt
echo test / foo test / baz -i test / bar >> test / tgt
kiểm tra tiếng vang / kiểm tra foo / kiểm tra thanh -i / baz >> kiểm tra / tgt

Bất kỳ biến giả nào ở trên có thể được theo sau ngay bởi một trong các biến sau
các hậu tố để chọn một phần của tên đường dẫn mở rộng:

: một đường dẫn tuyệt đối đến tên tệp
: b thư mục cộng với tên tệp bị loại bỏ bất kỳ hậu tố nào
: d thư mục
: f tên tệp
: s hậu tố tên tệp
: F tên tệp bị loại bỏ bất kỳ hậu tố nào

Tiếp tục với ví dụ trên, `% <: f 'sẽ mở rộng thành` foo bar baz' và `% ': d> sẽ
mở rộng để kiểm tra.

Có thể lập trình viết lại một phần của lệnh bằng cách bao quanh một phần của nó
giữa `% ['và`%]'. Điều này sẽ gọi biến xây dựng được đặt tên là từ đầu tiên
được đặt trong dấu ngoặc như một tham chiếu mã Perl; kết quả của cuộc gọi này sẽ được sử dụng
để thay thế nội dung của dấu ngoặc trong dòng lệnh. Ví dụ, cho một
tệp đầu vào hiện có có tên tgt.in:

@keywords = qw (foo bar baz);
$ env = new khuyết điểm (X_COMMA => sub {join (",", @_)});
Lệnh $ env 'tgt', 'tgt.in', qq (
echo '# Từ khóa:% [X_COMMA @keywords%]'>%>
con mèo% <>>%>
);

Điều này sẽ thực hiện:

echo '# Từ khóa: foo, bar, baz'> tgt
mèo tgt.in >> tgt

Sau khi thay thế xảy ra, các chuỗi khoảng trắng được chuyển đổi thành các ô trống duy nhất, và
khoảng trắng đầu và cuối bị loại bỏ. Do đó không thể giới thiệu
khoảng trắng có độ dài thay đổi trong các chuỗi được truyền vào một lệnh mà không cần dùng đến một số
loại trích dẫn vỏ.

Nếu một chuỗi lệnh nhiều dòng được cung cấp, các lệnh sẽ được thực hiện tuần tự. Nếu có
trong số các lệnh không thành công, sau đó không có lệnh nào trong số các lệnh còn lại được thực thi và mục tiêu không được đánh dấu là
cập nhật, tức là một chữ ký mới không được lưu trữ cho đích.

Thông thường, nếu tất cả các lệnh thành công và trả về trạng thái XNUMX (hoặc bất kỳ nền tảng nào-
dấu hiệu thành công cụ thể là bắt buộc), sau đó một chữ ký mới được lưu trữ cho
Mục tiêu. Nếu một lệnh báo cáo sai thành công ngay cả sau khi thất bại, thì Khuyết điểm sẽ
giả sử rằng tệp đích được tạo bởi lệnh đó là chính xác và cập nhật.

Từ đầu tiên của mỗi chuỗi lệnh, sau khi mở rộng, được giả định là một tệp thực thi
lệnh được tra cứu trên biến môi trường `PATH '(đến lượt nó, được chỉ định bởi
Biến xây dựng `ENV '). Nếu lệnh này được tìm thấy trên đường dẫn, thì mục tiêu sẽ
phụ thuộc vào nó: lệnh do đó sẽ được tự động tạo, nếu cần. Của nó
có thể viết các lệnh nhiều phần cho một số trình bao, được phân tách bằng dấu chấm phẩy. Chỉ
Tuy nhiên, từ lệnh đầu tiên sẽ phụ thuộc vào, vì vậy nếu bạn viết các chuỗi lệnh của mình
theo cách này, bạn phải thiết lập rõ ràng một phụ thuộc (với phương thức `` Phụ thuộc ') hoặc
đảm bảo rằng lệnh bạn đang sử dụng là lệnh hệ thống được mong đợi là
có sẵn. Nếu nó không có sẵn, tất nhiên bạn sẽ gặp lỗi.

Nếu bất kỳ lệnh nào (ngay cả một lệnh trong lệnh nhiều dòng) bắt đầu bằng `[perl] ', phần còn lại
của dòng lệnh đó sẽ được đánh giá bởi Perl đang chạy thay vì được phân nhánh bởi
vỏ bọc. Nếu lỗi xảy ra khi phân tích cú pháp Perl hoặc nếu biểu thức Perl trả về 0 hoặc
undef, lệnh sẽ được coi là không thành công. Ví dụ, đây là một đơn giản
lệnh tạo tệp `foo 'trực tiếp từ Perl:

$ env = khuyết điểm mới ();
Lệnh $ env 'foo',
qq ([perl] open (FOO, '> foo'); print FOO "hi \\ n"; close (FOO); 1);

Lưu ý rằng khi lệnh được thực thi, bạn đang ở trong cùng một gói như khi xây dựng
or Lãnh sự tệp đã được đọc, vì vậy bạn có thể gọi các hàm Perl mà bạn đã xác định trong cùng một
xây dựng or Lãnh sự tệp có `` Lệnh '' xuất hiện:

$ env = khuyết điểm mới ();
phụ tạo_file {
$ file = shift của tôi;
open (FILE, "> $ file");
in FILE "hi \ n";
Đóng tập tin);
1 trở về;
}
Lệnh $ env 'foo', "[perl] & create_file ('%>')";

Chuỗi Perl sẽ được sử dụng để tạo chữ ký cho tệp dẫn xuất, vì vậy nếu bạn
thay đổi chuỗi, tệp sẽ được xây dựng lại. Nội dung của bất kỳ chương trình con nào bạn gọi,
tuy nhiên, không phải là một phần của chữ ký, vì vậy nếu bạn sửa đổi một chương trình con được gọi là
`create_file 'ở trên, mục tiêu sẽ không được xây dựng lại. Người dùng báo trước.

Nhược điểm thường in một lệnh trước khi thực thi nó. Hành vi này bị chặn nếu
ký tự đầu tiên của lệnh là `@ '. Lưu ý rằng bạn có thể cần phải tách `` @ '' khỏi
tên lệnh hoặc thoát khỏi nó để ngăn `` @cmd 'trông giống như một mảng để trích dẫn Perl
toán tử thực hiện nội suy:

# Dòng lệnh đầu tiên không chính xác,
# vì "@cp" trông giống như một mảng
# vào hàm Perl qq //.
# Sử dụng biểu mẫu thứ hai để thay thế.
Lệnh $ env 'foo', 'foo.in', qq (
@cp% <tempfile
@ cp tempfile%>
);

Nếu có các ký tự meta shell ở bất kỳ đâu trong dòng lệnh được mở rộng, chẳng hạn như `<',
`> ', dấu ngoặc kép hoặc dấu chấm phẩy, thì lệnh sẽ thực sự được thực thi bằng cách gọi một
vỏ bọc. Điều này có nghĩa là một lệnh như:

ổ đĩa cd

một mình thường sẽ không thành công, vì không có lệnh `cd 'trên đường dẫn. Nhưng lệnh
chuỗi:

cd $ <: d; tar cf $>: f $ <: f

khi được mở rộng sẽ vẫn chứa dấu chấm phẩy của ký tự meta shell và một shell sẽ là
được gọi để diễn giải lệnh. Vì `cd 'được thông dịch bởi trình bao con này, lệnh
sẽ thực hiện như mong đợi.

Để chỉ định một lệnh có nhiều mục tiêu, bạn có thể chỉ định một tham chiếu đến danh sách
các mục tiêu. Trong Perl, một tham chiếu danh sách có thể được tạo bằng cách đặt một danh sách trong dấu ngoặc vuông.
Do đó lệnh sau:

Lệnh $ env ['foo.h', 'foo.c'], 'foo.template', q (
gen% 1
);

có thể được sử dụng trong trường hợp lệnh `gen 'tạo ra hai tệp, cả hai foo.hfoo.c.

Sản phẩm `` Đối tượng '' phương pháp

Phương thức `` Đối tượng '' sắp xếp để tạo các tệp đối tượng tương ứng với
các tập tin nguồn. Nó được gọi như hình dưới đây:

@files = Đối tượng $ env ;

Trong Unix, các tệp nguồn kết thúc bằng .s.c hiện đang được hỗ trợ và sẽ được biên dịch
thành tên của cùng một tệp kết thúc bằng .o. Theo mặc định, tất cả các tệp được tạo bằng cách gọi
lệnh bên ngoài là kết quả của việc mở rộng biến xây dựng `CCCOM ', với
`% <'và`%>' lần lượt được đặt thành tệp nguồn và tệp đối tượng (xem phương thức `` Lệnh ''
để biết chi tiết mở rộng). Biến CPPPATH cũng được sử dụng khi quét các tệp nguồn
cho các phụ thuộc. Đây là danh sách tên đường dẫn được phân tách bằng dấu hai chấm và cũng được sử dụng để tạo
biến xây dựng `_IFLAGS ', sẽ chứa danh sách -`I' thích hợp
các tùy chọn cho việc biên dịch. Bất kỳ tên đường dẫn tương đối nào trong `` CPPPATH '' đều được hiểu là tương đối
đến thư mục mà trong đó môi trường xây dựng được liên kết đã được tạo (tuyệt đối
và tên họ hàng trên cũng có thể được sử dụng). Biến này được sử dụng bởi `CCCOM '. Hành vi
của lệnh này có thể được sửa đổi bằng cách thay đổi bất kỳ biến nào được nội suy
thành `CCCOM ', chẳng hạn như` CC', `CFLAGS 'và, gián tiếp,` `CPPPATH' '. Nó cũng có thể
thay thế giá trị của `CCCOM ', chính nó. Để thuận tiện, tệp này trả về danh sách
tên tệp đối tượng.

Sản phẩm `` Chương trình '' phương pháp

Phương thức `` Chương trình '' sắp xếp để liên kết chương trình được chỉ định với đối tượng được chỉ định
các tập tin. Nó được gọi theo cách sau:

Chương trình $ env , ;

Tên chương trình sẽ có giá trị của biến xây dựng `SUFEXE 'được thêm vào (bởi
default, `.exe 'trên hệ thống Win32, không có gì trên hệ thống Unix) nếu hậu tố chưa có
hiện tại.

Tệp nguồn có thể được chỉ định thay cho tệp đối tượng - phương thức `` Đối tượng 'sẽ là
được gọi để sắp xếp việc chuyển đổi tất cả các tệp thành tệp đối tượng, và do đó tất cả
các quan sát về phương pháp `` Đối tượng '' ở trên cũng áp dụng cho phương pháp này.

Liên kết thực tế của chương trình sẽ được xử lý bởi một lệnh bên ngoài, kết quả là
từ việc mở rộng biến xây dựng `LINKCOM ', với`% <' được đặt thành các tệp đối tượng thành
được liên kết (theo thứ tự được trình bày) và đặt `%> 'thành mục tiêu (xem phương thức` `Lệnh' '
để biết chi tiết mở rộng). Người dùng có thể đặt các biến bổ sung trong cấu trúc
môi trường, bao gồm cả `LINK ', để xác định chương trình nào sẽ sử dụng để liên kết,` LIBPATH', một
danh sách các đường dẫn tìm kiếm thư viện được phân tách bằng dấu hai chấm, để sử dụng với các đặc tả thư viện của
hình thức -llibvà `` LIBS '', chỉ định danh sách các thư viện để liên kết với (trong một trong hai -llib
biểu mẫu hoặc chỉ dưới dạng tên đường dẫn. Tên đường dẫn tương đối trong cả `` LIBPATH '' và `` LIBS '' đều được diễn giải
liên quan đến thư mục trong đó môi trường xây dựng liên quan được tạo
(tên tuyệt đối và tên tương đối cao nhất cũng có thể được sử dụng). Nhược điểm tự động thiết lập
phụ thuộc vào bất kỳ thư viện nào được đề cập trong `` LIBS '': những thư viện đó sẽ được xây dựng trước
lệnh được liên kết.

Sản phẩm `Thư viện ' phương pháp

Phương thức `` Library '' sắp xếp để tạo thư viện được chỉ định từ đối tượng được chỉ định
các tập tin. Nó được gọi như sau:

Thư viện $ env , ;

Tên thư viện sẽ có giá trị của biến xây dựng `SUFLIB 'được thêm vào (bởi
default, `.lib 'trên hệ thống Win32,` .a' trên hệ thống Unix) nếu hậu tố chưa có
hiện tại.

Tệp nguồn có thể được chỉ định thay cho tệp đối tượng - phương thức `` Đối tượng 'sẽ là
được gọi để sắp xếp việc chuyển đổi tất cả các tệp thành tệp đối tượng, và do đó tất cả
các quan sát về phương pháp `` Đối tượng '' ở trên cũng áp dụng cho phương pháp này.

Việc tạo thư viện thực sự sẽ được xử lý bởi một lệnh bên ngoài, kết quả là
từ việc mở rộng biến xây dựng `ARCOM ', với`% <' được đặt thành các thành viên thư viện (trong
thứ tự được trình bày), và `%> 'vào thư viện sẽ được tạo (xem phương thức` `Lệnh' 'cho
chi tiết mở rộng). Người dùng có thể đặt các biến trong môi trường xây dựng sẽ
ảnh hưởng đến hoạt động của lệnh. Chúng bao gồm `` AR '', chương trình lưu trữ để sử dụng,
`ARFLAGS ', có thể được sử dụng để sửa đổi các cờ được cung cấp cho chương trình được chỉ định bởi` AR',
và `RANLIB ', tên của chương trình tạo chỉ mục lưu trữ, nếu cần (nếu
nhu cầu không yêu cầu chức năng thứ hai, sau đó `` ARCOM '' phải được định nghĩa lại để không
tham chiếu `RANLIB ').

Phương thức `` Thư viện '' cho phép chỉ định cùng một thư viện trong nhiều phương thức
lời kêu gọi. Tất cả các đối tượng đóng góp từ tất cả các lệnh gọi (có thể từ
các thư mục khác nhau) được kết hợp và tạo ra bởi một lệnh lưu trữ duy nhất. Ghi chú,
tuy nhiên, nếu bạn lược bỏ một bản dựng để chỉ một phần của thư viện được chỉ định, thì chỉ
phần đó của thư viện sẽ được tạo (phần còn lại sẽ biến mất!).

Sản phẩm 'Mô-đun' phương pháp

Phương thức `` Mô-đun '' là sự kết hợp của các phương thức `` Chương trình '' và `` Lệnh ''. Còn hơn là
tạo một chương trình thực thi trực tiếp, lệnh này cho phép bạn chỉ định
lệnh để thực sự tạo một mô-đun. Phương thức được gọi như sau:

Mô-đun $ env , , ;

Lệnh này hữu ích trong các trường hợp bạn muốn tạo động, chẳng hạn như
các mô-đun đã tải hoặc các thư viện mã được liên kết tĩnh.

Sản phẩm 'Phụ thuộc' phương pháp

Phương thức `` Phụ thuộc '' cho phép bạn chỉ định các phụ thuộc bổ sung cho một mục tiêu. Nó là
được gọi như sau:

Phụ thuộc $ env , ;

Điều này đôi khi có thể hữu ích, đặc biệt là trong trường hợp không có máy quét nào tồn tại (hoặc
có thể ghi) cho các loại tệp cụ thể. Thông thường, các phụ thuộc được tính toán
tự động từ sự kết hợp của các phụ thuộc rõ ràng được thiết lập bởi phương thức
gọi hoặc bằng cách quét các tệp nguồn.

Một tập hợp các phụ thuộc giống hệt nhau cho nhiều mục tiêu có thể được chỉ định bằng cách sử dụng tham chiếu tới
một danh sách các mục tiêu. Trong Perl, một tham chiếu danh sách có thể được tạo bằng cách bao quanh một danh sách trong hình vuông
dấu ngoặc. Do đó lệnh sau:

Phụ thuộc $ env ['foo', 'bar'], 'input_file_1', 'input_file_2';

chỉ định rằng cả hai foothanh các tệp phụ thuộc vào các tệp đầu vào được liệt kê.

Sản phẩm `` Bỏ qua '' phương pháp

Phương thức `` Bỏ qua '' cho phép bạn bỏ qua các phụ thuộc rõ ràng mà nhược điểm của nó
sở hữu. Nó được gọi như sau:

Làm lơ ;

Điều này có thể được sử dụng để tránh biên dịch lại do những thay đổi trong tệp tiêu đề hệ thống hoặc
các tiện ích được biết là không ảnh hưởng đến các mục tiêu đã tạo.

Ví dụ: nếu một chương trình được xây dựng trong một thư mục gắn với NFS trên nhiều hệ thống
có các bản sao khác nhau của stdio.h, sự khác biệt sẽ ảnh hưởng đến chữ ký của tất cả
các mục tiêu bắt nguồn được tạo từ các tệp nguồn `#include '. Điều này sẽ gây ra tất cả
những mục tiêu sẽ được xây dựng lại khi thay đổi hệ thống. Nếu đây không phải là hành vi mong muốn,
thì dòng sau sẽ xóa các phụ thuộc vào stdio.h tập tin:

Bỏ qua '^ / usr / include / stdio \ .h $';

Lưu ý rằng các đối số của phương thức `` Bỏ qua '' là các biểu thức chính quy, rất đặc biệt
các ký tự phải được thoát ra và bạn có thể muốn neo vào đầu hoặc cuối của
biểu thức với các ký tự `^ 'hoặc` $'.

Sản phẩm Muối phương pháp

Phương thức `` Salt '' thêm một giá trị không đổi vào phép tính chữ ký cho mọi
tập tin. Nó được gọi như sau:

Chuỗi $ muối;

Thay đổi giá trị Salt sẽ buộc phải xây dựng lại hoàn toàn mọi tệp dẫn xuất. Điều này có thể là
được sử dụng để buộc xây dựng lại trong một số trường hợp mong muốn nhất định. Ví dụ,

Muối `uname -s`;

Sẽ buộc xây dựng lại hoàn toàn mọi tệp dẫn xuất bất cứ khi nào hệ điều hành bật
mà bản dựng được thực hiện (như được báo cáo bởi `uname -s ') thay đổi.

Sản phẩm `UseCache ' phương pháp

Phương pháp `` UseCache '' hướng dẫn Nhược điểm duy trì bộ nhớ cache của các tệp dẫn xuất, được chia sẻ
giữa các cây xây dựng riêng biệt của cùng một dự án.

UseCache ("cache / ") ⎪⎪ warning (" không tìm thấy thư mục cache ");

Sản phẩm `SourcePath ' phương pháp

Mathod `` SourcePath '' trả về tên đường dẫn nguồn thực của tệp, như được đối lập với
tên đường dẫn trong thư mục xây dựng. Nó được gọi như sau:

$ path = SourcePath ;

Sản phẩm `ConsPath ' phương pháp

Phương thức `ConsPath 'trả về true nếu đường dẫn được cung cấp là một tệp có thể dẫn xuất và trả về
undef (false) ngược lại. Nó được gọi như sau:

$ result = ConsPath ;

Sản phẩm `` SplitPath '' phương pháp

Phương thức `` SplitPath '' tìm kiếm nhiều tên đường dẫn trong một chuỗi được phân tách theo mặc định
dấu phân cách đường dẫn cho hệ điều hành (':' trên hệ thống UNIX, ';' trên Windows NT) và
trả về các tên đủ điều kiện. Nó được gọi như sau:

@paths = SplitPath ;

Phương thức `` SplitPath '' sẽ chuyển đổi các tên có tiền tố '#' thành bản dựng cấp cao nhất thích hợp
tên (không có '#') và sẽ chuyển đổi tên tương đối thành tên cấp cao nhất.

Sản phẩm `` DirPath '' phương pháp

Phương thức `DirPath 'trả về đường dẫn xây dựng tên(các) thư mục hoặc danh sách các thư mục.
Nó được gọi như sau:

$ cwd = DirPath ;

Cách sử dụng phổ biến nhất cho phương thức `` DirPath '' là:

$ cwd = DirPath '.';

để tìm nạp đường dẫn đến thư mục hiện tại của một công ty con Lãnh sự tập tin.

Sản phẩm `` FilePath '' phương pháp

Phương thức `` FilePath '' trả về đường dẫn xây dựng tên(các) tệp hoặc danh sách các tệp. Nó là
được gọi như sau:

$ file = FilePath ;

Sản phẩm `` Trợ giúp ' phương pháp

Phương thức `` Trợ giúp '' chỉ định văn bản trợ giúp sẽ được hiển thị khi người dùng gọi ra `` khuyết điểm
-h '. Điều này có thể được sử dụng để cung cấp tài liệu về các mục tiêu, giá trị cụ thể, xây dựng
tùy chọn, v.v. cho cây xây dựng. Nó được gọi như sau:

Cứu giúp ;

Phương thức `` Trợ giúp '' chỉ có thể được gọi một lần và thường phải được chỉ định trong phần đầu-
cấp xây dựng tập tin.

Mở rộng Nhược điểm


Ghi đè xây dựng biến

Có một số cách để mở rộng Nhược điểm, có mức độ khó khác nhau. Điều đơn giản nhất
phương pháp là xác định môi trường xây dựng của riêng bạn, dựa trên môi trường mặc định,
nhưng được sửa đổi để phản ánh nhu cầu cụ thể của bạn. Điều này thường đủ cho dựa trên C
các ứng dụng. Bạn có thể sử dụng phương thức khởi tạo `` mới '' và các phương thức `` nhân bản '' và `` sao chép '' để
tạo môi trường lai. Những thay đổi này có thể hoàn toàn minh bạch đối với cơ bản
Lãnh sự các tập tin.

Thêm mới phương pháp

Đối với những thay đổi đòi hỏi nhiều hơn một chút, bạn có thể muốn thêm các phương pháp mới vào `` khuyết điểm ''
Bưu kiện. Đây là một ví dụ về một tiện ích mở rộng rất đơn giản, `` InstallScript ', cài đặt một
tập lệnh tcl ở vị trí được yêu cầu, nhưng chỉnh sửa tập lệnh trước để phản ánh một nền tảng-
đường dẫn phụ thuộc cần được cài đặt trong tập lệnh:

# cons :: InstallScript - Tạo phiên bản shell phụ thuộc vào nền tảng
# script bằng cách thay thế chuỗi `` #! your-path-here '' bằng một nền tảng cụ thể
# đường dẫn $ BIN_DIR.

khuyết điểm phụ :: InstallScript {
của tôi ($ env, $ dst, $ src) = @_;
Lệnh $ env $ dst, $ src, qq (
sed s + your-path-here + $ BIN_DIR +% <>%>
chmod oug + x%>
);
}

Lưu ý rằng phương thức này được xác định trực tiếp trong gói `` khuyết điểm '' (bằng cách thêm tiền tố vào tên
với `khuyết điểm :: '). Một thay đổi được thực hiện theo cách này sẽ hiển thị trên toàn cầu đối với tất cả các môi trường,
và có thể được gọi như trong ví dụ sau:

InstallScript $ env "$ BIN / foo", "foo.tcl";

Để có một cải tiến nhỏ về tính tổng quát, biến `` BINDIR '' có thể được chuyển vào dưới dạng
đối số hoặc được lấy từ môi trường xây dựng - như là '% BINDIR'.

Ghi đè phương pháp

Thay vì thêm phương thức vào không gian tên `khuyết điểm ', bạn có thể xác định một gói mới
kế thừa các phương thức hiện có từ gói khuyết điểm và ghi đè hoặc thêm các phương thức khác. Điều này
có thể được thực hiện bằng cách sử dụng các cơ chế kế thừa của Perl.

Ví dụ sau định nghĩa một gói mới `cons :: switch 'ghi đè tiêu chuẩn
Phương pháp `thư viện '. Phương thức ghi đè xây dựng các mô-đun thư viện được liên kết, thay vì thư viện
kho lưu trữ. Một hàm tạo mới được cung cấp. Các môi trường được tạo bằng hàm tạo này sẽ
có phương pháp thư viện mới; những người khác sẽ không.

gói khuyết điểm :: chuyển đổi;
BẮT ĐẦU {@ISA = 'khuyết điểm'}

sub mới {
sự thay đổi;
chúc phúc cho khuyết điểm mới (@_);
}

thư viện phụ {
của tôi ($ env) = shift;
của tôi ($ lib) = shift;
my (@objs) = Đối tượng $ env @_;
Lệnh $ env $ lib, @objs, q (
% LD -r% LDFLAGS% <-o%>
);
}

Chức năng này có thể được gọi như trong ví dụ sau:

$ env = nhược điểm mới :: switch (@overrides);
hữu ích. Cảm ơn !
Thư viện $ env 'lib.o', 'foo.c', 'bar.c';

Kêu gọi Nhược điểm


Lệnh `khuyết điểm 'thường được gọi từ gốc của cây xây dựng. MỘT xây dựng hồ sơ
phải tồn tại trong thư mục đó. Nếu đối số `-f 'được sử dụng, thì một đối số thay thế xây dựng
tệp có thể được sử dụng (và, có thể, một gốc thay thế, vì `` khuyết điểm '' sẽ cd thành xây dựng
thư mục chứa tệp).

Nếu `` khuyết điểm '' được gọi từ một phần tử con của gốc của cây xây dựng với đối số `-t ', nó
sẽ đi lên hệ thống phân cấp thư mục để tìm kiếm xây dựng tập tin. (Tên thay thế có thể
vẫn được chỉ định bằng `-f '.) Các mục tiêu được cung cấp trên dòng lệnh sẽ được sửa đổi
tương đối với những gì được phát hiện xây dựng tập tin. Ví dụ: từ một thư mục chứa
một cấp cao nhất xây dựng tệp, lời gọi sau:

% cd libfoo / con
% khuyết điểm -t target

chính xác tương đương với:

% khuyết điểm libfoo / subir / target

Nếu có bất kỳ mục tiêu `` Mặc định '' nào được chỉ định trong phân cấp thư mục của xây dựng or
Lãnh sự các tệp, chỉ các mục tiêu mặc định tại hoặc bên dưới thư mục mà từ đó `` cons -t ''
đã được gọi sẽ được xây dựng.

Lệnh được gọi như sau:

khuyết điểm -

Ở đâu đối số có thể là bất kỳ điều nào sau đây, theo bất kỳ thứ tự nào:

mục tiêu Xây dựng mục tiêu xác định. Nếu như mục tiêu là một thư mục, sau đó xây dựng một cách đệ quy
mọi thứ trong thư mục đó.

+ mẫu Hạn chế Lãnh sự các tệp được coi là chỉ những tệp phù hợp Belt Hold, Đó là
một biểu thức chính quy Perl. Nhiều đối số `+ 'được chấp nhận.

tên=
bộ tên giá trị val trong băm `` ARG '' được chuyển đến cấp cao nhất xây dựng tập tin.

`-cc 'Hiển thị lệnh sẽ được thực thi khi truy xuất từ ​​bộ nhớ cache. Không
dấu hiệu rằng tệp đã được truy xuất được đưa ra; điều này hữu ích cho
tạo nhật ký xây dựng có thể được so sánh với nhật ký xây dựng thực.

`-cd 'Tắt tất cả bộ nhớ đệm. Không truy xuất từ ​​bộ nhớ cache cũng như không tải vào bộ nhớ cache.

`-cr 'Xây dựng các phụ thuộc theo thứ tự ngẫu nhiên. Điều này rất hữu ích khi xây dựng nhiều
cây tương tự có bật bộ nhớ đệm.

`-cs 'Đồng bộ hóa các mục tiêu xây dựng hiện có được phát hiện là cập nhật với bộ nhớ cache.
Điều này hữu ích nếu bộ nhớ đệm đã bị tắt với -cc hoặc mới được bật gần đây
với UseCache.

`-d 'Bật gỡ lỗi phụ thuộc.

`-f '
Sử dụng tệp được chỉ định thay vì xây dựng (nhưng trước tiên hãy thay đổi thành chứa
thư mục của hồ sơ).

`-h 'Hiển thị thông báo trợ giúp cục bộ cho bản dựng hiện tại nếu một bản dựng như vậy được xác định và thoát.

`-k 'Tiếp tục tiến xa nhất có thể sau khi có lỗi.

`-o '
Đọc ghi đè tệp hồ sơ.

`-p 'Hiển thị các sản phẩm xây dựng trong các cây được chỉ định. Không có bản dựng nào được cố gắng.

`-pa 'Hiển thị các sản phẩm xây dựng và các hành động liên quan. Không có bản dựng nào được cố gắng.

`-pw 'Hiển thị các sản phẩm và nơi chúng được xác định. Không có bản dựng nào được cố gắng.

`-q 'Đừng dài dòng về Cài đặt và Xóa mục tiêu.

`-r 'Loại bỏ các sản phẩm xây dựng được liên kết với . Không có bản dựng nào được cố gắng.

`-R '
Tìm kiếm các tệp trong còn lại. Nhiều -R còn lại thư mục được tìm kiếm trong
thứ tự được chỉ định.

`-t 'Tra cứu hệ thống phân cấp thư mục để tìm kiếm một xây dựng tệp, nếu không có
trong thư mục hiện tại. Các mục tiêu sẽ được sửa đổi để có liên quan đến
xây dựng tập tin.

`-v 'Hiển thị phiên bản` `khuyết điểm' 'và tiếp tục xử lý.

`-V 'Hiển thị phiên bản` `khuyết điểm' 'và thoát.

`-wf '
Viết tất cả các tên tệp được xem xét vào hồ sơ.

`-x 'Hiển thị thông báo trợ giúp tương tự như thông báo này và thoát.

xây dựng-args có thể là bất kỳ đối số nào mà bạn muốn xử lý trong xây dựng tập tin.
Lưu ý rằng cần có một -- tách các lập luận thành khuyết điểm và các lập luận mà bạn
muốn xử lý trong xây dựng tập tin.

Gia công xây dựng-args có thể được thực hiện bởi bất kỳ gói tiêu chuẩn nào như Nhận hay của nó
các biến thể hoặc bất kỳ gói nào do người dùng xác định. khuyết điểm sẽ vượt qua trong xây dựng-args as @ARGV
sẽ không cố gắng giải thích bất cứ điều gì sau --.

% cons -R / usr / local / repository -d os = solaris + driver - -c test -f DEBUG

sẽ chuyển những điều sau đây thành khuyết điểm

-R / usr / local / repository -d os = solaris + trình điều khiển

và phần sau, lên cấp cao nhất xây dựng nộp hồ sơ như @ARGV

-c kiểm tra -f GỢI Ý

Lưu ý rằng `cons -r. ' tương đương với một quy tắc đệ quy đầy đủ `` make clean '', nhưng không yêu cầu
hỗ trợ trong xây dựng tập tin hoặc bất kỳ Lãnh sự các tập tin. Điều này hữu ích nhất nếu bạn
biên dịch các tệp thành các thư mục nguồn (nếu bạn tách xây dựngxuất khẩu thư mục,
thì bạn chỉ có thể xóa các thư mục).

Các tùy chọn `-p ',` -pa' và `-pw 'cực kỳ hữu ích để sử dụng như một sự hỗ trợ trong việc đọc
tập lệnh hoặc gỡ lỗi chúng. Nếu bạn muốn biết những gì tập lệnh cài đặt export / include / foo.h,
ví dụ, chỉ cần nhập:

% cons -pw export / include / foo.h

Sử dụng viết phụ thuộc máy quét


QuickScan cho phép thiết lập các máy quét không phụ thuộc vào mục tiêu đơn giản cho các tệp nguồn. Chỉ có
một máy quét QuickScan có thể được liên kết với bất kỳ tệp nguồn và môi trường nhất định nào.

QuickScan được gọi như sau:

Quét nhanh CONSENV CODEREF, FILENAME [, PATH]

Chương trình con được CODEREF tham chiếu dự kiến ​​sẽ trả về một danh sách các tên tệp được bao gồm
trực tiếp bằng FILE. Các tên tệp này sẽ lần lượt được quét. Đối số PATH tùy chọn
cung cấp một đường dẫn tra cứu để tìm FILENAME và / hoặc các tệp được trả về bởi người dùng do người dùng cung cấp
chương trình con. PATH có thể là một tham chiếu đến một mảng tên thư mục tra cứu hoặc
chuỗi tên được phân tách bằng ký tự phân cách của hệ thống (':' trên hệ thống UNIX, ';' trên
WindowsNT).

Chương trình con được gọi một lần cho mỗi dòng trong tệp, với $ _ được đặt thành dòng hiện tại.
Nếu chương trình con cần xem xét các dòng bổ sung hoặc, đối với vấn đề đó, toàn bộ tệp,
sau đó nó có thể tự đọc chúng, từ SCAN xử lý tệp. Nó cũng có thể kết thúc vòng lặp, nếu
nó biết rằng không có thông tin bao gồm thêm nào khả dụng, bằng cách đóng tệp xử lý.

Cho dù có cung cấp đường dẫn tra cứu hay không, QuickScan trước tiên sẽ cố gắng tra cứu tệp
liên quan đến thư mục hiện tại (đối với tệp cấp cao nhất được cung cấp trực tiếp cho QuickScan),
hoặc từ thư mục chứa tệp đã tham chiếu đến tệp. Điều này không phải là rất
chung chung, nhưng có vẻ đủ tốt - đặc biệt nếu bạn có khả năng viết riêng
tiện ích và có thể kiểm soát việc sử dụng đường dẫn tìm kiếm một cách tiêu chuẩn. cuối cùng
đường dẫn tìm kiếm, hiện tại, được phân tách bằng dấu hai chấm. Điều này có thể không làm cho trại NT vui vẻ.

Đây là một ví dụ thực tế, được lấy từ một xây dựng nộp ở đây:

khuyết điểm phụ :: SMFgen {
của tôi ($ env, @tables) = @_;
foreach $ t (@tables) {
$ env-> QuickScan (sub {/\b\S*?\.smf\b/g}, "$ t.smf",
$ env -> {SMF_INCLUDE_PATH});
$ env-> Lệnh (
["$ t.smdb.cc", "$ t.smdb.h", "$ t.snmp.cc", "$ t.ami.cc", "$ t.http.cc"],
"$ t.smf",
q(
smfgen% (% SMF_INCLUDE_OPT%)%
)
);
}
}

[LƯU Ý rằng không nên có dạng `$ env-> QuickScan ... 'và` $ env-> Command ...'
cần thiết, nhưng, vì một số lý do, là bắt buộc đối với lời kêu gọi cụ thể này. Điều này xuất hiện
là một lỗi ở Perl hoặc một sự hiểu lầm từ phía tôi; kiểu gọi này không
luôn tỏ ra cần thiết.]

Điều này tìm thấy tất cả các tên của biểu mẫu .smf trong tệp. Nó sẽ trả về tên ngay cả khi
chúng được tìm thấy trong các bình luận, nhưng điều đó không sao (cơ chế tha thứ cho các tệp bổ sung;
họ chỉ bị bỏ qua với giả định rằng tệp bị thiếu sẽ được nhận thấy khi
chương trình, trong ví dụ này, smfgen, thực sự được gọi).

Một máy quét chỉ được gọi cho một tệp nguồn nhất định nếu nó là cần thiết bởi một số mục tiêu trong
cây. Nó chỉ được gọi một lần cho một tệp nguồn nhất định.

Đây là một cách khác để xây dựng cùng một máy quét. Cái này sử dụng một tham chiếu mã rõ ràng,
và cũng có thể (không liên tục, trong trường hợp này) đọc toàn bộ tệp:

quét phụ của tôi {
của tôi (@includes);
làm {
push (@includes, /\b\S*?\.smf\b/g);
} trong khi ;
@bao gồm
}

Lưu ý rằng thứ tự của vòng lặp được đảo ngược, với việc kiểm tra vòng lặp ở cuối. Đây là
bởi vì dòng đầu tiên đã được đọc cho bạn. Máy quét này có thể được gắn vào một nguồn
nộp bởi:

QuickScan $ env \ myscan, "$ _. Smf";

HỖ TRỢ BỀN VỮNG


Nhược điểm được duy trì bởi cộng đồng người dùng. Để đăng ký, hãy gửi thư đến khuyết điểm-thảo luận-
[email được bảo vệ] với cơ thể đăng ký.

Vui lòng báo cáo bất kỳ đề xuất nào thông qua [email được bảo vệ] danh sách gửi thư.

Sử dụng khuyết điểm trực tuyến bằng các dịch vụ onworks.net


Máy chủ & Máy trạm miễn phí

Tải xuống ứng dụng Windows & Linux

  • 1
    Turkdevops
    Turkdevops
    TurkDevOps a ? K kaynak yaz? L? M
    geli? tirici topluluklar? DevTurks-Team
    Taraf?ndan desteklenmektedir..
    Tính năng:https://github.com/turkdevopshttps://turkdevops.g...
    Tải xuống turkdevops
  • 2
    asamdf
    asamdf
    * asammdf * là trình phân tích cú pháp Python nhanh và
    biên tập viên cho ASAM (PGS cho
    Tiêu chuẩn hóa Tự động hóa và
    Hệ thống đo lường) MDF / MF4
    (Định dạng dữ liệu đo lường ...
    Tải xuống asamdf
  • 3
    LAME (Lame Aint một bộ mã hóa MP3)
    LAME (Lame Aint một bộ mã hóa MP3)
    LAME là một công cụ giáo dục được sử dụng
    để tìm hiểu về mã hóa MP3. Các
    Mục tiêu của dự án LAME là cải thiện
    âm thanh tâm lý, chất lượng và tốc độ
    của MP...
    Tải xuống LAME (Lame Aint a MP3 Encoder)
  • 4
    wxPython
    wxPython
    Một tập hợp các mô-đun mở rộng Python
    bọc các lớp GUI đa nền tảng từ
    wxWidgets.. Đối tượng: Nhà phát triển. Người dùng
    giao diện: X Window System (X11), Win32...
    Tải xuống wxPython
  • 5
    góifilemanager
    góifilemanager
    Đây là trình quản lý tệp gói Total War
    dự án, bắt đầu từ phiên bản 1.7. Một
    giới thiệu ngắn về Warscape
    mod: ...
    Tải xuống packfilemanager
  • 6
    IPerf2
    IPerf2
    Một công cụ lưu lượng mạng để đo lường
    Hiệu suất TCP và UDP với các chỉ số
    xung quanh cả thông lượng và độ trễ. Các
    các mục tiêu bao gồm duy trì một hoạt động
    cá tuyết iperf ...
    Tải xuống IPerf2
  • Khác »

Lệnh Linux

Ad