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

Ad


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

makepp_variables - Trực tuyến trên đám mây

Chạy makepp_variables 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_variables 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


makepp_variables - Cách sử dụng các biến trong makepp

MÔ TẢ


?: $ *,
$ +,
$ /,
$ <,
$ ?,
$ @,
$ ^,
=,
! =,
& =,
+ =,
: =,
; =,
? =, A: AR,
ARFLAGS,
NHƯ, C: DC,
CỜ,
"change_dependencies",
change_inputs,
sữa chua,
CXX,
CXXFLAG, D: "phụ thuộc",
"phụ thuộc", F: F77,
F.C.,
"cho mỗi", I: đầu vào,
đầu vào, L: LD,
LEX,
LIBTOOL, M: CHẾ TẠO,
KIẾM MỤC TIÊU,
KIẾM TIỀN,
THÔNG TIN,
MAKEPP_DEBUG,
MAKEPPFLAGS,
_MAKEPPFLAGS,
MAKEPP_LN_CP,
"makepp_percent_subdirs",
"makepp_require_phony",
makepp_signature_C_flat,
"makepp_simple_concatenation",
MAKEPP_VERSION, O: "đầu ra",
"đầu ra", P: PERL,
NKT, R: RM,
NGUỒN GỐC, S: VỎ BỌC,
"sorted_dependencies",
đã sắp xếp_inputs,
"thân cây", T: mục tiêu,
mục tiêu, V: VPATH, Y: YACC

Makefiles thường sử dụng các biến ở nhiều nơi. Một lý do quan trọng để sử dụng
các biến là để đảm bảo rằng thông tin chỉ được chứa ở một nơi trong makefile, vì vậy
rằng nếu nó thay đổi, không có nguy cơ hai bản sao của thông tin bị thoát ra khỏi
đồng bộ hóa.

Tên biến phân biệt chữ hoa chữ thường. Về lý thuyết, tên biến có thể được tạo từ nhiều
nhân vật, nhưng makepp có thể sẽ không thể mò mẫm nó nếu bạn làm bất cứ điều gì khác ngoài
ký tự chữ và số, "_" và "-".

Mỗi makefile có một bộ biến riêng và việc đặt một biến trong một makefile sẽ
không ảnh hưởng đến giá trị của nó trong bất kỳ tệp trang điểm nào khác. Nếu bạn muốn đặt các biến trong
nhiều trang điểm, cách tốt nhất để làm điều đó là để mỗi tệp trong số chúng bao gồm một định nghĩa chung
tệp (xem câu lệnh bao gồm) hoặc sử dụng các biến "toàn cục".

Biến Chuyển nhượng
Một biến có thể giả định một giá trị theo một số cách khác nhau:

· Một biến có thể được đặt bên trong makefile. Có một số cách khác nhau để làm
điều này; xem bên dưới.

· Giá trị của một biến có thể được chỉ định trên dòng lệnh, như sau:

makepp CFLAGS = -O2 my_program

Nếu nhiều tệp trang được tải, biến CFLAGS sẽ được truyền cho tất cả
trang điểm. Các biến được đặt trên dòng lệnh sẽ tự động ghi đè bất kỳ cài đặt nào của
biến trong bất kỳ tệp makefiles nào.

Nếu cần thiết, makefile phải ghi đè rõ ràng các cài đặt dòng lệnh.
Mục đích không phải là bỏ qua những gì người dùng yêu cầu, mà là một cách để sửa đổi nó.
Bổ ngữ "ghi đè" có thể đứng trước bất kỳ câu lệnh gán nào. Nhưng trong trường hợp của
câu lệnh từ khóa, thứ tự là quan trọng, đó là lý do tại sao biến thể ghi đè là
luôn được hiển thị bên dưới. Công cụ sửa đổi "ghi đè" chỉ áp dụng cho bất kỳ nhiệm vụ nào mà nó
hiện tại và không ảnh hưởng đến việc gán sau này cho biến.

· Nếu một biến được đặt trong môi trường, nó có thể được tham chiếu như một biến makepp.
Các phép gán thông thường cho các biến bên trong cài đặt ghi đè makefile từ
nhưng bạn có thể thay đổi điều này bằng cách sử dụng "-e" hoặc "--enbro-override"
tùy chọn dòng lệnh.

Các biến được gán với một trong một số biểu thức gán, như thế này

X = 1
CÁC CHẾ ĐỘ: = abcd
CC? = Gcc
CFLAGS + = - Tường
xác định VAR
var dòng 1
var dòng 2
kết thúc
xuất PATH: = $ (PWD): $ (PATH)
global MYPROJECT.INFO = thông tin được xem trong tất cả các trang điểm

Khoảng trắng đầu và cuối xung quanh các giá trị luôn bị loại bỏ.

Các toán tử gán khác nhau có ý nghĩa hơi khác nhau.

Đơn giản chuyển nhượng khai thác

=
VARIABLE = chuỗi văn bản
ghi đè VARIABLE = chuỗi văn bản

Đây là câu lệnh gán thông thường mà tất cả các triển khai đều hỗ trợ. Các
biểu thức ở phía bên phải không được đánh giá cho đến khi giá trị của "$ (VARIABLE)" là
thực sự được sử dụng ở đâu đó. Do đó, nếu bạn làm như sau:

X = 1
Y = $ (X)
X = 2

Sau đó, "$ (Y)" sau đó trong makefile sẽ đánh giá thành "2".

Nói chung, bạn thường muốn sử dụng ": =" (xem bên dưới) thay vì "=" vì nó
cung cấp đánh giá biến dễ đoán hơn. Tuy nhiên, có những lúc bạn cần
để trì hoãn việc đánh giá biến. Ngoài ra, nếu bạn đang viết một tệp makefile thì phải
tương thích ngược với một số phiên bản của make khác với GNU make, thì bạn không có
lựa chọn: bạn chỉ có thể sử dụng "=".

:=
VARIABLE: = expr
ghi đè VARIABLE: = expr

Điều này giống với "VARIABLE = expr" ngoại trừ việc phía bên phải được đánh giá
một lần và mãi mãi tại thời điểm được giao. Do đó nếu

