Nó thực sự đang thực thi lệnh, thay đổi thư mục thành some_directory
, tuy nhiên, điều này được thực hiện trong trình bao quy trình phụ và ảnh hưởng đến cả trình tạo mà bạn không làm việc.
Nếu bạn đang tìm cách thực hiện nhiều tác vụ bên trong some_directory
, bạn cần thêm dấu chấm phẩy và nối thêm các lệnh khác. Lưu ý rằng bạn không thể sử dụng các dòng mới vì chúng được giải thích bằng cách kết thúc quy tắc, do đó, bất kỳ dòng mới nào bạn sử dụng cho sự rõ ràng cần phải được thoát khỏi dấu gạch chéo ngược.
Ví dụ:
all:
cd some_dir; echo "I'm in some_dir"; \
gcc -Wall -o myTest myTest.c
Cũng lưu ý rằng dấu chấm phẩy là cần thiết giữa mỗi lệnh mặc dù bạn thêm dấu gạch chéo ngược và dòng mới. Điều này là do thực tế là toàn bộ chuỗi được phân tách thành một dòng duy nhất bởi shell. Như đã lưu ý trong các nhận xét, bạn nên sử dụng '&&' để tham gia các lệnh, có nghĩa là chúng chỉ được thực thi nếu lệnh trước thành công.
all:
cd some_dir && echo "I'm in some_dir" && \
gcc -Wall -o myTest myTest.c
Điều này đặc biệt quan trọng khi thực hiện công việc phá hoại, chẳng hạn như dọn dẹp, vì nếu không bạn sẽ phá hủy những thứ sai, nếu cd
thất bại vì bất kỳ lý do gì.
Một cách sử dụng phổ biến là gọi make trong thư mục con mà bạn có thể muốn xem xét. Có một tùy chọn dòng lệnh cho việc này để bạn không phải tự gọi cd
mình, vì vậy quy tắc của bạn sẽ giống như thế này
all:
$(MAKE) -C some_dir all
sẽ thay đổi some_dir
và thực hiện Makefile
trong đó với mục tiêu "tất cả". Cách tốt nhất là sử dụng $(MAKE)
thay vì gọi make
trực tiếp, vì sẽ cẩn thận khi gọi đúng phiên bản tạo (ví dụ: nếu bạn sử dụng phiên bản tạo đặc biệt cho môi trường xây dựng của bạn), cũng như cung cấp hành vi hơi khác khi chạy sử dụng một số công tắc, chẳng hạn như -t
.
Đối với bản ghi, hãy luôn tạo ra tiếng vang cho lệnh mà nó thực thi (trừ khi bị triệt tiêu rõ ràng), ngay cả khi nó không có đầu ra, đó là những gì bạn đang thấy.
make
, tôi không bao giờ muốn thay đổi thư mục như thế này. Có lẽ bạn nên thử một cách tiếp cận khác cho giải pháp của bạn?