SORU
15 Aralık 2009, Salı


Define kural yürütme zaman değişken olun

Benim GNUmakefile, geçici bir dizin kullanan bir kural istiyorum. Örneğin:

out.tar: TMP := $(shell mktemp -d)
        echo hi $(TMP)/hi.txt
        tar -C $(TMP) cf $@ .
        rm -rf $(TMP)

Yazılı olarak, yukarıdaki kural kuraldır o anda geçici dizin oluştururayrıştırılır. Bunu bile yapmak istemiyorum anlamına gelir.her zaman tar, birçok geçici dizin oluşturulur. /Tmp kullanılmayan geçici dizinleri ile çevrili önlemek için istiyorum.

Bir şekilde değişken tek kural tanımlı olduğu her zaman karşı ateş, ne zaman tanımlanmış bir neden var mı?

Ana düşüncem bu işlev dökümü ve bir kabuk içine tar ama bu biraz çirkin görünüyor.

CEVAP
15 Aralık 2009, Salı


Örnek, TMP değişken zaman ayarlı (ve geçici dizin oluşturulmuş)kurallarıout.tar değerlendirilir. out.tar aslında ateş sadece dizin oluşturmak için, dizin oluşturma adımları içine taşımak gerekir:

out.tar : 
    $(eval TMP := $(shell mktemp -d))
    @echo hi $(TMP)/hi.txt
    tar -C $(TMP) cf $@ .
    rm -rf $(TMP)

eval işlevi eğer makefile içine elle yazılmış olsaydı bir dize olarak değerlendirir. Bu durumda, shell işlev çağrısı sonucu TMP değişken ayarlar.

edit(yorumlara cevap):

Benzersiz bir değişken oluşturmak için, aşağıdakileri yapabilirsiniz:

out.tar : 
    $(eval $@_TMP := $(shell mktemp -d))
    @echo hi $($@_TMP)/hi.txt
    tar -C $($@_TMP) cf $@ .
    rm -rf $($@_TMP)

Bu hedef (. adını önüne olurdu değişken tar, bu durumda), bir değişken üretim adı ile out.tar_TMP. Umarım, bu çatışmaları önlemek için yeterlidir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jeb Corliss

    Jeb Corliss

    17 Kasım 2006
  • Jimmie Jones

    Jimmie Jones

    16 Kasım 2007
  • theavettbrothers

    theavettbrot

    9 ŞUBAT 2007