X: = 1
Y: = $ (X)
X: = 2

thì "$ (Y)" sau này trong makefile sẽ đánh giá thành "1" vì đó là "$ (X)"
khi "$ (Y)" được xác định.

;=
VARIABLE; = expr
ghi đè VARIABLE; = expr

Điều này giống với "VARIABLE: = expr" ngoại trừ việc phía bên phải được đánh giá
chỉ tại thời điểm sử dụng đầu tiên và sau đó được ghi nhớ. Điều này rất hữu ích cho những
các lệnh luôn trả về cùng một giá trị nhưng bạn không muốn thực hiện khi
xây dựng các mục tiêu không liên quan:

VAR1; = $ (tính toán đắt tiền perl)
VAR2; = $ (lệnh bên ngoài shell)

Lưu ý rằng các tệp trang điểm cũ thường sẽ sử dụng ": =" ở đây, để thực hiện điều này ít nhất một lần.
Nhưng với toán tử này, bạn thậm chí có thể không làm điều đó, nếu bạn hiện không
cần giá trị. Đối với các giá trị giống nhau trong một số thư mục, bạn có thể
tối ưu hóa điều này hơn nữa với "toàn cầu", được thảo luận bên dưới.

Tuy nhiên, đây không phải là một cách thông minh để buộc trật tự đánh giá. Nếu một
biến được định nghĩa như thế này bao gồm giá trị của một biến khác và một biến khác
có giá trị mục tiêu cụ thể và phần mở rộng đầu tiên dành cho mục tiêu đó, sau đó
giá trị cụ thể mục tiêu cũng sẽ phù hợp với tất cả các ngữ cảnh khác. Đây là một lỗi và
hy vọng sẽ được sửa trong tương lai.

+=
VARIABLE + = expr
ghi đè VARIABLE + = expr

Nối chuỗi vào nội dung trước đó của biến, được phân tách bằng dấu cách. Nếu như
biến trước đó đã được gán với ": =", sau đó phía bên phải được đánh giá
trước khi bổ sung.

&=
VARIABLE & = expr
ghi đè VARIABLE & = expr

Thêm chuỗi vào nội dung trước đó của biến, được phân tách bằng dấu cách.
Nếu trước đó biến được gán với ": =", thì phía bên phải là
đánh giá trước khi bổ sung.

Ví dụ: một cách đảm bảo rằng "CFLAGS", bất kỳ thứ gì khác mà người dùng có thể đưa vào,
luôn bắt đầu bằng "-Wall" là hai dòng sau:

CFLAGS = -O2 # Có thể bị ghi đè trên dòng lệnh
ghi đè CFLAGS & = -Wall # được thêm vào trước vô điều kiện

Trong trang điểm cũ, bạn thường phải làm điều gì đó như thế này, điều này có mặt
có tác dụng buộc loại thành ": =" để ngăn chặn đệ quy vô tận:

VARIABLE: = expr $ (VARIABLE)

?=
VARIABLE? = Expr
ghi đè VARIABLE? = expr # Vô dụng, nhưng hợp pháp

Đặt giá trị của biến, nhưng chỉ khi biến không được chỉ định trước đó trong
makefile, trên dòng lệnh hoặc trong môi trường. Nhiệm vụ trên là
chính xác tương đương với

BIẾN ifndef
BIẾN = expr
endif

!=
VARIABLE! = Lệnh shell
ghi đè lệnh shell VARIABLE! =

Chạy lệnh shell và đặt biến để chứa đầu ra chuẩn của lệnh.
Điều này chính xác tương đương với

VARIABLE: = $ (lệnh shell)

Đa dòng biến

Câu lệnh "define" tương đương với nhiều dòng của các câu lệnh đơn giản ở trên. Các
toán tử sau biến là tùy chọn. Nếu thiếu, nó tương đương với "xác định VARIABLE
= ". Toán tử" & = "và" + = "ở đây hơi khác nhau, ở chỗ chúng gắn kết này với
giá trị cũ bằng một dòng mới, thay vì một khoảng trắng. Không được có bất cứ thứ gì ngoại trừ một
bình luận sau câu lệnh, tức là giá trị bắt đầu trên dòng tiếp theo.

xác định VARIABLE: =
dòng đầu tiên của giá trị của biến
dòng thứ hai của giá trị của biến
dòng thứ ba của giá trị của biến
cuối cùng

ghi đè xác định VARIABLE
hữu ích. Cảm ơn !
kết thúc

Các từ khóa trước "xác định" có thể là sự kết hợp của một trong hai từ "xuất" hoặc "toàn cầu" và
"ghi đè".

Nếu bạn cần giá trị của một biến để chứa các dòng mới, bạn phải sử dụng câu lệnh "xác định" như
hiển thị (hoặc bạn có thể chỉ định giá trị trực tiếp trong Perl). ("endef" đã được chọn cho
khả năng tương thích với GNU make. Bạn cũng có thể sử dụng "enddef".) Điều này chủ yếu hữu ích cho
"chuỗi lệnh soạn trước", ví dụ: một cái gì đó như thế này:

xác định COMPILE_C_PROGRAM
@ & echo "Biên dịch $ (đầu vào)"
@ $ (CC) $ (CFLAGS) $ (CPPFLAGS) $ (BAO GỒM) -c $ (đầu vào) -o $ (đầu ra)
cuối cùng

Sau đó, bạn có thể sử dụng biến nhiều dòng này theo một số quy tắc, như sau:

% .o:% .c
$ (COMPILE_C_PROGRAM)

$ (ARCH) /%. O: $ (ARCH) /%. C
$ (COMPILE_C_PROGRAM)

Lưu ý rằng bạn thường có thể đạt được hiệu ứng tương tự bằng cách sử dụng dấu chấm phẩy thay vì dòng mới,
bởi vì shell cũng diễn giải nó như một lệnh mê sảng. Ví dụ,

COMPILE_C_PROGRAM = @echo "Biên dịch $ (đầu vào)"; \
$ (CC) $ (CFLAGS) $ (CPPFLAGS) $ (BAO GỒM) -c $ (đầu vào) -o $ (đầu ra)

