Ký tự đại diện và Foreach trong Makefile

Ky Tu Dai Dien Va Foreach Trong Makefile



Một tệp luôn được tạo thành từ một loại nội dung khác nhau: cho dù đó là tệp văn bản đơn giản, tệp mã chương trình hay bất kỳ tệp tạo tệp nào. Loại nội dung của bất kỳ tệp nào làm cho nó trở nên độc đáo và khác biệt với định dạng tệp khác. Giống như vậy, makefile bao gồm các quy tắc sử dụng các phần tử khác nhau để thực hiện công việc của nó một cách chính xác. Từ những phần tử đó, có ký tự đại diện và foreach được yêu cầu để thực hiện điều gì đó độc đáo và bổ sung. Trong hướng dẫn này, chúng ta sẽ thảo luận về sức mạnh của ký tự đại diện và foreach khi chúng được sử dụng trong tệp tạo tệp.

Ký tự đại diện trong Makefile

Nhìn chung, ký tự đại diện được biết đến là một yếu tố không thể đoán trước và có thể xoay chuyển tình thế theo bất kỳ cách nào có thể. Các ký tự đại diện trong tệp tạo tệp được sử dụng để thực hiện phần thưởng phát hiện tất cả các mẫu có thể có từ thư mục làm việc hiện tại, cho dù đó là tệp hay bất kỳ thư mục nào. Các tệp nguồn này có thể thuộc bất kỳ loại nào.







Để sử dụng ký tự đại diện trong tệp tạo tệp, bạn nên sử dụng từ khóa “ký tự đại diện” theo sau dấu hoa thị “*” hoặc “?” sign và phần mở rộng tệp được kết nối thông qua dấu chấm. Bạn cũng có thể sử dụng dấu “?” dấu để tìm kiếm một ký tự đơn và “*” để khớp với bất kỳ số lượng ký tự nào. Toàn bộ cấu trúc này nên được sử dụng trong dấu ngoặc đơn và ký hiệu “$”. Ví dụ: chúng tôi khai báo biến “SRCS” nhận tệp giá trị của nó thông qua ký tự đại diện. Ký tự đại diện này tìm kiếm tất cả các tệp có mẫu “cpp” ở cuối.





Tìm hiểu trong Makefile

Hàm foreach của makefile hoạt động chính xác giống như vòng lặp foreach trong ngôn ngữ lập trình – lặp qua các mục trong danh sách. Hàm foreach trong makefile thực hiện một hành động cụ thể trên từng mục của danh sách. Phần tử này có thể là một biến hoặc bất kỳ tệp nguồn nào. Ví dụ: chúng tôi xây dựng cú pháp của hàm foreach trong makefile thông qua biến SOURCES chứa danh sách ba tệp nguồn. Hàm foreach sử dụng biến SOURCES này để tạo cùng tên cho ba tệp đối tượng bằng cách lặp lại danh sách các tệp nguồn và lưu chúng vào một biến “ĐỐI TƯỢNG” khác. Hai dòng cuối cùng cho thấy cách sử dụng quy tắc makefile để tạo tệp đối tượng cho mỗi tệp C sau khi lặp.





NGUỒN:= file1.c file2.c file3.c
ĐỐI TƯỢNG := $ ( tìm hiểu src,$ ( NGUỒN ) ,$ ( src:.c=.o ) )
$ĐỐI TƯỢNG : % .O: % .c
$ ( CC ) $ ( CFLAGS ) -c $ < -O $ @

Ví dụ 1: Sử dụng ký tự đại diện

Để hiển thị hình minh họa và hoạt động của các ký tự đại diện và hàm foreach, chúng tôi giới thiệu tệp C++. Tệp “salary.cpp” này được bắt đầu bằng việc sử dụng tiêu đề “iostream” để cho phép sử dụng trơn tru các luồng đầu vào và đầu ra. Phương thức chính khai báo một biến “s” có kiểu số nguyên và câu lệnh “cout” để yêu cầu giá trị đầu vào khi chạy. Luồng đầu vào tiêu chuẩn “cin” nhận giá trị từ người dùng trong thời gian chạy và lưu giá trị đó vào biến “s”. “cout” hiển thị giá trị được người dùng nhập vào trên màn hình bảng điều khiển.

#include
sử dụng không gian tên std;
int chính ( ) {
int s;
cout << 'Nhập mức lương:' ;
Ăn >> S;
cout << ' \N Lương: ' << S << cuối cùng;
trở lại 0 ;
}



Chúng tôi bắt đầu tạo tệp thực hiện với biến “CXX” xác định trình biên dịch cho C++ và biến CXXFLAGS giữ các cờ cho trình biên dịch C++. Biến EXECUTABLE chứa tên của tệp “hello” thực thi được tạo sau khi thực thi tệp makefile. Biến SRCS lấy tất cả các tệp C++ từ thư mục hiện tại bằng cách sử dụng ký tự đại diện “*” để tìm kiếm bất kỳ mẫu nào kết thúc bằng “.cpp”. Biến OBJS chứa tên của các tệp đối tượng sẽ được tạo bằng biến SRCS, thay thế phần mở rộng “cpp” bằng “o”. Mục tiêu “tất cả” mặc định xây dựng tệp thực hiện và nó phụ thuộc vào biến EXECUTABLE.

