2014-10-15 13 views
14

Tôi đã xem How to manually call another target from a make target?, nhưng câu hỏi của tôi hơi khác một chút; xem xét ví dụ này (lưu ý, stackoverflow.com thay đổi các tab để khoảng trống trong màn hình, nhưng các tab được bảo quản trong nguồn, nếu bạn cố gắng chỉnh sửa):Thay đổi biến số và gọi một quy tắc khác, từ một công thức trong cùng một Makefile?

TEXENGINE=pdflatex 

pdflatex: 
    echo the engine is $(TEXENGINE) 

lualatex: 
    TEXENGINE=lualatex 
    echo Here I want to call the pdflatex rule, to check $(TEXENGINE) there! 

Ở đây, nếu tôi chạy target mặc định (pdflatex), tôi nhận được đầu ra mong đợi:

$ make pdflatex 
echo the engine is pdflatex 
the engine is pdflatex 

Nhưng, với mục tiêu lualatex, tôi muốn:

  • thay đổi các make biến TEXENGINE để lualatex và sau đó
  • gọi cùng mã như trong pdflatex (sử dụng nó).

Tôi làm cách nào để làm điều đó?

Rõ ràng, trong quy tắc lualatex của tôi, tôi thậm chí không quản lý để thay đổi biến TEXENGINE, bởi vì tôi có được điều này khi tôi thử nó:

$ make lualatex 
TEXENGINE=lualatex 
echo Here I want to call the pdflatex rule, to check pdflatex there! 
Here I want to call the pdflatex rule, to check pdflatex there! 

... vì vậy tôi thực sự muốn biết nếu có điều gì như thế này là có thể trong Makefiles.

+1

Đối với một sự khởi đầu, tôi sẽ không gọi đó là mục tiêu 'pdflatex', nếu bạn đang sử dụng nó để kiểm tra thứ tùy ý. Tôi muốn đề nghị một cái gì đó như 'checkEngine', và làm cho nó' .PHONY'. –

+0

Cảm ơn, @OliverCharlesworth - Tôi nghĩ rằng đó là tốt, bởi vì 'pdflatex' trong trường hợp sử dụng này là mặc định, và vì vậy tôi nhận được kết quả tương tự cho chỉ' make' hoặc 'make pdflatex' (và trường hợp sử dụng là sau đó để thay đổi động cơ bằng cách chỉ định chúng làm mục tiêu để 'make', như trong' make lualatex'). Chúc mừng! – sdaau

+1

Vâng, nó tùy thuộc vào bạn;) (Tôi thấy rằng thực tế khá khó hiểu và không tốt ...) Bạn có thể làm 'làm TEXENGINE = bất cứ điều gì', và cấu trúc một bộ chung các mục tiêu/quy tắc sử dụng người dùng chỉ định Biến 'TEXENGINE'? –

Trả lời

15

Sử dụng một target-specific variable

có một tính năng đặc biệt hơn nữa của Varia mục tiêu cụ thể bles: khi bạn xác định biến mục tiêu cụ thể mà giá trị biến cũng có hiệu lực cho tất cả điều kiện tiên quyết của mục tiêu này và tất cả điều kiện tiên quyết của chúng, v.v. (trừ khi các điều kiện tiên quyết đó ghi đè biến đó với giá trị biến mục tiêu cụ thể của riêng chúng).

TEXENGINE=pdflatex 

pdflatex: 
    echo the engine is $(TEXENGINE) 

lualatex: TEXENGINE=lualatex 
lualatex: pdflatex 
    echo Here I want to call the pdflatex rule, to check $(TEXENGINE) there! 

Đầu ra là:

$ make pdflatex 
echo the engine is pdflatex 
the engine is pdflatex 
$ make lualatex 
echo the engine is lualatex 
the engine is lualatex 
echo Here I want to call the pdflatex rule, to check lualatex there! 
Here I want to call the pdflatex rule, to check lualatex there! 
+0

Cảm ơn vì điều đó @JonathanWakely - lúc đầu tôi đã nhầm lẫn, bởi vì điều kiện tiên quyết sẽ gọi 'pdflatex' trước' lualatex'; nhưng sau đó tôi đã kiểm tra và nhận ra rằng việc tách mục tiêu 'lualatex:' trong hai tránh lỗ hổng này - và giải pháp cũng hoạt động mà không cần gọi lại 'make', điều này thật tuyệt vời. Cũng xin cảm ơn ghi chú về "biến số mục tiêu cụ thể". Chúc mừng! – sdaau

+1

Cụ thể hơn, nếu không có bất cứ điều gì bạn cần làm trong 'lualatex' không chỉ là' pdflatex' thì bạn không cần một công thức recipe trên mục tiêu 'lualatex'. Chỉ hai dòng 'lualatex:' là đủ. –

1

Vâng, tôi đã xoay xở để giải quyết vấn đề, nhưng tôi không hiểu chính xác nó nhiều - vì vậy một câu trả lời học được nhiều hơn sẽ được đánh giá cao. Đối với tôi đây, những liên kết này giúp:

Vì vậy, đây là ví dụ sửa đổi - rõ ràng, để gọi một quy tắc từ một quy tắc sau đó (không phải là một điều kiện tiên quyết, thay vì, như là bài đăng điều kiện tiên quyết), tôi chỉ có thể gọi một cách đệ quy make, trong khi có giá trị biến mới được chỉ định trên dòng lệnh:

TEXENGINE=pdflatex 

pdflatex: 
    echo the engine is $(TEXENGINE) 

lualatex: 
    echo Here I want to call the pdflatex rule, to check $(TEXENGINE) there! 
    $(MAKE) TEXENGINE=lualatex pdflatex 

Đầu ra là hơi dài dòng nhiều hơn tôi muốn nó, nhưng nó hoạt động:

$ make lualatex 
echo Here I want to call the pdflatex rule, to check pdflatex there! 
Here I want to call the pdflatex rule, to check pdflatex there! 
make TEXENGINE=lualatex pdflatex 
make[1]: Entering directory `/tmp' 
echo the engine is lualatex 
the engine is lualatex 
make[1]: Leaving directory `/tmp' 

... đó là những gì tôi muốn hoàn toàn dòng lệnh tương tác thông minh, nhưng tôi biết là không phải là giải pháp tốt nhất (xem @ bình luận JonathanWakely của dưới đây)

+2

Quy tắc của bạn ở đây là chạy một thể hiện 'make' khác và ghi đè lên biến' TEXENGINE'. Các biến được định nghĩa trên dòng lệnh được ưu tiên hơn các biến được xác định trong môi trường hoặc trong tệp makefile, vì vậy khi 'make' thứ hai chạy nó sử dụng giá trị được ghi đè. Nhược điểm của phương pháp này là bạn chạy 'make' hai lần, vì vậy nếu nó phải làm rất nhiều công việc để kiểm tra trạng thái của điều kiện tiên quyết thì bạn làm tất cả những việc đó hai lần. –

Các vấn đề liên quan