2012-01-25 18 views
7

Boş bir dosyaya dokunma/oluşturma ve/veya izinleri, kullanıcı ve grubu ayarlama işlevini yazmaya çalışıyorum, Mümkünse, ya da değilse uyarın. Ancak, fonksiyonumdaki her koşullu kontrol doğru olarak değerlendiriliyor gibi görünüyor. olduğu

  • $ (eğer ...): Benim Makefile

    şartları

    INSTALL_USER := fileUser 
    INSTALL_GROUP := fileGroup 
    
    .PHONY: test 
    test: 
        $(call touchFile,~/test.ini) 
    
    define touchFile 
    $(eval fileName := $(strip $(1))) 
    -touch $(fileName) 
    -chmod -c 664 $(fileName) 
    
    $(info filename info $(fileName)) 
    $(info $(shell stat -c "%a %U:%G" $(fileName))) 
    
    $(if ifeq "foo" "bar", @echo match is broken, @echo match works) 
    $(if ifneq "foo" "bar", @echo match works, @echo match is broken) 
    
    $(if ifneq ($(shell stat -c %a $(fileName)),664), $(warning Error - $(fileName) does not have expected permissions of 664)) 
    -chgrp -c $(INSTALL_GROUP) $(fileName) 
    $(if ifneq ($(shell stat -c %G $(fileName)),$(INSTALL_GROUP)), $(warning Error - $(fileName) does not belong to $(INSTALL_GROUP) group)) 
    -chown -c $(INSTALL_USER) $(fileName) 
    $(if ifneq ($(shell stat -c %U $(fileName)),$(INSTALL_USER)), $(warning Error - $(fileName) does not belong to $(INSTALL_USER) user)) 
    endef 
    

    make test çıkışları ben kabul ettik

    filename info ~/test.ini 
    664 myUserName:myGroup 
    Makefile:7: Error - ~/test.ini does not have expected permissions of 664 
    Makefile:7: Error - ~/test.ini does not belong to common group 
    Makefile:7: Error - ~/test.ini does not belong to netserve user 
    touch ~/test.ini 
    chmod -c 664 ~/test.ini 
    match is broken 
    match works 
    chgrp -c fileGroup ~/test.ini 
    changed group of `/home/myUserName/test.ini' to fileGroup 
    chown -c fileUser ~/test.ini 
    chown: changing ownership of `/home/myUserName/test.ini': Operation not permitted 
    make: [test] Error 1 (ignored) 
    

    Koşu vardır/aşağıdaki çalıştı işlev bir parametre ile çağrılmadan önce "derleme zamanı" nda değerlendirilir. Ancak, sabit kodlanmış ifeq "foo" "bar" da geçersiz bir sonuç verir. Ayrıca, $(info ...) doğru şekilde $(fileName) "derleme zamanında" değerlendirir.
  • documentation aslında örnek vermez, bu nedenle $(if ifeq...)'a ek olarak, yok sayılıyor gibi görünen $(ifeq ...)'u da denedim. Bir işlev içinde "İşlevsel olmayan" if (yani $(if...) olmadan ifeq) /bin/sh: ifeq: command not found verir.

Birisi benim koşulların neden beklediğim gibi davranmadığını (veya yanlış şeyi neden beklediğimi) belirlemede yardımcı olabilir mi?

Kayıt: Dosya mevcut değilse hala düzeltilecek hatalar olduğunu biliyorum, ancak bu engelle karşılaştırıldığında önemsiz olmalı. geçirilen ilk bağımsız olmayan boş olduğunda

+1

GNU web sitesi, hoş görünse de, neredeyse anlamsız olacak kadar özlü, değil mi? Size bir işlev söyleyecektir ve sonra nasıl kullanacağınıza dair size bir örnek vermeyeceklerdir, böylece sizi bununla ilgili olarak taciz edeceksiniz. – Xennex81

cevap

31

$(if ...) conditional functiontrue olarak değerlendirilir. Durumun söz konusu olması durumunda, metin boştur: ifeq "foo" "bar". Bunlar aslında direktiflerdir, fonksiyon değillerdir. Değişken tanımında ve işlevlerinde kullanılamazlar.

$(if $(filter foo,bar),@echo match is broken,@echo match works) 
$(if $(filter-out foo,bar),@echo match works,@echo match is broken) 
BTW

bu da daha iyi okunabilmesi için bir satır içi forma dönüştürülebilecek:

@echo match $(if $(filter foo,bar),is broken,works) 
@echo match $(if $(filter-out foo,bar),works,is broken) 
+0

harika açıklama – anoop

+0

@anoop Teşekkürler! –

1

geri dönün Örneğin, test dizeye filter and findstring gibi durum kullanım fonksiyonları içindeki eşitlik için

$(if'un çalışma şeklini yanlış anlıyorsunuz gibi görünüyor. yapmak bilgileri Dokümanlar:

$ (eğer DURUM, SONRA-BÖLÜM [BAŞKA-bölüm]) ' ' ise' işlevi fonksiyonel özellik bakımından

ilk koşullu genişleme için destek sağlar argüman, CONDITION, ilk önce tüm vardır ve boşluk boşluk soyulmuş, sonra genişletilmiştir. Herhangi bir boş olmayan dize genişlerse, koşul doğru olarak kabul edilir. Boş bir dizeye genişlerse, koşul olarak kabul edilir.

tüm örneklerde

, durumunuz ifeq SOMETHING OTHERTHING gibi bir şey - (bakılmaksızın başka şeyler neler olduğu ifeq itibaren) boş olmayan bir dize ve böylece gerçek işlenmesidir.

4

Bu sorunla karşılaştım ve "filtre" işlevinin sonucunu "if" işlevinin "koşul" bölümünde bulabildiğinizi buldum. Eğer OS sürümü Linux veya diğer ve ona eğer olup olmadığını kontrol etmek istiyorsanız İşte bir örnek)

uname  :=$(shell uname -s) 
is_darwin :=$(filter Darwin,$(uname)) 
viewpdf :=$(if $(is_darwin), open, evince) 
+0

Teşekkürler! Kendi makyaj aracım için en basit bir örnek istedim. – yoshi

0

"open" ile veya OSX içinde ("Evince" ile) Linux ya bir pdf açma için yararlıdır Ben ifeq ile çalışmadan önce

ifneq ($(TARGETOS), Linux) 
    target: server 
    @echo 
    @echo $(MSG) $(TARGETOS) 
else 
target: server 
    @echo $(MSG) $(TARGET) 
endif 

ancak yalnızca başka parçasını basılı etti: Linux ise o zaman sonra u bu adımları izleyebilirsiniz bazı mesajı yazdırmak istiyorum. benim işletim sistemim Linux, ubuntu.

Eğer bu cevabı bulduysa, bu cevabı değiştirmesi gerekiyorsa, bunun için de daha iyi bir cevap verebilirler.

İlgili konular