Quy tắc đầu tiên tạo tệp “xin chào” mục tiêu phụ thuộc vào tệp đối tượng biến OBJS (tên của tệp đối tượng) bằng cách sử dụng tên tệp được tạo thông qua biến “OBJS”. Quy tắc makefile thứ hai tạo tệp đối tượng có phần mở rộng “.o” phụ thuộc vào tệp C++ sau khi biên dịch tệp mã C++. Ở đây, “%” là ký tự đại diện để tìm kiếm tên tệp của bất kỳ mẫu nào kết thúc bằng “cpp”. Cuối cùng, mục tiêu sạch sẽ sử dụng lệnh “rm” của nó để làm sạch mạnh mẽ các tệp đối tượng và thực thi mới được tạo ra khỏi một thư mục bằng cách sử dụng cờ “-f”.

CXX = g++
CXXFLAGS = -Tường -std =c++ mười một
CÓ THỂ THỰC HIỆN = xin chào
SRCS = $ ( ký tự đại diện * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
tất cả: $ ( CÓ THỂ THỰC HIỆN )
$ ( CÓ THỂ THỰC HIỆN ) : $ ( OBJS )
$ ( CXX ) $ ( CXXCỜ ) -O $ @ $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXCỜ ) -c $ < -O $ @
lau dọn:
rm -f $ ( CÓ THỂ THỰC HIỆN ) $ ( OBJS )

Khi chạy lệnh “make”, cả tệp đích và tệp đối tượng đều được tạo. Sau khi thực thi tệp “xin chào” thực thi, người dùng được yêu cầu nhập mức lương và chúng tôi thêm “67000”. Cuối cùng, mức lương được hiển thị trở lại.

làm

Ví dụ 2: Sử dụng Foreach

Sau khi sử dụng ký tự đại diện, đã đến lúc sử dụng hàm foreach trong makefile. Phần còn lại của mã makefile là như nhau. Ở dòng 6, chúng ta khởi tạo một biến khác là “NAMES” với danh sách ba giá trị – Kate, Kim, Tim. Mục tiêu “tất cả” mặc định phụ thuộc vào biến EXECUTABLE (tên tệp mục tiêu “hello”) và câu lệnh foreach. Hàm “addprefix” lặp lại biến “NAMES” để tự động tạo tên mục tiêu bằng cách thêm tiền tố “run_” vào đầu mỗi tên trong danh sách “NAMES”.

Quy tắc ở dòng thứ tám chỉ ra rằng tệp mục tiêu thực thi đầu ra, tức là xin chào, phụ thuộc vào “OBJS”. Cờ “-o” tạo tệp đầu ra đích bằng OBJS. Quy tắc ở dòng thứ mười tạo tệp đối tượng đích bằng cách sử dụng tệp nguồn có phần mở rộng “cpp”. Để làm như vậy, cờ “-c” được sử dụng để biên dịch tệp nguồn và tạo tệp đối tượng liên quan cần thiết cho việc tạo mục tiêu. Ở dòng thứ mười ba, chúng tôi sử dụng biến EXECUTABLE để tạo đầu ra với các tên khác nhau bắt đầu bằng “run_” làm tiền tố. Cuối cùng, mục tiêu sạch và mục tiêu giả mạo sẽ loại bỏ và làm sạch các tệp đối tượng và mục tiêu.

CXX = g++
CXXFLAGS = -Tường -std =c++ mười một
# tập tin mục tiêu có thể thực thi được
CÓ THỂ THỰC HIỆN = xin chào
SRCS = $ ( ký tự đại diện * .cpp )
OBJS = $ ( SRCS:.cpp=.o )
# Danh sách tên
TÊN = Kate Kim Tim
# mục tiêu
tất cả: $ ( CÓ THỂ THỰC HIỆN ) $ ( thêm tiền tố run_, $ ( TÊN ) )
$ ( CÓ THỂ THỰC HIỆN ) : $ ( OBJS )
$ ( CXX ) $ ( CXXCỜ ) -O $ @ $ ( OBJS )
% .O: % .cpp
$ ( CXX ) $ ( CXXCỜ ) -c $ < -O $ @
# Tạo mục tiêu cho từng tên
chạy_ % : $ ( CÓ THỂ THỰC HIỆN )
. / $ ( CÓ THỂ THỰC HIỆN ) $*
lau dọn:
rm -f $ ( CÓ THỂ THỰC HIỆN ) $ ( OBJS )
# mục tiêu giả mạo
.PHONY: tất cả đều sạch sẽ

Việc sử dụng lệnh “make” sẽ tạo ra mục tiêu “hello” có thể thực thi được và chạy chương trình cho từng tên được chỉ định trong biến “NAMES”.

làm

Bạn cũng có thể sửa đổi đầu ra của mình bằng cách sử dụng tên từ danh sách có tiền tố “run_”.

Hãy chạy_Kim

Phần kết luận

Hướng dẫn này đã thảo luận về việc sử dụng các ký tự đại diện và khái niệm foreach trong tệp tạo tệp trong khi thảo luận riêng về cú pháp của chúng. Sau đó, chúng tôi đã thảo luận về các ví dụ mã để giải thích chi tiết về từng cách làm việc của chúng với kết quả đầu ra là lấy các tệp có cùng phần mở rộng và lặp lại các giá trị trong danh sách biến.