cũng sẽ có tác dụng tương tự, ngoại trừ việc dấu chấm phẩy buộc Perl phải chuyển nó vào shell,
thay vì thực hiện lệnh một cách trực tiếp và hiệu quả hơn. Bạn cũng phải đặt mỗi
nội trang trên một dòng của riêng nó, nghĩa là bạn phải chuyển sang tiếng vọng bên ngoài trong
dấu chấm phẩy trường hợp.

Có một đặc điểm khi mở rộng bên trong "xác định", tức là "xác định X: =" hoặc trên một
biến đã là ": =", "xác định X & =" và "xác định X + =". Trong trường hợp này,
"$ (shell command ...)" hoặc nội trang "$ (& command ...)" không được chuyển đổi dòng mới thành
khoảng trống.

Xuất khẩu biến đến quy trình phụ

xuất VAR ...
xuất VAR = giá trị
ghi đè giá trị xuất VAR + =

Biểu mẫu đầu tiên đánh dấu các biến đã cho để xuất sang các quy trình con, với bất kỳ giá trị nào
khi đó biến có. Ngoài ra, biểu mẫu thứ hai chỉ áp dụng cho một biến
chỉ định một giá trị ngay lập tức. Tất cả các biến thể của nhiệm vụ đều được phép.

Chia sẻ biến ngang qua trang điểm

VAR toàn cầu ...
VAR toàn cầu = giá trị
ghi đè VAR & = giá trị toàn cầu

Biểu mẫu đầu tiên đánh dấu các biến đã cho là toàn cục cho tất cả các tệp makefiles. Nếu bất kỳ ai trong số họ
đã có một giá trị, giá trị đó được chuyển từ biến cục bộ makefile sang biến toàn cục
một. Tuy nhiên, nếu, tại thời điểm câu lệnh này được nhìn thấy, bất kỳ cấu hình nào khác đã có
giá trị cho bất kỳ cái nào trong số chúng, thì những cái trang đó sẽ không nhìn thấy cái chung.

Dạng thứ hai, chỉ áp dụng cho một biến, chỉ định thêm một quyền giá trị
xa. Tất cả các biến thể của nhiệm vụ đều được phép. Lưu ý rằng ": =" sẽ mở rộng ngay lập tức
thành các giá trị trong tệp địa phương. Ngược lại, các biến "=" sẽ mở rộng thành
giá trị tại thời điểm sử dụng.

Các biến toàn cục có thể khó xử lý, vì makepp có thể tải các tệp makefiles trong bất kỳ
đặt hàng, khi nhu cầu phát sinh để xây dựng một số mục tiêu mà không có quy tắc hoặc cấu hình nào được tải.
Vì lý do này, bạn nên có một RootMakeppfile và tải tất cả một cách rõ ràng
những người khác sửa đổi hoặc sử dụng biến với "load-makefile".

GLIBLIBS toàn cầu; = $ (shell pkg-config --libs glib-2.0)

Cũng lưu ý rằng một ngày nào đó dự án của bạn có thể được xây dựng cùng với các dự án khác. Đối với điều này
lý do nên luôn đặt tên dự án là một phần của bất kỳ tên biến toàn cục nào.

Mục tiêu cụ thể bài tập

mục tiêu: BIẾN = chuỗi
target: VARIABLE: = string
target: ghi đè chuỗi VARIABLE + =

Đặt giá trị mục tiêu cụ thể của biến. Giá trị mục tiêu cụ thể đang có hiệu lực có thể
trong một hành động tạo ra mục tiêu nhất định. Điều này chủ yếu được sử dụng cho những thứ như
điều này:

CFLAGS: = -O2

my_prog: file1.o file2.o Special_file.o

special_file.o: CFLAGS: = -g

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

Điều xảy ra ở đây là tất cả các tệp ".c" sẽ được biên dịch với tính năng tối ưu hóa ("-O2") ngoại trừ
"special_file.c", được biên dịch ở chế độ gỡ lỗi ("-g"). Đây là một cách thuận tiện để
chỉ định các tùy chọn biên dịch khác nhau chỉ cho một số tệp.

Các phép gán biến theo mục tiêu cụ thể như thế này chỉ áp dụng cho các hành động của quy tắc; họ
không có hiệu lực khi đánh giá các mục tiêu hoặc các phụ thuộc của quy tắc. Nếu một quy tắc
có nhiều hơn một mục tiêu, các phép gán biến cụ thể cho mục tiêu chỉ được thực hiện từ
Thành phố điện khí hóa phía tây dãy núi Rocky đầu tiên Mục tiêu. Cũng xin lưu ý rằng các biến mục tiêu cụ thể của makepp hơi khác một chút
từ GNU thực hiện ở chỗ chúng chỉ áp dụng cho quy tắc cho một tệp được đề cập và không áp dụng cho
bất kỳ người tiền nhiệm nào của nó.

Mở rộng ký tự đại diện được thực hiện trên mục tiêu, vì vậy bạn có thể làm như sau:

kiểm tra _ *. o: CFLAGS + = -DTEST

Để tương thích với GNU make, "%" có thể được sử dụng thay cho "*".

Biến Thay thế
Các quy tắc thay thế biến của Makepp tương tự như các quy tắc thay thế các biến khác, nhưng có phần
quyền lực hơn. Như mọi cách, "$ (CC)" hoặc "$ {CC}" đều đại diện cho giá trị của
CC biến. Nếu bạn cần một ký hiệu đô la theo nghĩa đen, hãy đặt một ký hiệu đô la kép ($$), như
điều này:

mục tiêu: dep1 dep2 dep3 dep4
& rm -f $ (đầu ra)
cho tệp trong $ (đầu vào); làm tệp cat $$ >> $ (đầu ra); làm xong

Ngoài ra, makepp có cú pháp "$ [VARIABLE]", cú pháp này thực hiện tương tự như cú pháp kia
hai, nhưng trước khi makepp tìm kiếm bất cứ điều gì khác. Điều này cho phép sử dụng nó cho các quy tắc hoàn chỉnh
và / hoặc điều kiện:

