Chạy file script chứa đoạn make

Em mới tiếp xúc với makefile gặp case này mong các bác hỗ trợ. Em có cây thư mục kiểu này.

 ~/project  tree
.
├── ma
│   └── tests
│       └── Makefile
├── Makefile
└── script.sh

Em đang trong thư mục ~/project có file bash script script.sh, em cần chạy script này và file script này có chứa đoạn mã

# trong script.sh
make test_1 test_2

Makefile của em trong ~/project lại chứa đoạn mã kiểu

.PHONY test_1
test_1:
   $(MAKE) -C ma/tests [email protected]
.PHONY test_2
test_2:
  $(MAKE) -C ma/tests [email protected]

Makefile của em trong ~/project/ma.tests lại chứa đoạn mã kiểu

.PHONY: test_1
test_1:
	sh script_1.sh

.PHONY: test_2
test_2:
	sh script_2.sh

Em có một số thắc mắc sau:

  1. Có phải khi em chạy script.sh nó sẽ chạy Makefile bên ngoài rồi truy cập Makefile bên trong đúng không?
  2. .PHONY để làm gì ạ?
  3. $(MAKE) là gì ạ và khi gọi $(MAKE) -C ma/tests [email protected] nó sẽ làm gì

Em cám ơn mn.

em vào đây đọc nha :V https://www.gnu.org/software/make/manual/html_node/index.html#SEC_Contents

anh trả lời sơ sơ trước, em đọc kĩ hơn trong cái link kia :V

  1. ờm, vì flag -C sẽ chuyển thư mục hiện tại mà chương trình $(MAKE) đang chạy tới ma/tests, [email protected] là tên của target hiện tại là test_1 (hay test_2 cho câu lệnh dưới), nên cả câu lệnh có thể hiểu là cd ma/tests && $(MAKE) test_1

  2. .PHONY: bình thường target trong Make là tên của 1 file nào đó cần theo dõi. Phony target là target ko phải là tên của 1 file nào mà là 1 cái tên lệnh thôi :V Gọi make test_1 thì nếu test_1 ko lệ thuộc 1 file nào, mà bên ngoài có 1 file tên là test_1 rồi thì nó sẽ ko làm gì hết vì file test_1 này đã up-to-date :V Nếu cho test_1 là phony thì mặc cho có file test_1 tồn tại make vẫn chạy mấy dòng lệnh bên dưới

  3. $(MAKE) là để gọi đúng chương trình make ở top level :V ví dụ gọi /usr/local/bin/make test_1, được make nó dịch thành cd ma/tests && make test_1 (ko gọi $(MAKE) mà xài thẳng make) thì lỡ có install 1 version make khác ở ví dụ /bin/make nó lại gọi ko đúng chương trình usr/local/bin/make ban đầu mà gọi /bin/make thì mỗi thằng make nó track file ko giống nhau ko đồng bộ :V Xài $(MAKE) thì nó sẽ gọi đúng chương trình make ban đầu, ví dụ ở đây là /usr/local/bin/make

4 Likes

Cảm ơn bác rất nhiều. Em đọc trên mạng chưa hiểu lắm nhưng đọc comments của bác em đã rõ hơn.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?