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

Ad


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

makepp_functions - Trực tuyến trên Đám mây

Chạy makepp_functions 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 mô phỏng trực tuyến MAC OS

Đây là lệnh makepp_functions 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 mô phỏng trực tuyến MAC OS

CHƯƠNG TRÌNH:

TÊN


makepp_functions - Các hàm trong makepp

MÔ TẢ


A: tên_tệp tuyệt đối,
Tên_tệp_của_nguyên_nhiệt_đối,
lối đi,
thêm tiền tố,
thêm hậu tố,
và, B: tên cơ sở, C: gọi, D: Là,
dir_noslash, E: lỗi, F: hồ sơ tập tin,
bộ lọc,
lọc ra,
bộ lọc_out_dirs,
tìm tập tin,
find_first_upwards,
tìm_chương trình,
dây tìm kiếm,
tìm_lên,
đầu tiên_có sẵn,
từ đầu tiên,
cho mỗi, I: nếu,
nếu đúng,
fer_linker,
inv_objects,
thông tin, J: tham gia, M: chế tạo,
trang điểm,
trang điểm,
bản đồ,
"mktemp", N: không phải, O: chỉ_được tạo,
only_nontarget,
only_phony_target,
chỉ_cũ,
chỉ_mục tiêu,
hoặc,
gốc, P: patsub,
perl,
rởm,
xây dựng trước,
in, R: đường dẫn thực,
tên_tệp_có_tương đối,
liên quan đên, S: vỏ,
sắp xếp,
Dải,
phụ,
hậu tố, T: tạm thời, W: cảnh báo,
ký tự đại diện,
từ,
danh sách các từ,
từ, X: xargs

Bất kỳ biểu thức nào có định dạng "$ (name)", trong đó "name" không phải là tên của một biến, hoặc
"$ (name arg1 arg2 arg3)" được hiểu là một lệnh gọi hàm. Tên có thể chứa các chữ cái,
dấu gạch dưới, hoặc dấu gạch nối; để tránh nhầm lẫn, bạn có thể sử dụng dấu gạch ngang hoặc dấu gạch dưới
thay thế cho nhau, vì dấu gạch ngang bên trong được chuyển đổi thành dấu gạch dưới. Đánh giá như vậy
một biểu thức chỉ đơn giản gọi một chương trình con Perl. Nếu "name" đứng trước "&" thì nó chạy
lệnh nội trang hoặc tập lệnh của tên đó trong quy trình makepp và trả về tiêu chuẩn
đầu ra. Điều này yêu cầu perl phải được xây dựng cho PerlIO. Nếu tên không đặt tên cho một chức năng
nó được chuyển đổi thành một lệnh gọi.