định nghĩa bracket_rule =
ifdef SOME_VAR
dấu ngoặc:
& echo đây là quy tắc -o $ (đầu ra)
endif
kết thúc

$ [bracket_rule]

kiểu rc thay thế

Theo mặc định, makepp sử dụng thay thế kiểu rc (được gọi như vậy vì nó được tiên phong bởi
rc vỏ). Điều này được minh họa tốt nhất bằng một ví dụ:

MODULES = abcd

mylib.a: module_dir / $ (MODULES) .o $ (OTHER_OBJECTS)
$ (CXX) $ (phụ thuộc) -o $ (mục tiêu)

Tiền tố "module_dir /" được thêm vào trước mỗi từ trong MODULES và hậu tố ".o" là
nối vào mỗi từ.

Bạn cũng có thể sử dụng thay thế kiểu rc mà không cần đặt danh sách các từ vào một
Biến đổi; cú pháp là "$ (word1 word2)". Lưu ý khoảng cách giữa dấu ngoặc đơn và dấu
từ đầu tiên. Vì vậy, ví dụ trên có thể được viết là:

mylib.a: module_dir / $ (abcd) .o $ (OTHER_OBJECTS)
$ (CXX) $ (phụ thuộc) -o $ (mục tiêu)

Một biến sẽ chỉ thay thế kiểu rc khi có nhiều hơn một từ trong đó.
Với một từ, nó giống như làm truyền thống. Than ôi, khi biến trống rỗng, có một
xung đột. Truyền thống chỉ cần mở rộng nó thành chuỗi trống. Nhưng khi bạn nghĩ về
nó như một danh sách, bạn muốn "-I $ (DIRLIST)" phân phát, không tạo ra một "-I" cô đơn. Các
giải pháp là đưa nó vào một danh sách bắt đầu bằng khoảng trắng: "-I $ ($ (DIRLIST))" cho bạn
chính xác như nhiều tùy chọn, vì có các từ trong danh sách.

Nếu bạn đặt một số biến trong cùng một từ sẽ mở rộng thành các mảng từ, rc-style
sự thay thế thực sự lấy sản phẩm cacte, vì vậy bạn có thể làm điều gì đó như thế này nếu
bạn muốn:

DIRS = s1 s2
MODULES = abc
HẬU QUẢ = .o .c
FILES: = $ (DIRS) / $ (MODULES) $ (SUFFIXES)

và FILES sẽ chứa chuỗi

s1 / ao s1 / ac s1 / bo s1 / bc s1 / co s1 / cc s2 / ao s2 / ac s2 / bo s2 / bc s2 / co s2 / cc

Bên cạnh khoảng trắng, thay thế kiểu rc dừng lại ở bất kỳ câu trích dẫn nào, bất kỳ hình tròn, hình tròn hoặc hình vuông nào
dấu ngoặc đơn và bất kỳ dấu nào trong số ",:; = # @". Lưu ý rằng điều này có thể gây ngạc nhiên và một lần nữa cần
một danh sách rõ ràng. Giả sử bạn muốn tìm kiếm các tiêu đề theo ký tự đại diện trong tất cả các thư mục
bắt đầu bằng một chữ cái viết hoa:

BAD: = [AZ] * / ** / *. $ (Hpp h) # [AZ] * / ** / *. Hpp * / ** / *. H
TỐT: = $ ([AZ] * / ** / *.) $ (Hpp h) # [AZ] * / ** / *. Hpp [AZ] * / ** / *. H

Nếu thay thế kiểu rc cản trở hoặc nếu bạn cần phải có
khoảng trắng trong biến thực hiện của bạn, sau đó bạn có thể tắt thay thế kiểu rc bằng cách cài đặt
biến "makepp_simple_concatenation = 1". Bạn có thể tắt nó trên toàn cầu bằng lệnh
dòng hoặc như một biến môi trường. Hoặc trên cơ sở mỗi makefile bằng cách đặt biến trong
makefile của bạn. Bạn nên thực hiện việc này ở gần phần trên cùng của makefile, nếu không, bạn có thể gặp phải
tình huống hài hước trong đó thay thế kiểu rc được sử dụng cho một số đánh giá chứ không phải cho những đánh giá khác.
(Tất cả các biểu thức được đánh giá trước nhiệm vụ sẽ sử dụng thay thế kiểu rc và tất cả
biểu thức được đánh giá sau sẽ không. Kể từ thời điểm đánh giá các biểu thức trong
makefiles phức tạp và không phải lúc nào cũng rõ ràng so với thứ tự của các câu lệnh trong
makefile, tốt nhất là đặt "makepp_simple_concatenation" càng sớm càng tốt.) Bạn có thể
thậm chí chỉ đặt nó cho một mục tiêu:

mục tiêu: makepp_simple_concatenation = 1
Mục tiêu:
& echo before_first $ (LIST) after_last -o $ (đầu ra)

Vì "$ [VARIABLE]" được đánh giá sớm hơn "$ (VARIABLE)", nên kết hợp cả hai trong rc-
sự thay thế sẽ không mang lại kết quả mà bạn có thể mong đợi, trừ khi bạn bọc nó trong một
danh sách:

A = ab
N = 1 2
XẤU: = $ (A) $ [N]
TỐT: = $ (A) $ ($ [N])

Những dòng cuối cùng được đọc là

BAD: = $ (A) 1 2 # a1 b1 2
TỐT: = $ (A) $ (1 2) # a1 a2 b1 b2

Thay thế dự án

Tham chiếu thay thế có dạng "$ (VAR: A = B)", trong đó A là một mẫu để khớp và B là
một mẫu để thay thế nó bằng. Tham chiếu thay thế là chữ viết tắt của
chức năng "patsubst". Ví dụ:

source_files = ac bc cc dc
object_files = $ (source_files:%. c =%. o)

sẽ đặt "$ (object_files)" thành "ao bo co do". "%" Là một ký tự đặc biệt phù hợp
bất kỳ chuỗi tùy ý. Nếu cả A và B đều bắt đầu bằng "%", một trường hợp phổ biến khi thay thế
các hậu tố, chúng có thể được bỏ qua:

