Env'i makefile hedefine gönder


3

Bir makefile hedefi için taahhütte bulunan en sha var olan bir env var ayarlamaya çalışıyorum. Env değişkenlerinin çoğunu ayarlıyorum ve yalnızca bu tür bir dosya veya dizin hatasıyla başarısız oluyor. Kafam karıştı. Lütfen bunu makefile hedefime göre env değişken olarak geçmeme yardım et. Makefile'imin başında yaptığım şey bu.

SHA1 := $(shell git log | head -1 | awk '{print $2}')
BUILD_STAMP := $(shell date +%s)
export SHA1
export BUILD_STAMP

Makefile hedeflerinden biri de böyle.

target: dep-target
     env \
              VAR1=$(VAR1) \
              GIT_SHA1=$(SHA1) \
     my-command for the target

Bu başarısız

env: a6d23d14b0fbb613e567cc647ebfe2808ce47af1: No such file or directory

Lütfen bunu env var olarak ayarlamama yardım et.


Aşağıdaki sorunuzun cevabını bulursanız, yanındaki gri onay işaretine tıklayarak "kabul edildi" olarak işaretleyin.
Hannu

SHA1'in değerinin içinde bir boşluk var mı?
user20574

Yanıtlar:


3
 VAR1 = $ (Q1)
 GIT_SHA1 = $ (SHA1)

$Bu şekilde hemen önce kullanılan yuvarlak parantezler, parantezler, parantezler arasındaki metnin, çalıştırılmaya çalışılması için komut satırı olarak Bash'e gönderilmesine neden olur.

Kıvrımlı parantezle değiştirin, yani yerine GIT_SHA1=${SHA1}amaçlanan değişken atamasını elde edersiniz.


Emin misiniz? İlk önce değişken değişimini yapmalı (ve değişken değişkeni olarak $ () 'yı görmeli) ve THEN bash $ ()' yı görmeyecektir, çünkü bunları ilk değiştiren değiştirildi.
user20574

Haklı olduğum "Böyle bir dizin dosyası yok" ifadesine dayanarak varsayırım.
Hannu

Sen denir bulunamadığını A) dosya veya dizin fark edebilirsiniz a6d23d14b0fbb613e567cc647ebfe2808ce47af1değil SHA1mesajı tarafından basılmış olduğu) ve B env, değil bash.
user20574

SHA1 := $(shell git log | head -1 | awk '{print $2}')Değişkeni bu değere ayarlar ve env'nin yazdırdığı gerçeğinin benim için env'nin Bash (veya "system ()") üzerinden çalıştırıldığını gösterdiğini varsayarız .
Hannu

$(...)"bunu bash komutunu çalıştırmayı denemek için komut satırı olarak gönder" anlamına gelirse , komutun bulunamadığını belirten bir hata yazdıracak $(SHA1)olan komutu çalıştırmayı dener . Terminalinizi yazarsanız ne olur ? SHA1SHA1SHA1
user20574,

1

@ Hannu'nun yanlış cevabı hakkında yorum yapmak için yeterli desteğim yok (Kıvırcık ve yuvarlak parantez Yap'ta eşittir).

Bu tür bir şeyi ayıklamak için, ayrı bir kısa Makefile oluşturun ve şunun gibi şeyleri deneyin:

SHA1 := $(shell git log | head -1 | awk '{print $2}')
all:
        echo "$(SHA1)"

Bu, olanları gösterir SHA1'e sadece SHA'yı değil, boşlukları içeren ilk git günlük çıktısının tüm satırına atanır. Genişletilmiş env komutu geçersiz sözdizimine sahip olacaktır.

Bu durumda, awk komutundaki dolar işareti iki katına çıkarılmalıdır ($$ 2'ye bas).


(curly and round parenthesis are equivalent in Make). Sert düşün! Makefile'deki o noktada ne yazıyorsun ?
Hannu

@Hannu Değişken bir genişleme?
user20574,
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.