Makefile'da $ PATH'a nasıl dir ekleyebilirim?


91

Testleri çalıştıracak bir Makefile yazmak istiyorum. Test './tests' dizininde ve test edilecek yürütülebilir dosyalar './bin' dizinindedir.

Testleri çalıştırdığımda, ./bin dizini $ PATH içinde olmadığından exec dosyalarını görmüyorlar.

Böyle bir şey yaptığımda:

EXPORT PATH=bin:$PATH
make test

herşey çalışıyor. Ancak Makefile'daki $ PATH değerini değiştirmem gerekiyor.

Basit Makefile içeriği:

test all:
    PATH=bin:${PATH}
    @echo $(PATH)
    x

Yolu doğru yazdırır, ancak x dosyasını bulamaz.

Bunu manuel olarak yaptığımda:

$ export PATH=bin:$PATH
$ x

her şey yolunda o zaman.

Makefile'daki $ PATH değerini nasıl değiştirebilirim?


Testleri sadece çalıştırılabilir dizinden çağıramaz ../test/test_to_runmısınız? Soruyu yanlış anladıysam özür dilerim.
Chris

Bu dosyanın normal olarak testlere görünmesini istiyorum. Yeniden düzenleme yaptığım için dizinlerle oynamak istemiyorum, bu bir yakınlık olurdu.
Szymon Lipiński

Buna yaklaşmanın tek yolu, makefile'ın decls değişkenini içeren bir kabuk betiği yazmasını sağlamak ve ardından betikte bulunan ana kabuk kaynağına sahip olmaktır .. Ancak bu muhtemelen pratik değildir.
Michael Smith

Unix.stackexchange.com/questions/11530/… ' nin sizinkinden farklı olarak çok farklı (aptalca) bir soru olduğuna inanıyorum .
imz - Ivan Zakharyaschev

Yanıtlar:


108

Make exportyönergesini denediniz mi (GNU Make kullandığınızı varsayarak)?

export PATH := bin:$(PATH)

test all:
    x

Ayrıca, örneğinizde bir hata var:

test all:
    PATH=bin:${PATH}
    @echo $(PATH)
    x

İlk olarak, verilen değer , kabuk tarafından değil, Make tarafından gerçekleştirilen değişkenin echobir genişlemesidir PATH. Beklenen değeri yazdırırsa, sanırım, PATHMakefile'ınızda daha önce bir yerde veya Make'i çağıran bir kabukta değişken ayarlamışsınızdır . Bu tür davranışları önlemek için dolarlardan kaçmalısınız:

test all:
    PATH=bin:$$PATH
    @echo $$PATH
    x

İkincisi, her durumda bu işe yaramaz çünkü Make tarifin her satırını ayrı bir kabukta çalıştırır . Bu, tarifin tek satıra yazılmasıyla değiştirilebilir:

test all:
    export PATH=bin:$$PATH; echo $$PATH; x

7
$(PATH)PATHmake'i çağıran kabuğun değerine ayarlanacaktır . Gereğince kılavuzda , "aynı ad ve değer ile bir make değişkeni dönüşür başladığında her ortam değişkeni yapmak gördüğü."
Emil Sit

Dışa aktarma yönergesi benim için çalıştı (teşekkürler!), Ancak yalnızca GNU Make 4.3'ü yükledikten sonra. Sürümü 3,81 (MacOS Catalina varsayılan) olarak güncelleme PATHdoğru değişkenlerin (yansıtılır echo $(PATH)) ve komutları ortamlarda (içinde env, which python, bash -c python), ancak komut için yürütülebilir yerini kullanılacak görünmüyor: Komut pythonhala çalışır Orijinal üzerinde Python çalıştırılabilir PATH.
doctaphred

30

Tasarım makeayrıştırıcısı, satırları ayrı bir kabuk çağrısında çalıştırır, bu nedenle değişkeni (örneğin PATH) bir satırda değiştirmek, değişiklik sonraki satırlara uygulanmayabilir (bu yazıya bakın ).

Bu sorunu çözmenin bir yolu, birden çok komutu tek bir satıra (ile ayrılmış ;) dönüştürmek veya Tek Kabuk özel hedefi kullanmaktır ( .ONESHELLGNU Make 3.82'den itibaren).

Alternatif olarak PATH, kabuğun çağrıldığı anda değişken sağlayabilirsiniz . Örneğin:

PATH  := $(PATH):$(PWD)/bin:/my/other/path
SHELL := env PATH=$(PATH) /bin/bash

2
Yaklaşımı beğendim!
Alan Franzoni

2
Bu en iyisidir, çünkü $(shell)çağrılarla bile çalışır ! : D Örnek: pastebin.com/Pii8pmkD
PsychoX

Dev.azure'da şunu elde ederim: env: 'env': Böyle bir dosya veya dizin yok; Yerel olarak çalışıyor; /
Kamil Dziedzic

Make 4.2 ile Debian 10'da çalışmaz: make: env PATH = <path> / bin / sh: Komut bulunamadı. İhracat çalışmalarının kullanılması. Ev dizinindeki bir yol için ~ değil, $ (HOME) kullandığınızdan emin olun.
MKesper

25

Önce makefile dosyanızdaki SHELL değişkenini ayarlarsanız, yol değişiklikleri kalıcı gibi görünür:

SHELL := /bin/bash
PATH := bin:$(PATH)

test all:
    x

Bunun istenen bir davranış olup olmadığını bilmiyorum.


Bu, yaşadığım sorunu çözdü (zsh çalıştırıyorum). Teşekkürler!
Jezen Thomas

Evet, bu gerçekten de OP'nin istediğini yapıyor ... ama bir özellik mi yoksa bir hata mı? Yapım kılavuzunun SHELL bölümünü okuduktan sonra bile emin değilim.
pje

5
Bu benim için de çalışmıyor. whichve envşimdi yeni PATH'i seçin, ancak bir ikilinin doğrudan çalıştırılması hala değiştirilmiş PATH'de değil, sadece orijinalinde bulunur.
Konrad Rudolph

3

Genellikle yaptığım şey, yürütülebilir dosyanın yolunu açıkça belirtmektir:

EXE=./bin/
...
test all:
    $(EXE)x

Çapraz derleme yapıyorsam QEMU gibi bir emülatör altında yerel olmayan ikili dosyaları çalıştırmak için de bu tekniği kullanıyorum:

EXE = qemu-mips ./bin/

Eğer make sh kabuğunu kullanıyorsa, bu çalışmalıdır:

test all:
    PATH=bin:$PATH x

Evet, harika bir ruh hali, ancak testlerimi perl ile yazdım ve exe'yi doğrudan makefile'dan değil perl betiğinden çağırmam gerekiyor. Bu şeylerin tüm testlerini yeniden düşünmeliyim :)
Szymon Lipiński

Anladım. PATH'i komut satırının kendisine ayarlamaya ne dersiniz? Yukarıdaki düzenlemeye bakın.
Richard Pennington

-3

PATHDeğişkeni ayarlamak için yalnızca Makefile içinde aşağıdaki gibi bir şey kullanın:

PATH := $(PATH):/my/dir

test:
@echo my new PATH = $(PATH)

İstediğim gibi yürümüyor. Soruyu, elde etmek istediğim şeyin örnekleriyle güncelledim.
Szymon Lipiński
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.