object_files = $ (source_files: .c = .o)
object_files = $ (source_files: c = o) # giống nhau, bởi vì. không đặc biệt

Khoảng trắng in biến

Nếu bạn cần kiểm soát khoảng trắng trong một biến, bạn phải (hiện tại) vô hiệu hóa kiểu rc
thay thế (bằng cách đặt "makepp_simple_concatenation = 1") và sau đó sử dụng cú pháp như sau:

vô giá trị =
T = -o $ (null)

hoặc, với một đánh giá trống:

T = -o $ ()

Khi bạn làm điều này, biến "T" chứa "-o" theo sau là một khoảng trắng.

Loại kỹ thuật này để xử lý khoảng trắng không được khuyến khích. Nếu bạn cần các biến
trong makefile của bạn có chứa khoảng trắng, bạn nên suy nghĩ nghiêm túc về những gì bạn đang làm.
Nếu bạn cần xử lý khoảng trắng, thường tốt hơn nhiều nếu bạn đặt mã Perl vào
makefile để xử lý nó (sử dụng câu lệnh "perl_begin" hoặc "sub") hoặc để xử lý nó
trong các câu lệnh shell trong các hành động của quy tắc.

Những trường hợp này thường xảy ra khi mọi người cố gắng sử dụng các quy tắc giống nhau cho các
kiến trúc không sử dụng cú pháp lệnh Unix điển hình. Ví dụ, đôi khi người ta nhìn thấy
những thứ như thế này trong makefiles:

ifeq ($ (ARCH), tìm kiếm kỳ lạ)
O: = / OUTPUT =
khác
null: =
O: = -o $ (null)
endif

% .o:% .c
$ (COMPILER) $ (đầu vào) $ (O) $ (đầu ra)

Bạn có thể làm điều này với makepp nếu bạn thực sự muốn, nhưng bạn có thể sẽ thấy rằng
makefiles về cơ bản dễ đọc hơn nếu bạn có biến ít phức tạp hơn
thay thế, ví dụ,

ifeq ($ (ARCH), tìm kiếm kỳ lạ)
% .o:% .c
$ (WEIRD_COMPILER) $ (đầu vào) / OUTPUT = $ (đầu ra)
khác
% .o:% .c
$ (CC) -c $ (đầu vào) -o $ (đầu ra)
endif

Khoảng trắng không bao giờ được phép trong tên biến, chỉ trong giá trị của chúng. Cái này khác
từ một số thực hiện triển khai.

Tự động Biến
Biến tự động là những biến giả định các giá trị khác nhau tùy thuộc vào quy tắc nào
chúng được đánh giá trong. Makepp hỗ trợ hầu hết các biến tự động khác
phiên bản sử dụng. Ngoài ra, nó có ít tên khó hiểu hơn, dài hơn đối với hầu hết chúng
mà bạn có thể sử dụng thay thế. (Đối với các cấu hình kế thừa xảy ra để xác định lại những tên này,
định nghĩa trong makefile ghi đè ý nghĩa mặc định. Ví dụ, nếu bạn nói
"target = abc" trong makefile của bạn, thì "$ (target)" sẽ luôn mở rộng thành "abc" và sẽ không
còn tương đương với $ @.)

Sau đây là danh sách đầy đủ tất cả các biến tự động mà makepp hỗ trợ:

đầu ra
mục tiêu
$ @ Mục tiêu của quy tắc hiện tại. Trên thực tế, vì makepp hỗ trợ nhiều mục tiêu cho
bất kỳ quy tắc nào, đây là Thành phố điện khí hóa phía tây dãy núi Rocky đầu tiên Mục tiêu. Ví dụ, trong quy tắc sau

y.tab.c y.tab.h: parser.y
$ (YACC) -o $ (đầu ra) $ (YFLAGS) $ (đầu vào)

"$ (đầu ra)" sẽ chứa giá trị y.tab.c. Vì những biến số ma thuật này trên thực tế là
, bạn cũng có thể chuyển một chỉ mục làm đối số. Điều này được tính từ 1 trở lên
từ 1. Vì vậy, "$ (đầu ra 2)" hoặc "$ (đầu ra -1)" sẽ chứa giá trị y.tab.h.

Mặc dù cả ba dạng của biến này đều có cùng giá trị, nhưng có sự khác biệt về
giải thích cho các quy tắc đa mục tiêu. Nếu bạn sử dụng tên khó hiểu kiểu cũ $ @,
makepp sẽ giải thích đó là một bộ quy tắc kiểu cũ, thay vì một quy tắc hiện đại
tạo ra tất cả các mục tiêu đó trong một lần:

ab: # thực sự: mỗi quy tắc cho a và b
chạm vào $ @

cd: # error: mpp phàn nàn rằng điều này không xây dựng d
chạm vào $ (đầu ra)

kết quả đầu ra
mục tiêu
Tất cả các mục tiêu của quy tắc hiện tại. Giống như "$ (target)" trừ khi có nhiều hơn một
Mục tiêu. Trong ví dụ trên, "$ (outputs)" sẽ là y.tab.c y.tab.h. Bạn có thể vượt qua một
danh sách chỉ mục, vì vậy "$ (kết quả đầu ra 2 1)" sẽ là y.tab.h y.tab.c.

phụ thuộc
đầu vào
$ <Phụ thuộc rõ ràng đầu tiên của quy tắc. Ví dụ, trong quy tắc này

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

"$ (input)" sẽ là tên của .c tệp, bất kể cái gì .h tệp makepp
khám phá. Nếu bạn chỉ định nhiều hơn một phần phụ thuộc, bạn có thể lấy chúng bằng cách chuyển
index: "$ (input $ (INDEX))" là phụ thuộc INDEXth.

phụ thuộc
đầu vào
$ ^ Tất cả các phụ thuộc rõ ràng của đích, không bao gồm .h các tập tin được phát hiện bởi
makepp_scanning cho bao gồm.

Ví dụ, trong quy tắc

myprog.o: * .o
$ (CC) $ (CFLAGS) $ (đầu vào) -o $ (đầu ra)