Đối với các biến, bạn có sự lựa chọn là "$ (name ...)" hoặc "$ {name ...}". Nếu bạn muốn
nhúng cùng một dấu ngoặc đơn thì nó phải được ghép nối, cái khác không quan trọng: "$ (name
... () {... "hoặc" $ {name ... {} (...} ". (Tuy nhiên, đối với bản đồ và perl, dấu ngoặc đóng đầu tiên kết thúc
biểu thức.) Nhân đôi cho phép các đối số kéo dài một vài dòng. Các dòng mới là
sau đó được coi là dấu cách, ngoại trừ có thể trong "xác định". Ngoài ra còn có cú pháp "$ [tên ...]"
hoặc $ [[name ...]], được đánh giá khi đọc makefile, trước khi tìm kiếm các quy tắc
và các cấu trúc khác.

Makepp có một số chức năng nội sẵn có thể hữu ích. Nó hỗ trợ gần như tất cả
Các chức năng văn bản của GNU make (xem tài liệu của GNU make để biết chi tiết) và một số
riêng. Bạn có thể định nghĩa các chương trình con Perl để làm bất cứ điều gì bạn thích. Xem câu lệnh "phụ"
và phần mở rộng makepp để biết thêm chi tiết.

có điều kiện Chức năng
condition1 [, condition2 [, condition3 ...]]
Hàm và cung cấp hoạt động AND "đoản mạch". Mỗi đối số là
mở rộng, theo thứ tự. Nếu một đối số mở rộng thành một chuỗi trống thì quá trình xử lý sẽ dừng lại và
kết quả của khai triển là một chuỗi rỗng. Nếu tất cả các đối số mở rộng thành không
chuỗi rỗng thì kết quả của sự mở rộng là sự mở rộng của đối số cuối cùng.

if dây, result-if-string-not-blank [, kết quả-nếu-chuỗi-trống]
nếu đúng dây, result-if-string-true [, kết quả nếu-chuỗi-sai]
Một thay thế cho các câu lệnh "ifeq", v.v.,. Nếu chuỗi không trống (tức là,
điều kiện là đúng), đối số thứ hai (mệnh đề "thì") được trả về (sau
khai triển biến); nếu chuỗi trống, đối số thứ ba (mệnh đề "else") là
trả lại.

Ví dụ,

CFLAGS: = $ (if $ (lọc gcc egcc, $ (CC)), -g -all, -g)

định nghĩa CFLAGS là "-g -Wall" nếu biến CC là "gcc" hoặc "egcc" và "-g"
nếu không thì. (Đây là những gì các quy tắc xây dựng mặc định làm.)

"iftrue" tương tự như "if", ngoại trừ chuỗi 0 được coi là trống.

or condition1 [, condition2 [, condition3 ...]]
Hàm hoặc cung cấp hoạt động HOẶC "đoản mạch". Mỗi đối số được mở rộng,
theo thứ tự. Nếu một đối số mở rộng thành một chuỗi không trống thì quá trình xử lý sẽ dừng lại và
kết quả của sự mở rộng là chuỗi đó. Nếu, sau khi tất cả các đối số được mở rộng, tất cả
chúng là false (rỗng), khi đó kết quả của khai triển là chuỗi rỗng.

Tập tin Tên tập tin Chức năng
tên_tệp_tuyệt_đối các tập tin
lối đi vắng các tập tin
Chuyển đổi tên tệp tương đối thành tuyệt đối mà không cần . or ... Ví dụ,
"$ (Absol_filename xyz.c)" có thể trả về "/usr/src/our_project/subdir/xyz.c".

Tên_tệp_của_nhiên_nhiên các tập tin
đường dẫn thực các tập tin
Giống như tên_tệp_tuyệt đối, nhưng đảm bảo rằng các liên kết tượng trưng được giải quyết.

tên cơ sở tên tập tin
Tên cơ sở là toàn bộ tên tệp (với thư mục), trừ đi phần văn bản sau và
kể cả thời kỳ cuối cùng. Ví dụ: "$ (basename myfile / version-1.0-module.c)" là
"myfile / version-1.0-module"

dir tên tập tin
Trích xuất phần thư mục của mỗi tệp trong danh sách tên tệp, bao gồm cả dấu
gạch chéo. Trả về "./" nếu không có thư mục nào trong tên tệp.

dir_noslash tên tập tin
Tương tự như "$ (dir)" ngoại trừ việc nó không trả về dấu gạch chéo.

hồ sơ mẫu, thay thế, từ
Thực hiện thay thế mẫu trên tên tệp. Điều này khác với patsubst ở chỗ
nó sẽ hoạt động chính xác khi các tên thay thế cho các thư mục được cung cấp (miễn là
chúng đứng trước dấu phần trăm). Ví dụ,

$ (filesubst ./src/%.c,% .o, $ (ký tự đại diện src / *. c))

sẽ hoạt động với filesubst nhưng không hoạt động với patsubst.

filter_out_dirs tên tập tin
Trả về tất cả các tên tệp không tham chiếu đến thư mục.

tìm tập tin tên tệp, con đường
Tìm tệp trong đường dẫn được chỉ định hoặc trong biến môi trường PATH nếu không có gì
được chỉ định. Điều này có thể hữu ích cho việc tìm kiếm các tệp nhị phân hoặc bao gồm các tệp. Ví dụ,

TCL_INCLUDE: = -I $ (dir_noslash $ (findfile tcl.h, \
/usr/local/stow/tcl-8.4.5-nothread/include \
/usr/include/tcl8.4 / usr / include / tcl \
/net/na1/tcl8.4a3/include /net/na1/tcl8.4a3/include))

Điều này định vị tệp tcl.h bằng cách tìm kiếm tất cả các thư mục trên. Tuyệt đối
đường dẫn đến tệp được trả về. Sau đó, "$ (dir_noslash)" trích xuất thư mục đó và nó
được đưa vào đường dẫn bao gồm.

chương trình tìm kiếm tên
Trả lại chương trình đầu tiên trong danh sách có thể được tìm thấy trong PATH. Cái này hữu ích
khi có nhiều chương trình tương đương có thể được sử dụng và bạn chỉ muốn
chọn một trong số chúng. Ví dụ: đây là định nghĩa mặc định của một số
các biến mà makepp cung cấp nếu bạn không đặt một biến trong makefile của mình:

CC = $ (find_program gcc egcc pgcc c89 cc) # và hơn thế nữa, tùy thuộc vào máy
F77 = $ (find_program f77 g77 fort77)
CXX = $ (chương trình tìm kiếm g ++ c ++ pg ++ cxx CC aCC)

Nếu không tìm thấy chương trình nào, "$ (find_program)" trả về chuỗi không tìm thấy và
ghi nhật ký những gì không được tìm thấy. Điều này thường không dẫn đến một makefile chức năng, nhưng nó
sẽ có xu hướng tạo ra các thông báo lỗi tốt hơn. Ví dụ, nếu bạn làm điều gì đó như
điều này:

% .o:% .c
$ (CC) $ (đầu vào) -o $ (đầu ra)

và makepp không thể tìm thấy trình biên dịch C trong danh sách trên, nó sẽ thay thế trình biên dịch không tìm thấy.
Nếu không, trình bao sẽ cố gắng thực thi tệp nguồn và kết quả là lỗi
tin nhắn có thể thực sự kỳ lạ.

find_upwards tên tập tin
Tìm kiếm tệp có tên đã cho trong thư mục., .., ../ ..../../ .., Vv,
cho đến khi tìm thấy tệp hoặc đến được thư mục gốc hoặc thư mục được định vị
trên một hệ thống tệp khác. (Yêu cầu cuối cùng này là để ngăn chặn các vấn đề với
tự động hoặc hệ thống tệp mạng bị treo.) Nếu bạn có RootMakeppfile, đó cũng là
một rào cản ngăn cản việc tìm kiếm cao hơn.

Ví dụ: nếu bạn có một dự án với nhiều cấp độ thư mục con, bạn có thể
bao gồm phân đoạn chung này trong tất cả các tệp makefiles (ví dụ: bằng cách sử dụng "bao gồm"
tuyên bố):

TOP_LEVEL_INCLUDE_DIR: = $ (bao gồm find_upwards)
# Tìm kiếm thư mục chứa
# bao gồm thư mục con.

% .o:% .c
$ (CC) $ (CFLAGS) -I $ (TOP_LEVEL_INCLUDE_DIR) -c $ (đầu vào) -o $ (đầu ra)

Một vấn đề khác mà "find_upwards" có thể giúp giải quyết là định vị thư mục cấp cao nhất
của một công trình. Thường thì sẽ hữu ích khi xác định một biến như thế này:

HÀNG ĐẦU: = ../../ ..

nếu bạn có một số thông tin quan trọng chỉ nằm trong thư mục cấp cao nhất. Nhưng
điều này khó duy trì vì số lượng ".." khác nhau ở các cấp độ khác nhau
của cây thư mục. Thay vào đó, bạn có thể sử dụng "find_upwards" để định vị tệp
được biết là chỉ hiện diện trong thư mục cấp cao nhất. Ví dụ, giả sử rằng
tệp "LICENSE" chỉ nằm trong thư mục cấp cao nhất. Sau đó, bạn có thể làm điều này:

TOP: = $ (dir_noslash $ (find_upwards LICENSE))

"$ (find_upwards LICENSE)" trả về đường dẫn đầy đủ của tệp giấy phép;
"$ (dir_noslash ...)" loại bỏ tên tệp, chỉ trả lại thư mục.

(Lưu ý rằng câu lệnh "include" tự động tìm kiếm các tệp trở lên, vì vậy ở đó
không cần thiết phải làm điều gì đó như thế này:

bao gồm $ (find_upwards top_level_rules.mk)

Thay vào đó, bạn chỉ có thể làm

bao gồm top_level_rules.mk

và nó sẽ hoạt động tốt.)

Nếu không tìm thấy tệp, "find_upwards" sẽ hủy quá trình xây dựng với một thông báo lỗi.

Nếu bạn chỉ định nhiều tệp, find_upwards sẽ tìm kiếm tệp đầu tiên, sau đó
cái thứ hai, v.v. Nói cách khác,

$ (find_upwards file1 file2)

tương đương với

$ (find_upwards file1) $ (find_upwards file2)

Nếu bạn muốn tìm kiếm bất kỳ tệp nào trong số các tệp, hãy sử dụng "find_first_upwards" để thay thế.

find_first_upwards tệp1 tệp2 hữu ích. Cảm ơn !
Hàm này hoạt động giống như "find_upwards" ngoại trừ việc nó trả về tệp đầu tiên của bất kỳ
các tệp trong danh sách mà nó tìm thấy. Cụ thể, nó kiểm tra thư mục hiện tại cho
bất kỳ tệp nào trong danh sách và trả về tệp đầu tiên tồn tại hoặc có thể được tạo.
Nếu không có tệp nào tồn tại hoặc có thể được tạo trong thư mục đó, nó sẽ kiểm tra ..thì
../ .., v.v., cho đến khi nó đến thư mục gốc hoặc thư mục
nằm trên một hệ thống tệp khác.

đầu tiên có sẵn tệp1 tệp2 hữu ích. Cảm ơn !
Trả lại tệp đầu tiên trong danh sách tồn tại hoặc có thể được tạo. Điều này có thể hữu ích cho
điều chỉnh cấu hình của bạn để hoạt động trên một số máy hoặc mạng khác nhau, trong đó
các tập tin quan trọng có thể nằm ở những nơi khác nhau. Ví dụ, đây là một dòng từ
một trong những trang điểm của tôi:

TCL_LIB = $ (first_available \
/usr/local/stow/tcl-8.4.5-nothread/lib/libtcl8.4.so \
/usr/lib/libtcl8.4.so /usr/lib/libtcl.so \
/net/na1/tcl8.4a3/lib/libtcl8.4.a \
/net/na1/tcl8.4a3/lib/libtcl8.4.sl)

Dòng này sẽ kiểm tra thư viện Tcl ở tất cả những nơi trên, dừng lại ở
cái đầu tiên mà nó tìm thấy. Sau đó, lệnh liên kết bao gồm $ (TCL_LIB) để chúng tôi nhận được
thư viện Tcl thích hợp.

fer_linker tệp1 tệp2 hữu ích. Cảm ơn !
Đưa ra danh sách các tệp đối tượng trước tiên hãy xây dựng chúng nếu chúng chưa có. Sau đó tìm
cho dù chúng phụ thuộc vào nguồn Fortran, C ++ hay C và trả về
trình biên dịch (biết cách liên kết tốt hơn "ld").

inv_objects tệp1 tệp2 ..., Belt Hold
$ (object1.o object2.o objectXNUMX.o, * .o)

Nếu bạn sử dụng các quy ước tiêu chuẩn liên quan đến tên tệp tiêu đề, makepp có thể
đoán tệp ".o" hoặc ".lo" nào cần được liên kết với chương trình của bạn. Tôi sử dụng cái này để
chọn các tệp từ một thư mục thư viện chứa các mô-đun được sử dụng trong nhiều
các chương trình. Thay vì tạo tệp ".a" trong thư viện và yêu cầu trình liên kết chọn ra
mô-đun liên quan, makepp có thể chọn ra các mô-đun liên quan cho bạn. Theo cách này, chỉ
các mô-đun liên quan được biên dịch.

Thuật toán của Makepp để suy ra sự phụ thuộc của đối tượng phụ thuộc vào quy ước
việc triển khai tất cả các lớp hoặc hàm được xác định trong tệp tiêu đề "xyz.h" là
được biên dịch thành một tệp đối tượng có tên "xyz.o" (hoặc "xyz.lo"). Vì vậy, thuật toán của makepp cho
suy ra các phụ thuộc đối tượng bắt đầu bằng một hoặc một vài đối tượng mà chúng ta biết phải
liên kết vào chương trình. Nó xem xét những tệp nào được bao gồm với "#include" trong
các nguồn đó và cố gắng tìm các tệp đối tượng tương ứng cho mỗi
các tập tin.

Cần phải đề cập đến "$ (inv_objects)" trong danh sách phụ thuộc của một chương trình, chẳng hạn như
điều này:

myprog: $ (inv_objects main.o another_object.o, \
** / *. o /other/library/dirs/**/*.o)
$ (CXX) $ (đầu vào) -o $ (đầu ra) $ (LIBS)

Hàm "$ (inv_objects)" nhận hai đối số (được phân tách bằng dấu phẩy, như được hiển thị).
Đầu tiên là một hoặc một vài tệp đối tượng được biết là bắt buộc (các ký tự đại diện là
cho phép ở đây). Thứ hai là danh sách các đối tượng có thể có (thông thường bạn sẽ sử dụng
ký tự đại diện ở đây) có thể được liên kết trong nếu cần thiết. Giá trị trả về từ điều này
hàm là một danh sách chứa đầu tiên tất cả các đối tượng trong đối số đầu tiên và
sau đó, tất cả các đối tượng bổ sung được chứa trong đối số thứ hai
được yêu cầu bởi các đối tượng trong đối số đầu tiên.

Ví dụ: giả sử "main.o" đến từ "main.cpp", bao gồm "my_class.h".
"$ (inv_objects)" tìm kiếm các tệp có tên "my_class.o". Nếu chính xác một như vậy
tập tin được tìm thấy, nó được thêm vào danh sách. (Nếu hai tệp đối tượng "my_class.o" được tìm thấy
trong các thư mục khác nhau, một thông báo cảnh báo sẽ được in.) "invitrojects" cũng
kiểm tra "my_class.cpp" để xem nó bao gồm những gì và các tệp đối tượng bổ sung là gì
bao hàm.

mktemp
mktemp tiếp đầu ngữ
mktemp tiếp đầu ngữXXX
mktemp /
Trả về tên tệp tạm thời không thể đoán trước, tên này hiện không tồn tại. Không có tên
trỏ đến cùng một tệp được trả về hai lần, ngay cả với các đường dẫn tương đối khác nhau,
trong một lần chạy makepp (ngoại trừ có thể với tạo đệ quy truyền thống hoặc nếu Perl
mã chạy trong một hành động quy tắc gọi "f_mktemp"). Vào cuối makepp chạy tất cả
các tệp được trả về bởi hàm này sẽ bị xóa, nếu chúng tồn tại (một lần nữa, ngoại trừ những
được trả về bởi hàm này trong mã Perl chạy trong một quy tắc).

Bất kỳ số lượng chữ hoa "X" nào ở cuối đối số đều được thay thế bằng nhiều
các chữ cái và chữ số ngẫu nhiên. Càng có nhiều, điều này càng ít có khả năng va chạm
với các quy trình khác, vì vậy nếu bạn cung cấp tiền tố như "/ tmp / abc.", bạn nên có đủ
"X" s. Nếu có nhiều hơn một X, ký tự đầu tiên đến từ id quy trình. Nếu như
không có cái nào, cứ như thể có mười cái, được cho là đủ (8.4e17
khả năng hoặc 3.7e15 trên Windows). Nếu không có đối số, tiền tố mặc định là
"tmp."trong thư mục hiện tại.

Lưu ý rằng bạn không muốn đặt tên như vậy làm mục tiêu quy tắc và phụ thuộc. Các
kết quả sẽ đúng, nhưng nó sẽ được tạo lại mỗi khi bạn chạy makepp.

Ngoài ra, vì nó luôn khác nhau, bạn nên sử dụng điều này trong một hành động quy tắc chỉ khi bạn sử dụng
": build_check ignore_action":

TMPFILE; = $ (mktemp) # 1 cuộc gọi; "=" có nghĩa là 3 cuộc gọi: 3 tệp
A-count B-count:: build_check ignore_action
production-As-and-Bs> $ (TMPFILE)
& grep -c / A / $ (TMPFILE) -o A-count
& grep -c / B / $ (TMPFILE) -o B-count

Hoặc bạn nên xuất nó và để Shell đánh giá nó:

xuất TMPFILE; = $ (mktemp)
Đếm A Đếm B:
production-As-and-Bs> $$ TMPFILE # makepp không thấy giá trị var
fgrep -c A $$ TMPFILE> A-count
fgrep -c B $$ TMPFILE> B-count

Biểu mẫu cuối cùng lặp lại giá trị trả về trước đó, vì vậy bạn có thể sử dụng nó trong quy tắc mẫu:

% .x:% .y
& grep foo $ (input) -o $ (mktemp)
& thanh sed $ (mktemp /) -o $ (đầu ra) # Hoạt động trên đầu ra của & grep

không phải tên tập tin
Trả về phần không phải thư mục của (các) tên tệp, tức là mọi thứ sau phần cuối cùng
gạch chéo nếu có một hoặc toàn bộ tên tệp nếu không.

chỉ_được tạo tên tập tin
Chỉ trả về những tên tệp trong danh sách được tạo bởi makepp và không trả về
đã sửa đổi, theo tệp thông tin bản dựng.

Chức năng này hữu ích trong các quy tắc đích rõ ràng (mặc dù tất nhiên "makeppclean" là
biến thể ưa thích):

$ (sạch rởm):
& rm -f $ (only_generated ** / *)

only_nontarget tên tập tin
Chỉ trả về những tên tệp trong danh sách không phải là mục tiêu của bất kỳ quy tắc nào (
quy tắc rõ ràng hoặc khuôn mẫu). Bạn có thể chỉ định một ký tự đại diện (xem "$ (ký tự đại diện)"
để biết thêm chi tiết về các ký tự đại diện của makepp). Điều này có thể được sử dụng để tạo
mục tiêu phân phối, ví dụ:

.PHONY: phân phối

phân phối:
& mkdir our_product - $ (VERSION)
& cp $ (filter-out% ~, $ (only_nontargets *)) our_product - $ (VERSION)
tar cf - our_product - $ (VERSION) | gzip -9c> our_product - $ (VERSION) .tar.gz

Trong trường hợp này, "$ (only_nontargets *)" trả về mọi tệp trong thư mục hiện tại
đó không phải là mục tiêu của một số quy tắc. "$ (Filter_out% ~, ...)" xóa trình chỉnh sửa
các bản sao lưu.

Tương tự như "only_targets" (xem ở trên), "only_nontargets" chỉ biết về các mục tiêu
đã được xác định rồi. Đây chỉ là một vấn đề nếu bạn sử dụng nó để xác định các biến
với phép gán ": ="; nếu bạn sử dụng nó trong danh sách phụ thuộc hoặc trong phần nội dung của
quy tắc, tất cả các quy tắc khác sẽ đã được nhìn thấy.

chỉ_cũ tên tập tin
Chỉ trả về những tên tệp trong danh sách được tạo bởi makepp và không trả về
đã sửa đổi, theo tệp thông tin bản dựng, nhưng không còn là mục tiêu của bất kỳ quy tắc nào.

Chức năng này hữu ích để đảm bảo rằng không có phụ thuộc vào các tệp như vậy,
mà không buộc phải xây dựng sạch sẽ tất cả các mục tiêu:

$ (giả mạo):
& rm -f $ (only_stale ** / *)

Trên thực tế, có lẽ tốt hơn thay vì viết một tập lệnh gọi makepp để tạo
danh sách các tệp cũ và sau đó yêu cầu tập lệnh đó xóa tất cả các tệp được liệt kê
hiện không được kiểm soát nguồn, đề phòng trường hợp tệp được tạo trở thành nguồn
tập tin. Makepp không có chức năng như vậy được tích hợp sẵn bởi vì makepp là (và có thể
nên vẫn) bất khả tri về kiểm soát nguồn.

chỉ_target tên tập tin
Chỉ trả về những tên tệp trong danh sách thực sự là mục tiêu của một số quy tắc
(quy tắc rõ ràng hoặc quy tắc mẫu). Bạn có thể chỉ định các ký tự đại diện (bao gồm cả makepp's
ký tự đại diện đặc biệt, "**") trong tên tệp. (Xem hàm "$ (ký tự đại diện)" để biết thêm
thông tin chi tiết. Điều này có thể được sử dụng cho một mục tiêu sạch, ví dụ:

.PHONY: sạch sẽ

dọn dẹp:
& rm -f $ (only_targets *)

Bây giờ nếu bạn gõ "makepp clean", nó sẽ xóa mọi thứ mà nó biết cách xây dựng. Nhưng
không tạo một mục tiêu rõ ràng, hãy sử dụng "makeppclean" để thay thế!

Một nơi khác mà nó có thể hữu ích là tránh đưa vào .o các tập tin trong của bạn
xây dựng. Ví dụ: nếu bạn xây dựng một thư viện như thế này:

mylib.a: * .o
& rm -f $ (đầu ra)
$ (AR) cr $ (đầu ra) $ (đầu vào)

và sau đó bạn xóa một số tệp nguồn nhưng quên xóa .o Bức ảnh,
các .o các tệp sẽ vẫn ở xung quanh. Điều này có nghĩa là chúng sẽ vẫn được kết hợp vào
thư viện mặc dù thực tế là chúng không còn hữu ích nữa. Nếu bạn sửa đổi
quy tắc như thế này:

mylib.a: $ (only_targets * .o)
& rm -f $ (đầu ra)
$ (AR) cr $ (đầu ra) $ (đầu vào)

thì vấn đề này sẽ không xảy ra.

Lưu ý rằng điều này chỉ đề cập đến các tệp được coi là mục tiêu at các thời gian bạn
gọi "mục tiêu duy nhất". Nếu "only_targets" xuất hiện trong phần phụ thuộc hoặc hành động của
quy tắc, sau đó tất cả các mục tiêu có thể sẽ được biết bởi vì các hành động và phụ thuộc không phải là
được đánh giá cho đến khi quy tắc được thực thi. Tuy nhiên, nếu bạn đánh giá hãy thử đánh giá nó
trước đó trong makefile với biến ": =" như sau:

ALL_TARGETS: = $ (only_targets *)

mục tiêu1: phụ thuộc1
hành động

mục tiêu2: phụ thuộc2
hành động

thì "only_targets" sẽ không biết về các quy tắc tiếp theo.

Tương tự, "only_targets" không biết về các mục tiêu được tạo trong các tệp trang
được tải với thực hiện đệ quy. (Nhưng dù sao thì bạn cũng không nên sử dụng đệ quy, hãy sử dụng
sử dụng câu lệnh "load_makefile" hoặc tải makefile ngầm định thay thế.)

tên_tệp_có_tương_chính tệp1 tệp2 file3 [, gạch chéo]
Trả về tên của các tệp đó liên quan đến thư mục hiện tại (tệp
makefile đang ở). Điều này cũng có thể được sử dụng để làm sạch "./" không cần thiết và các rác khác khỏi
con đường:

DIR: =.
SUBDIR: = ..
FNAME: = $ (DIR) /../ otherdir / $ (SUBDIR) / tệp
X: = $ (tên_tệp tương đối $ (FNAME))

If cắt giảm là true (thường là 1) các tên tệp trả về được đảm bảo chứa một dấu gạch chéo
bằng cách viết trước "./" nếu cần để bạn có thể sử dụng nó làm tên thực thi mà không cần
lo lắng về đường dẫn tìm kiếm lệnh ghi đè vị trí thư mục.

Nếu đường dẫn đi qua thư mục gốc, thì thư mục gốc của thư mục chính của bạn hoặc
"$ (ROOT)" của hệ thống xây dựng của bạn hoặc trên Windows một ổ đĩa gốc (tùy thuộc vào
môi trường, điều này cũng xảy ra đối với / cygdrive / c or /c), một đường dẫn tuyệt đối sẽ là
đã trả lại thay thế.

liên quan đên tệp1 tệp2 file3 [, danh mục]
Trả về tên của các tệp đó liên quan đến thư mục được chỉ định. Đây là
thường hữu ích khi bạn phải thực hiện lệnh từ một
thư mục khác (thư mục hiện tại mặc định):

nguồn_backup.tar:
cd .. && tar cf $ (rel_to $ (đầu ra), ..) $ (rel_to., ..)

hậu tố tên ...
Trích xuất hậu tố của mỗi tên tệp trong tên. Nếu tên tệp chứa dấu chấm,
hậu tố là mọi thứ bắt đầu bằng dấu chấm cuối cùng. Nếu không, hậu tố là
chuỗi rỗng. Điều này thường xuyên có nghĩa là kết quả sẽ trống khi không có tên,
và nếu các tên chứa nhiều tên tệp, kết quả có thể chứa ít tên tệp hơn.

Ví dụ,

$ (hậu tố src / foo.c src-1.0 / bar.c hack)

tạo ra kết quả ".c .c".

tạm thời từ
Hãy cho makepp biết rằng các mục tiêu được chỉ định có thể bị xóa bởi quy tắc tạo
họ. Tương tự như "rởm", ngoại trừ việc makepp mong đợi rằng một tệp thực có tên đó
sẽ có thể bị ảnh hưởng bởi quy tắc. Quy tắc không được thực thi nếu chỉ là quy tắc tạm thời
mục tiêu đã lỗi thời.

ký tự đại diện Belt Hold
Trả về tên đã sắp xếp của tất cả các tệp phù hợp với mẫu đã cho tồn tại hoặc những
các tệp chưa tồn tại nhưng có thể được tạo dựa trên các quy tắc mà makepp biết
về thời điểm mà nó đánh giá biểu thức. Ở điểm cuối cùng này, nó khác
từ các ký tự đại diện đầu vào quy tắc, áp dụng ngay cả cho các tệp được tạo bởi các quy tắc được tìm thấy sau này.

Makepp hỗ trợ tất cả các ký tự đại diện shell thông thường ("*", "?", Và "[]"). Nó cũng có một
ký tự đại diện "**" khớp với bất kỳ số lượng thư mục can thiệp nào. (Ý tưởng này là
bị đánh cắp từ zsh.) Ví dụ: "** / *. c" khớp với tất cả .c các tệp trong toàn bộ nguồn
cây. "object / ** / *. o" khớp với tất cả .o các tệp được chứa ở bất kỳ đâu trong
thư mục con đối tượng hoặc bất kỳ thư mục con nào của nó hoặc bất kỳ thư mục con nào của chúng. Các
Ký tự đại diện "**" sẽ không theo sau các liên kết mềm tới các thư mục ở bất kỳ cấp nào, cũng không
cố gắng nhập các thư mục tồn tại nhưng không thể đọc được. Ngoài ra các tệp và
các thư mục tồn tại nhưng không thể đọc được sẽ không được trả về bằng "$ (ký tự đại diện)".

Chuỗi Chức năng
thêm tiền tố tiếp đầu ngữ, từ
Thêm chuỗi tiền tố vào mỗi từ. Điều này chủ yếu dành cho GNU make
tính tương thích; bằng cách sử dụng mở rộng kiểu rc, điều này có thể được thực hiện theo cách dễ đọc hơn
như thế này:

CÁC CHẾ ĐỘ: = abcd
X_OLD_STYLE: = $ (thêm tiền tố $ (OBJDIR) /, $ (addsuffix .o, $ (MODULES)))
X_NEW_STYLE: = $ (OBJDIR) / $ (MODULES) .o # Điều đó không dễ đọc hơn sao?

phụ gia hậu tố, từ
Thêm chuỗi hậu tố vào mỗi từ. Điều này chủ yếu dành cho GNU make
tính tương thích; bằng cách sử dụng mở rộng kiểu rc, điều này có thể được thực hiện theo cách dễ đọc hơn
như thế này:

X_OLD_STYLE: = $ (addsuffix .o, $ (MODULES))
X_NEW_STYLE: = $ (MODULES) .o

cuộc gọi Biến đổi[, từ]...
Chức năng "gọi" là duy nhất ở chỗ nó có thể được sử dụng để xem xét biến như là một
hàm tham số hóa. Bạn có thể gán một biểu thức phức tạp cho biến Và sử dụng
"call" để mở rộng nội dung của nó thành các giá trị khác nhau được tham số bởi từ sau này. Trong
hệ thống tạo khác, một biến được sử dụng chủ yếu cho mục đích được mở rộng thông qua
"cuộc gọi", được gọi là vĩ mô.

Trong quá trình mở rộng macro, các biến tạm thời $1, $2, "..." Tham khảo đến
các đối số được cung cấp cho "cuộc gọi" trong khi gọi nó. Biến $0 sẽ được mở rộng thành
tên của macro (tức là biến) "cuộc gọi" đó hiện đang mở rộng.

Không có giới hạn, số lượng đối số mà macro có thể được "gọi" ed với hoặc bao nhiêu đối số
các tham số mà macro có thể mong đợi. Nếu bạn chuyển nhiều đối số hơn để "gọi" làm macro
cần, tất cả các đối số vượt quá sẽ bị loại bỏ. Nếu bạn truyền ít đối số hơn
macro mong đợi, tất cả các tham số vượt quá thu gọn thành chuỗi trống.

Đầu tiên, một ví dụ đơn giản:

phần còn lại = $ (danh sách từ 2, $ (từ $ (1)), $ (1))
list = ABCDE
butfirst: = $ (cuộc gọi còn lại, $ (danh sách))

Tại đây, biến "$ (butfirst)" sẽ chứa danh sách "BCDE".

Và bây giờ là một ví dụ phức tạp hơn để chỉ ra những gì có thể:

phần còn lại = $ (danh sách từ 2, $ (từ $ (1)), $ {1})
mymap = $ (nếu $ 2, $ (gọi $ 1, $ (từ đầu tiên $ 2)) $ (gọi $ 0, $ 1, $ (gọi phần còn lại, $ 2)))
downcase = $ {makeperl lc ("$ 1")}

UCWORDS = TẤT CẢ CÁC TỪ NÀY ĐỀU ĐƯỢC CẬP NHẬT
DCWORDS: = $ (gọi mymap, viết thường, $ (UCWORDS))

Bây giờ "$ (DCWORDS)" chứa "tất cả các từ này là chữ hoa". Nhân tiện: nó làm cho không
sự khác biệt, cho dù chúng tôi truy cập các đối số thông qua $1, "$ {1}" or "$ (1)" trong một macro.

Bạn có thể sử dụng trực tiếp biến như thể nó là một hàm, nếu không có
chức năng của tên đó. Điều này được chuyển đổi nội bộ thành "cuộc gọi", vì vậy đây là
tương đương:

thảo luận = $ 0 đã biến thành $ 1 $ 2.
direct = $ (thảo luận an, đối số)
được gọi là = $ (cuộc gọi thảo luận, an, đối số)

Có vẻ như có thể gây tranh cãi về việc liệu "$ [call]" có nên mở rộng "$ []" của macro hay không
biểu thức, hoặc liệu một hàm có nên luôn làm điều tương tự hay không, bất kể nó như thế nào
được gọi là. Cái thứ hai đã được chọn, bởi vì với cú pháp tạo thông thường, nó sẽ là
không thể đưa "$ [1], $ [2] ..." vào một biến (chúng sẽ không được thay thế bằng gì,
trước khi nhiệm vụ diễn ra.) Do đó, nếu bạn có macro để xác định
quy tắc, bạn muốn các biểu thức như "$ (output)" được nhìn thấy khi quy tắc được phân tích cú pháp, vì vậy
bạn phải bảo vệ họ khỏi "cuộc gọi":

xác định myrule
2 đô la: 1 đô la
mycommand $$ (input) -o $$ (output)
cuối cùng
$ [myrule myinput, myoutput]

lọc mẫu, từ
Trả về tất cả các từ trong danh sách khớp với các mẫu. Các mẫu có thể đơn giản là khác
các từ hoặc ký tự đại diện tên tệp (ví dụ: "*", "?" và "[az]" được nhận dạng) hoặc chúng có thể
có một ký tự "%", có nghĩa là khớp với bất kỳ chuỗi nào tại thời điểm đó (giống như "*").

lọc ra mẫu, từ
Trả về tất cả các từ trong danh sách không khớp với các mẫu. Các mẫu có thể chỉ đơn giản là
các từ khác hoặc các ký tự đại diện tên tệp (ví dụ: "*", "?" và "[az]" được nhận dạng) hoặc
chúng có thể có ký tự "%", có nghĩa là khớp với bất kỳ chuỗi nào tại thời điểm đó (giống như
"*").

Ví dụ:

libproduction.a: $ (filter_out test_ *, $ (ký tự đại diện * .o))

sẽ đặt tất cả .o các tệp tồn tại hoặc có thể được tạo, ngoại trừ những tệp bắt đầu bằng thử nghiệm_,
trong libproduct.a.

dây tìm kiếm tìm thấy, in
Trả hàng tìm, nếu nó là một chuỗi con của in.

từ đầu tiên từ
Trả lại từ đầu tiên.

bản đồ từ, mã perl
trang điểm từ, mã perl
Tương tự với bản đồ của Perl, áp dụng mã perl lần lượt từng từ và trả về
kết quả. Biến thể đầu tiên là mã Perl thuần túy, trong khi biến thể thứ hai chuyển sang đầu tiên
perlcode thông qua mở rộng biến Make-style. Các từ được mở rộng trong cả hai
các trường hợp.

Các từ bằng $ _ và được trả lại trừ khi bạn hoàn trả $ _. Điều này được dành cho
"patsubst" không dễ dàng xử lý các sửa đổi. Chỉ có dấu phẩy đầu tiên là dấu phân cách,
bất kỳ người nào khác được coi là một phần của mã perl.

# Chuyển từ. Double parens, để cho phép parens trong perlcode hoặc sử dụng $ {}:
X = $ ((bản đồ $ (VALUES), s /(.+)-(.+)/$ 2- $ 1 /))
# Bạn có thể sử dụng biểu thức make, nhưng sau đó bạn phải sử dụng $$ cho Perl $:
Y = $ (makemap $ (VALUES), tr / $ (OLDCHARS) / $ (NEWCHARS) / hoặc $$ _ = 'không thành công')
# Bạn có thể loại bỏ các ứng viên:
Y = $ (bản đồ $ (VALUES), undef $ _ if / no_good /)

tham gia từ1, từ2
Thực hiện ghép nối các từ đầu tiên và các từ thứ hai.

patsubst mẫu, thay thế, từ
Thực hiện thay thế từng từ trong danh sách từ. Ký tự "%" khớp với bất kỳ
dây. Điều này được minh họa tốt nhất bằng một ví dụ:

OBJS = $ (patsubst% .c, object_dir /%. O, $ (C_SOURCES))

lấy mọi tệp trong C_SOURCES và trả về tên của tệp đối tượng trong object_dir.
Đôi khi, ngắn gọn hơn là sử dụng tham chiếu thay thế, ví dụ: ở trên có thể
đã được viết là

OBJS = $ (C_SOURCES:%. C = object_dir /%. O)

loại từ1 từ2 từ3 hữu ích. Cảm ơn !
Sắp xếp các từ theo thứ tự từ vựng và loại bỏ các từ trùng lặp.

dải chuỗi
Loại bỏ khoảng trắng ở đầu và cuối khỏi chuỗi và thay thế từng khoảng trắng bên trong
chuỗi một hoặc nhiều ký tự khoảng trắng với một khoảng trắng. Do đó, "$ (dải ab
c) "cho kết quả là" abc ".

subst từ, đến, văn bản
Thực hiện thay thế văn bản trên văn bản văn bản: mỗi lần xuất hiện của từ được thay thế
bằng cách. Kết quả được thay thế cho lời gọi hàm. Ví dụ,

$ (subst ee, EE, feet on the street)

thay thế chuỗi "fEEt trên strEEt".

lời n, văn bản
Trả về ntừ thứ của văn bản. Các giá trị hợp pháp của n bắt đầu từ 1 ở đầu
hoặc ngược từ -1 ở cuối. Nếu như n lớn hơn số từ trong văn bản, Các
giá trị trống.

danh sách các từ danh sách chỉ mục, từ
danh sách các từ chỉ số đầu tiên, chỉ số cuối cùng, từ
Trong biểu mẫu đầu tiên, bạn cung cấp một danh sách các chỉ số (đếm từ 1 ở đầu hoặc
ngược từ -1 ở cuối) để chọn các từ bạn muốn. Ở dạng thứ hai bạn
chỉ định phạm vi từ bạn muốn trả về.

từ văn bản
Trả về số lượng từ trong văn bản.

hỗn hợp Chức năng
cho mỗi var, list, text
Hai đối số đầu tiên, , được mở rộng trước khi bất kỳ điều gì khác được thực hiện; Ghi chú
rằng đối số cuối cùng, văn bản, không được mở rộng cùng một lúc. Sau đó, đối với mỗi từ của
giá trị mở rộng của danh sách, biến được đặt tên bởi giá trị mở rộng của var được đặt thành
từ đó và văn bản được mở rộng. Có lẽ văn bản chứa các tham chiếu đến biến đó,
vì vậy sự mở rộng của nó sẽ khác nhau mỗi lần.

Ví dụ đơn giản này đặt biến các tập tin vào danh sách tất cả các tệp trong
thư mục trong danh sách dirs:

dirs: = abcd
các tệp: = $ (foreach dir, $ (dirs), $ (ký tự đại diện $ (dir) / *))

Ở đây văn bản là "$ (ký tự đại diện $ (dir) / *)". Lần lặp lại đầu tiên tìm giá trị "a" cho dir,
vì vậy nó cho ra kết quả giống như "$ (ký tự đại diện a / *)"; sự lặp lại thứ hai tạo ra
kết quả của "$ (ký tự đại diện b / *)"; và thứ ba, của "$ (ký tự đại diện c / *)".

Ví dụ này có cùng kết quả (ngoại trừ việc đặt "dirs") như ví dụ sau:

tệp: = $ (ký tự đại diện a / * b / * c / * d / *)

Khi văn bản phức tạp, bạn có thể cải thiện khả năng đọc bằng cách đặt tên cho nó, với
biến bổ sung:

find_files = $ (ký tự đại diện $ (dir) / *)
dirs: = abcd
các tệp: = $ (foreach dir, $ (dirs), $ (find_files))

Ở đây chúng tôi sử dụng biến find_files theo cách này. Chúng tôi sử dụng "=" đơn giản để xác định
biến mở rộng đệ quy, để giá trị của nó chứa một lệnh gọi hàm thực tế tới
được mở rộng lại dưới sự kiểm soát của foreach; một biến được mở rộng đơn giản sẽ không làm được,
vì ký tự đại diện sẽ chỉ được gọi một lần tại thời điểm xác định find_files.

Lưu ý: Đừng nhầm lẫn điều này với biến đặc biệt "$ (foreach)".

Thông tin văn bản
cảnh báo văn bản
lôi văn bản
Đầu ra văn bản trả về không có gì. Đầu tiên chuyển đến STDOUT, thứ hai chuyển đến STDERR,
thứ ba cũng hủy bỏ quá trình xử lý.

xây dựng trước mục tiêu
làm cho mục tiêu
Trả về nguyên văn đối số của nó, nhưng trước tiên sẽ xây dựng tất cả các tệp được liệt kê. Cái này hữu ích
khi một tệp nhất định là cần thiết khi đánh giá một biểu thức make. Điều này thường xảy ra
khi bạn có một bản dựng trong đó tập hợp các tệp liên quan được tính toán bởi một số trình bao
các lệnh. Ví dụ,

file_list:
# shell lệnh để tính toán danh sách các tệp để đưa vào chương trình

my_program: $ (& cat $ (prebuild file_list))

Nếu bạn cần danh sách trong nhiều quy tắc, sẽ hiệu quả hơn nếu sử dụng
mở rộng nhiều nhất một lần biến:

file_list; = $ (& cat $ (prebuild file_list))

my_program1: ao $ (file_list)

my_program2: bo $ (file_list)

Thay vào đó, nếu bạn chỉ chỉ định "$ (& cat file_list)", thì makepp sẽ không ép buộc
file_list sẽ được cập nhật trước khi nó thực thi lệnh shell. Sử dụng "$ (tạo sẵn)"
là cách tốt nhất để giải quyết vấn đề này. Bạn có thể bị cám dỗ để thử những thứ khác, như
điều này:

my_program: file_list $ (& cat file_list)

nhưng điều này sẽ không hoạt động vì "$ (& cat file_list)" được đánh giá trước khi makepp cố gắng
xây dựng "file_list".

chỉ_phony_target tên
Chỉ trả về những tên trong danh sách là mục tiêu giả mạo của một số quy tắc (hoặc
quy tắc rõ ràng hoặc khuôn mẫu). Bạn có thể chỉ định các ký tự đại diện (bao gồm cả đặc biệt của makepp
ký tự đại diện, "**") trong tên tệp. (Xem chức năng "$ (ký tự đại diện)" để biết thêm chi tiết.
Điều này có thể được sử dụng để nhóm các mục tiêu, ví dụ:

$ (thử nghiệm rởm): $ (only_phony_targets * / ** / tests)

nguồn gốc biến
Với tên của một biến, cho bạn biết giá trị của nó đến từ đâu.

perl mã perl
người tạo ra mã perl
Đánh giá perlcode trong một khối và trả về kết quả. Biến thể đầu tiên là Perl đơn giản
mã, trong khi biến thể thứ hai lần đầu tiên chuyển perlcode thông qua biến Make-style
sự bành trướng.

Lưu ý rằng, như với tất cả các hàm, dấu phân cách hàm được sử dụng có thể không xuất hiện trong
mã perlcode bên ngoài các chuỗi được trích dẫn đơn hoặc kép. Nhưng bạn có thể nhân đôi nó như trong
ví dụ cuối cùng:

VAR = 1
VAR1 = $ {perl ($ VAR + 1) * 3}
VAR2 = $ (perl do {$ VAR * = 3; trả về $ VAR + 1} nếu $ VAR)
VAR3 = $ (makeperl $ (VAR1) * 3 + $$ VAR) # một Tạo var và một Perl var
VAR = $ ((perl if (...) {...}))

giả mạo từ
Cho biết danh sách các từ thực sự là mục tiêu giả mạo và trả về danh sách
các mục tiêu. Nó dự định được sử dụng như thế này:

$ (tất cả giả mạo): my_program

$ (sạch rởm):
& rm -f * .o my_program

Bạn cũng có thể khai báo một hoặc nhiều mục tiêu là giả mạo với một dòng như thế này ở bất kỳ đâu trong
makefile của bạn:

.PHONY: tất cả đều sạch sẽ

in văn bản
Kết xuất văn bản và trả về nó. Điều này chủ yếu hữu ích cho việc gỡ lỗi, khi bạn không
hiểu tại sao thay thế biến có kết quả như nó. Ví dụ,

XYZ: = $ (print $ (patsubst% .c,% o, $ (SOURCE_FILES)))

sẽ in ra kết quả của lệnh gọi "patsubst".

XYZ: = $ (patsubst% .c,% o, $ (print $ (SOURCE_FILES)))

sẽ in ra đối số cuối cùng cho lệnh gọi "patsubst".

shell lệnh shell
Trả về kết quả từ lệnh shell đã cho, với các dòng mới được thay thế bằng dấu cách.

Lưu ý rằng, như với tất cả các hàm, dấu phân cách hàm được sử dụng có thể không xuất hiện trong
lệnh shell bên ngoài các chuỗi được trích dẫn đơn hoặc kép. Nhưng bạn có thể nhân đôi nó
như trong ví dụ thứ hai:

date = $ (shell date) # better: $ (perl vô hướng localtime)
VAR = $ {{shell f () {echo xin chào; }; NS}}

xargs lệnh, các đối số [, hậu tố [, length]]
Trả về danh sách lệnh được phân tách bằng dòng mới mà mỗi lệnh bắt đầu bằng lệnh đã chỉ định
và kết thúc bằng càng nhiều phần tử của danh sách càng tốt mà không cần lướt qua
chiều dài (mặc định 1000) ký tự.

Mục đích của việc này là để tránh tràn giới hạn độ dài lệnh trên hệ thống của bạn.
Ví dụ: nếu có nhiều tệp được tạo, thì bạn có thể muốn
mục tiêu sạch (mà bạn không nên có, vì "makeppclean" hiệu quả hơn) để
trông giống như thế này:

$ (sạch rởm):
$ (xargs $ (RM), $ (only_targets ** / *))

Điều này cũng có tác dụng phụ là không có bất kỳ lệnh nào được tạo ra nếu danh sách
xảy ra để trống. Nhưng trong trường hợp này, tốt hơn là sử dụng nội trang & rm,
bởi vì các đối số cho các lệnh nội trang chỉ bị giới hạn bởi bộ nhớ của Perl:

$ (sạch rởm):
& rm -f $ (only_targets ** / *)

Nếu một đối số thứ ba được chỉ định, thì nó được sử dụng để sửa lỗi mỗi lệnh. Đây là
hữu ích để chỉ định các trình chuyển hướng, ví dụ: (mặc dù ở đây một lần nữa & echo sẽ hữu ích):

rõ ràng:
& rm -f $ @
& chạm vào $ @
$ (xargs echo, $ (only_nontargets ** / *), >> $ @)

Một số tài liệu này dựa trên tài liệu tạo GNU.

Xin lưu ý rằng nếu một hàm được gọi trong quá trình khởi tạo makefile, ví dụ:
mở rộng biến xuất, thông báo lỗi hoặc cảnh báo sẽ báo dòng số 0.

Sử dụng makepp_functions 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

Lệnh Linux

Ad