makefile başka bir hedefi yürütür


123

Makefile'ım şu şekilde yapılandırılmış:

all : 
    compile executable

clean :
    rm -f *.o $(EXEC)

"Tümünü yap" komutunu çalıştırmadan önce terminalimde sürekli olarak "temizle" ve ardından "temizle" çalıştırdığımı fark ettim. Kötü C ++ derleme hatalarını denemeden önce temiz bir terminale sahip olmayı seviyorum. Bu yüzden 3. bir hedef eklemeye çalıştım:

fresh :
    rm -f *.o $(EXEC)
    clear
    make all

Bu işe yarıyor, ancak bu ikinci bir make örneğini çalıştırıyor (inanıyorum). 2. bir make örneği çalıştırmadan aynı işlevselliği elde etmenin doğru bir yolu var mı?

Yanıtlar:


172

Aslında haklısın: başka bir make örneği çalıştırıyor. Olası bir çözüm şöyle olabilir:

.PHONY : clearscr fresh clean all

all :
    compile executable

clean :
    rm -f *.o $(EXEC)

fresh : clean clearscr all

clearscr:
    clear

Çağırarak make freshönce cleanhedefi, sonra clearscreenhangisinin çalıştığını clearve son allolarak işi yapan kişiyi elde edersiniz .

4 Ağustos'u DÜZENLE

Marka -jseçeneğiyle paralel derlemeler olması durumunda ne olur ? Siparişi düzeltmenin bir yolu var. Marka kılavuzundan bölüm 4.2:

Ancak bazen, bu kurallardan biri yürütülürse hedefi güncellenmeye zorlamadan çağrılacak kurallara belirli bir sıralama empoze etmek istediğiniz bir durumla karşılaşırsınız. Bu durumda, yalnızca sipariş önkoşullarını tanımlamak istersiniz. Yalnızca sipariş önkoşulları, önkoşullar listesine bir boru simgesi (|) yerleştirilerek belirtilebilir: boru simgesinin solundaki tüm ön koşullar normaldir; sağdaki tüm önkoşullar yalnızca sipariştir: hedefler: normal önkoşullar | Sipariş salt-önkoşullar

Normal ön koşullar bölümü elbette boş olabilir. Ayrıca, aynı hedef için birden çok önkoşul satırı beyan edebilirsiniz: bunlar uygun şekilde eklenmiştir. Aynı dosyanın hem normal hem de yalnızca sipariş önkoşulu olduğunu bildirirseniz, normal ön koşulun öncelikli olduğunu unutmayın (çünkü bunlar yalnızca sipariş ön koşulunun davranışının kesin bir üst kümesidir).

Böylece makefile olur

.PHONY : clearscr fresh clean all

all :
    compile executable

clean :
    rm -f *.o $(EXEC)

fresh : | clean clearscr all

clearscr:
    clear

5 Aralık DÜZENLE

Görev içindeki her komut zaten bir alt kabuk olacağından, birden fazla makefile örneğini çalıştırmak büyük bir sorun değildir . Ancak çağrı işlevini kullanarak yeniden kullanılabilir yöntemlere sahip olabilirsiniz .

log_success = (echo "\x1B[32m>> $1\x1B[39m")
log_error = (>&2 echo "\x1B[31m>> $1\x1B[39m" && exit 1)

install:
  @[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
  command1  # this line will be a subshell
  command2  # this line will be another subshell
  @command3  # Use `@` to hide the command line
  $(call log_error, "It works, yey!")

uninstall:
  @[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
  ....
  $(call log_error, "Nuked!")

6
@ sas4740: temelde takip .PHONY : eden her şey her zaman yürütülen bir anahtar sözcük olarak değerlendirilirken, sahte olmayan hedeflerin dosya olması amaçlanır.
Dacav

"Yalnızca sipariş önkoşulları" koşullu mudur? t2 hedefi için önce t0 yapmak istiyorum, sadece t0 başarılı olursa t1'i çalıştırırsa ve sadece her iki başarılı da t3'te bir görev çalıştırırsa
fantastory

1
@fantastory, hayır, bağımsız olduklarını düşünüyorum . t2bağlı olacaktır t0, t1ve t3. Bunu gerekirse koymalıyız t3gerektirdiği şekilde t2, t1gereği t3ve t0gerektirdiği gibi t1. Bu 3 farklı kural anlamına gelir. Ancak bunu doğrulamalısınız. % 100 emin değilim.
Dacav

3
"Yalnızca sipariş ön koşulları" bağımsızdır
fantastik

2
"Temiz" in garantisinin "her şeyden" önce nerede olduğunu anlamıyorum? Onları doğruca koymuş olmanız | sırayla yürütülmelerini sağlamaz. Yalnızca sipariş bağımlılığı, hedefin böyle bir işlemden sonra mutlaka güncellenmeyeceği anlamına gelir. Bağımlı elemanların sıralanmasıyla ilgisi yok ... veya?
CygnusX1

6

make allSatırı "yeni" hedefinizden kaldırdıysanız :

fresh :
    rm -f *.o $(EXEC)
    clear

Sadece komutu çalıştırabilir make fresh allolarak çalıştırır, make fresh; make all.

Bazıları bunu ikinci bir make örneği olarak düşünebilir, ancak bu kesinlikle bir make'in alt örneği değil (bir make'in içinde yapılan bir yapım), ki bu girişiminizin sonuçlandığı görüldü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.