"$ (input)" sẽ là tất cả các tệp .o trong thư mục. Bạn chỉ có thể chọn những người bạn
muốn bằng cách chuyển một danh sách chỉ mục. Nếu bạn chỉ định rõ ràng các loại tệp khác nhau,
bạn có thể chọn chúng như trong "$ (đầu vào 2 3 4)" (nhưng với ký tự đại diện, điều này không quá
hứa hẹn).

được sắp xếp_phụ thuộc
đã sắp xếp_inputs
$ + Tất cả các phần phụ thuộc của mục tiêu, theo thứ tự được sắp xếp, với các phần trùng lặp đã bị loại bỏ.
Tương đương với "$ (sắp xếp $ (đầu vào))".

Thay đổi_phụ thuộc
change_inputs
$? Các phụ thuộc của mục tiêu đã thay đổi. Điều này chỉ bao gồm rõ ràng
các phụ thuộc (tức là những phụ thuộc bạn liệt kê trong makefile), không được phát hiện ngầm
phụ thuộc từ quá trình quét (chẳng hạn như tệp .h).

Điều này thường được sử dụng trong các lệnh như sau:

libmine.a: $ (MODULES): build_check ignore_action
$ (AR) ru $ @ $?

I E, ar được yêu cầu chỉ thay thế những mô-đun đã thay đổi. (Lưu ý
quy tắc kiểm tra xây dựng "ignore_action". Nếu bạn không chỉ định điều này, makepp sẽ buộc
hành động được thực hiện bất cứ khi nào nó thay đổi. Nếu không có phụ thuộc nào thay đổi,
chuỗi hành động sẽ là "ar ru libmine.a" có thể khác với chuỗi hành động
lần trước bạn đã chạy nó, vì vậy nếu không có "ignore_action" thì makepp sẽ thực thi nó. Trong này
trường hợp này vô hại, nhưng với các lệnh khác, nó có thể là một vấn đề. Nhìn thấy
makepp_build_check để biết chi tiết về "ignore_action".)

Xây dựng các kho lưu trữ như thế này không phải là một ý tưởng hay vì nó sẽ làm cho các bản dựng của bạn ít hơn
đáng tin cậy. Vấn đề với điều này là nếu bạn xây dựng kho lưu trữ, thì hãy xóa một trong số
các mô-đun từ danh sách CÁC CHẾ ĐỘ, các mô-đun sẽ vẫn ở trong kho lưu trữ và
trang điểm

thân cây
$ * Giá trị gốc trong một quy tắc mẫu (tức là bất kể '%' nào được khớp). Ngoài ra, nếu điều này
không phải là một quy tắc mẫu, trả về tên tệp mà không có phần mở rộng (tức là
tương đương với "$ (basename $ (input))".

Điều này chủ yếu là để tương thích ngược. Ví dụ: trong các phiên bản cũ của
cách duy nhất để cho nó biết làm thế nào để biên dịch bất kỳ .c tập tin vào tương ứng .o tập tin giống như
điều này:

.co:
$ (CC) $ (CFLAGS) -c $ *. C -o $ *. O

Đây là một cách tệ hại để viết quy tắc. Rõ ràng hơn nhiều khi sử dụng kiểu GNU-make
quy tắc mẫu, như thế này:

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

cho mỗi
Tên tệp hiện tại từ mệnh đề "foreach". mệnh đề "foreach" hiếm khi được sử dụng,
nhưng chúng là loại quy tắc mẫu có mục đích chung nhất mà makepp hỗ trợ. Vì
thí dụ,

#
# Tạo tệp .c với một số loại bộ tiền xử lý đặc biệt:
#
% .c:% .k
$ (bộ tiền xử lý) $ (đầu vào)> $ (đầu ra)

#
# Biên dịch tệp .c thành tệp .o:
#
% .o:% .c
$ (CC) $ (CFLAGS) -c $ (đầu vào) -o $ (đầu ra)

#
# Cờ biên dịch thay thế đặc biệt cho các tệp .c được dẫn xuất
# từ tệp .k:
#
$ (foreach:%. k =%. o): $ (foreach:%. k =%. c): foreach * .k
$ (CC) $ (ĐẶC BIỆT_K_FLAGS) -c $ (đầu vào) -o $ (đầu ra)

Xem tài liệu về điều khoản foreach trong các quy tắc để biết thêm chi tiết và ví dụ.

$ / Về cơ bản, đây là một hằng số, "/" hoặc trên Windows gốc "\". Bạn cần nó, nếu
bạn muốn khởi động chương trình một cách di động, ví dụ như chương trình bạn đã tạo trong thư mục hiện tại:

đầu ra của tôi:
. $ / myprog> $ (đầu ra)

Đối với tên tệp được truyền dưới dạng đối số, nó không quá cần thiết vì Windows có thể xử lý Unix
cú pháp ở đó.

Tùy chọn Biến
Bạn có thể đặt những điều này theo tất cả các cách được giải thích ở trên (trừ khi được nêu khác) để sửa đổi
bahaviour của makepp. Theo mặc định, tất cả chúng đều không xác định.

MAKEPP_DEBUG
Nếu bạn xuất giá trị này với giá trị true trước khi gọi makepp, bạn sẽ gỡ lỗi nhiều hơn
thông tin. Đây là "RULE_SOURCE" của các tệp được tạo trong khi điều này có hiệu lực trong
makeppinfo, mppi và thông tin chi tiết về mở rộng biến và đối sánh quy tắc trong
makepplog, mppl. Điều này cũng sẽ hiển thị cho bạn nếu makepp hết bộ nhớ hoặc bị treo,
bởi vì nó không ngừng mở rộng các biến giống nhau:

A = $ A # đánh giá hoãn lại, cần: =
B = $ C
C = $ B

MAKEPP_LN_CP
Xem ghi chú dưới & ln.

makepp_percent_subdirs
Đặt giá trị này thành một số giá trị true (như 1) để có "%" trong mục tiêu hoặc phần phụ thuộc khớp
trên nhiều thư mục.

makepp_require_phony
Đặt giá trị này thành một giá trị thực nào đó (như 1) để ngăn chặn sự giả mạo tiềm ẩn (tức là nếu một quy tắc
thành công mà không đạt được mục tiêu của nó). Biến này phải đúng theo mặc định, thành
ngăn chặn các chuỗi phụ thuộc bị hỏng, nhưng điều đó sẽ phá vỡ khả năng tương thích ngược với
trang điểm cẩu thả.

makepp_signature_C_flat
Đây là một tùy chọn để ký tên C. Đặt giá trị này thành một giá trị thực nào đó (như 1) để xử lý
nguồn dưới dạng phẳng, tức là tất cả các dòng mới (ngoại trừ xung quanh các câu lệnh tiền xử lý) đều
được xử lý như khoảng trắng và chỉ thị "#line" bị bỏ qua.

makepp_simple_concatenation
Đặt giá trị này thành một số giá trị true (như 1) để ngăn "thay thế kiểu rc".

Ngọc trai
Bạn có thể đặt điều này thành perl chính xác mà bạn đang sử dụng để chạy các tập lệnh trong makepp
và xuất nó. Điều này có thể giúp chạy các tập lệnh con với cùng một perl. Đây là
hầu hết hữu ích cho bộ thử nghiệm, cài đặt và cho các bản dựng đệ quy.

VPATH
Đặt biến này thành một số giá trị sẽ gọi ngầm là "vpath% value".

Được xác định trước Biến
Makepp xác định trước một số biến mà bạn có thể ghi đè:

AR Mặc định: "ar".

ARLAGS
Mặc định: "rv".

AS Mặc định: "như".

CC Mặc định: Đầu tiên được tìm thấy trong số "gcc", "egcc", "pgcc", "c89" hoặc "cc" hoặc trên Windows
bổ sung "cl" hoặc "bcc32".

CỜ
Mặc định: Nếu "$ (CC)" là trình biên dịch GNU "-g -Wall", nếu nó là một trong hai Windows
trình biên dịch không có gì, khác "-g".

CUỘN
Thư mục chứa Makefile hiện tại.

CXX Mặc định: Đầu tiên được tìm thấy trong số "g ++", "c ++", "pg ++", "cxx", "C" "C" hoặc "aCC" hoặc trên
Windows bổ sung "cl" hoặc "bcc32".

CXXFLAG
Mặc định: Nếu "$ (CXX)" là trình biên dịch GNU "-g -Wall", nếu nó là một trong hai Windows
trình biên dịch không có gì, khác "-g".

F77 Mặc định: Đầu tiên được tìm thấy trong số "f77", "g77" hoặc "fort77".

FC Mặc định: "$ (F77)".

LD Mặc định: "ld".

LEX Mặc định: Đầu tiên được tìm thấy trong số "lex" hoặc "flex".

LIBTOOL
Mặc định: "libtool".

MAKE
Biến này có hai giá trị khác nhau, tùy thuộc vào sự hiện diện hay không của
"--traditional-recursive-make". Makepp nhận ra khi nào biến này được sử dụng và
tắt một số tính năng, ngay cả trước khi quá trình đệ quy thực sự diễn ra. Điều này có thể là
không mong muốn trong khi bạn đang dần loại bỏ nó, vì vậy trước tiên hãy chuyển đổi các lệnh gọi thành
makepp cụ thể "$ ((MAKE))", sẽ không tắt các tính năng. Bạn không nên đặt nó
bởi vì điều đó phá vỡ công việc đệ quy thông minh của chúng tôi xung quanh.

KIẾM MỤC TIÊU
Biến này được đặt nhưng không được makepp sử dụng. Bạn có thể truy vấn nó để làm điều gì đó chỉ khi
một mục tiêu nhất định đã được yêu cầu.

Mặc định: Bất kỳ mục tiêu rõ ràng nào mà người dùng (hoặc một lời gọi đệ quy) cung cấp.
Rỗng khi hoàn toàn xây dựng mục tiêu mặc định.

ifneq $ (lọc mục tiêu đặc biệt, $ (MAKECMDGOALS))
# mục tiêu đặc biệt là một trong những mục tiêu rõ ràng hiện tại
khác ifeq $ (MAKECMDGOALS)
# không có mục tiêu rõ ràng
endif

MAKEFLAGS (đã xuất)
Các tùy chọn tiêu chuẩn mà makepp được gọi. Những người có một chữ cái duy nhất
biểu mẫu được kết hợp ở đầu mà không có "-" ở đầu (có trời mới biết tại sao gmake lại chọn
để bỏ dấu "-").

THÔNG TIN
Mặc định: "makeinfo".

MAKEPPFLAGS (đã xuất)
Điều này được đặt thành cùng một giá trị với MAKEFLAGS, nhưng chỉ khi biến này có trong
môi trường của makepp.

_MAKEPPFLAGS (đã xuất)
Các tùy chọn cụ thể cho makepp cần thiết để tương thích với POSIX / gmake, với makepp
được gọi là. Các biến này nằm trong một biến riêng biệt nên makefile kế thừa không thể phá vỡ
khả năng tương thích bằng cách bỏ đặt MAKEFLAGS. Điều này chỉ được đặt với
"--traditional-recursive-make".

MAKEPP_VERSION
Phiên bản makepp mà bạn đang chạy. Nếu là phiên bản beta, nó sẽ có
dấu gạch nối theo sau là YYMMDD cộng với một số dữ liệu nội bộ khác. Bạn có thể sử dụng cái này cho "ifdef"
để ẩn các cấu trúc cụ thể của makepp khỏi các cấu tạo khác.

Mặc định: Cùng một giá trị được hiển thị bởi "makepp --version"

NKT Một bí danh cho "CURDIR".

RM Mặc định: "rm -f". Điều này có nghĩa là cho các Makefiles kế thừa. Đối với những cái mới tốt hơn là sử dụng
trực tiếp lệnh nội trang & rm. Nếu bạn muốn viết một quy tắc rõ ràng giả mạo, hãy xem
thay vào đó, lệnh "makeppclean -r".

ROOT
Đường dẫn liên quan đến thư mục gốc của hệ thống xây dựng của bạn, tức là thư mục tiếp tục lên trong
mà bạn có "RootMakeppfile (.mk)". Nếu bạn không có, biến này là
trống.

SHELL
Biến này chỉ được tôn trọng nếu bạn "xuất" nó. Trong trường hợp đó, nó là Shell
được sử dụng để thực thi các hành động không có sẵn với một số ký tự đặc biệt trong đó (đơn giản
những cái đang được thực thi trực tiếp). Trên Windows Strawberry hoặc ActiveState Perl, nếu bạn có
một Shell giống Unix, thay vào đó bạn phải đặt biến SHELL của mình thành giá trị kết thúc bằng "sh"
hoặc "sh.exe" trước gọi makepp.

Mặc định: Tìm thấy đầu tiên trong số "/ usr / xpg4 / bin / sh" (ví dụ: Solaris) hoặc "/ sbin / xpg4 / sh"
(ví dụ: Trustant Unix) hoặc "/ Bin / sh".

YACC
Mặc định: Con đầu tiên được tìm thấy trong số "bison -y" hoặc "yacc".

Biến Perl
Các giá trị biến được lưu trữ dưới dạng các đại lượng vô hướng Perl thông thường, vì vậy bạn có thể truy cập chúng trực tiếp từ
Mã Perl nếu bạn cần thực hiện bất kỳ thao tác phức tạp nào với chúng; xem makepp_exosystem
để biết thêm chi tiết.

Việc truy cập các biến toàn cục từ Perl có thể đạt được bằng cách đặt tiền tố cho chúng bằng "Mpp :: global"
Bưu kiện. Trên thực tế, bất kỳ biến nào, chưa có trong makefile hiện tại và bạn
gán cho trong gói này từ đó sẽ là toàn cầu, như thể bạn vừa phát hành
tuyên bố "toàn cầu" cho nó.

Tuy nhiên, quyền truy cập trực tiếp này rất dễ xảy ra lỗi! Người dùng có thể đã ghi đè các biến này
trên dòng lệnh hoặc thông qua môi trường. Một số tệp makefile khác đã được tải trước đó
người ta có thể đã làm cho biến toàn cầu hoặc mục tiêu cụ thể. Trong những trường hợp này, bạn sẽ không
tìm giá trị của biến hoặc khi gán nó, có thể lấy đi thuộc tính của nó
(tương đương với công cụ sửa đổi "ghi đè", ngoại trừ các chi tiết cụ thể về mục tiêu.)

Với quyền truy cập trực tiếp, bạn cũng bỏ qua việc mở rộng các biến này, nếu chúng thuộc loại
"=" hoặc "; =". Các biến đặc biệt như "$ (CC)" bắt đầu dưới dạng các hàm, cho đến khi chúng
phân công. Vì vậy, trong nhiều trường hợp bạn sẽ không thấy giá trị của chúng.

Vì những lý do này, tốt hơn là để makepp xác định giá trị chính xác. Bạn có thể dùng
biến thể "makeperl", trong đó biến đã được đánh giá trước khi mã Perl nhận được
diễn giải:

makeperl {$$ current_value = '$ (MAKEFILE_VAR)'}

Nếu bạn cần một biến trong khối makefile perl, điều này đạt được thông qua biến Perl
$ makefile như sau:

perl {$ current_value = $ makefile-> expand_variable ('MAKE_VAR')}

Các hàm luôn nhận đối tượng makefile được truyền vào dưới dạng đối số thứ hai $ _ [1]:

sub f_f {$ current_value = $ _ [1] -> expand_variable ('MAKE_VAR')}

Các lệnh phải được gọi trong một hành động quy tắc, trong đó đối tượng makefile là
có thể truy cập qua "$ Mpp :: Subs :: rule -> {MAKEFILE}":

sub c_cmd {$ current_value = $ Mpp :: Subs :: rule -> {MAKEFILE} -> expand_variable ('MAKE_VAR')}

Sử dụng makepp_variables 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
    sạch sâu
    sạch sâu
    Một tập lệnh Kotlin kích hoạt tất cả các bản dựng
    cache từ các dự án Gradle/Android.
    Hữu ích khi Gradle hoặc IDE cho phép bạn
    xuống. Kịch bản đã được thử nghiệm trên
    macOS, nhưng ...
    Tải xuống sạch sâu
  • 2
    Trình cắm kiểu kiểm tra Eclipse
    Trình cắm kiểu kiểm tra Eclipse
    Trình cắm thêm Eclipse Checkstyle
    tích hợp mã Checkstyle Java
    đánh giá viên vào IDE Eclipse. Các
    plug-in cung cấp phản hồi theo thời gian thực để
    người dùng về vi phạm ...
    Tải xuống Trình cắm kiểu kiểm tra Eclipse
  • 3
    AstrOrzNgười Chơi
    AstrOrzNgười Chơi
    AstrOrz Player là trình phát đa phương tiện miễn phí
    phần mềm, một phần dựa trên WMP và VLC. Các
    người chơi theo phong cách tối giản, với
    hơn mười màu chủ đề và cũng có thể
    b ...
    Tải xuống AstrOrzPlayer
  • 4
    phim trường
    phim trường
    Kodi Movistar+ TV là một ADDON cho XBMC/
    Kodi que allowe disponer de un
    bộ giải mã dịch vụ IPTV
    Tích hợp Movistar en uno de los
    trung tâm truyền thông ...
    Tải phimstartv
  • 5
    Mã :: Khối
    Mã :: Khối
    Code::Blocks là mã nguồn mở, miễn phí,
    đa nền tảng C, C++ và Fortran IDE
    được xây dựng để đáp ứng những nhu cầu khắt khe nhất
    của người dùng của nó. Nó được thiết kế rất
    mở rộng ...
    Tải xuống mã::Khối
  • 6
    Ở giữa
    Ở giữa
    Giao diện Minecraft giữa hoặc nâng cao
    và Theo dõi Dữ liệu / Cấu trúc là một công cụ để
    hiển thị tổng quan về Minecraft
    thế giới mà không thực sự tạo ra nó. Nó
    có thể ...
    Tải về giữa
  • Khác »

Lệnh Linux

Ad