Saya memiliki beberapa Makefile di direktori khusus aplikasi seperti ini:
/project1/apps/app_typeA/Makefile
/project1/apps/app_typeB/Makefile
/project1/apps/app_typeC/Makefile
Setiap Makefile menyertakan file .inc di jalur ini satu tingkat lebih tinggi:
/project1/apps/app_rules.inc
Di dalam app_rules.inc saya menetapkan tujuan di mana saya ingin binari ditempatkan ketika dibangun. Saya ingin semua binari berada di app_type
jalurnya masing-masing :
/project1/bin/app_typeA/
Saya mencoba menggunakan$(CURDIR)
, seperti ini:
OUTPUT_PATH = /project1/bin/$(CURDIR)
tetapi sebaliknya saya membuat binari dimakamkan di seluruh nama jalan seperti ini: (perhatikan redundansi)
/project1/bin/projects/users/bob/project1/apps/app_typeA
Apa yang bisa saya lakukan untuk mendapatkan "direktori saat ini" dari eksekusi sehingga saya bisa tahu hanya app_typeX
untuk menempatkan binari di folder tipe masing-masing?
sumber
$(lastword "$(MAKEFILE_LIST)")
dari makefile di jalan"Sub Directory/Makefile"
akan memberi Anda"Directory/Makefile"
. Saya tidak berpikir ada jalan keluar karena ini$(MAKEFILE_LIST)
dengan dua makefile memberi Anda satu string"Makefile One Makefile Two
, yang tidak dapat menangani spasicurrent_dir
tidak berhasil untuk saya.$(PWD)
tidak dan itu jauh lebih sederhana."solution only works when you are running make from the Makefile's current directory"
adalah cara yang ringan untuk mengatakan "tidak benar-benar bekerja". Saya akan menempatkan potongan terbaru di bagian atas jawaban.Seperti yang diambil dari sini ;
Ditampilkan sebagai;
Semoga ini membantu
sumber
dir
daripadashell dirname
mendapatkan pathname dengan/
karakter trailing .DIR:=$(strip $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))))
$MAKEFILE_LIST
harus mendahuluiinclude
operasi ( docs ) apa pun.dirname
- jika ada ruang di jalan.Jika Anda menggunakan GNU make, $ (CURDIR) sebenarnya adalah variabel bawaan. Ini adalah
lokasi di mana Makefile beradadi direktori kerja saat ini, yang mungkin merupakan tempat Makefile berada, tetapi tidak selalu .Lihat Lampiran Referensi Cepat di http://www.gnu.org/software/make/manual/make.html
sumber
/
. Saya mencoba terikat dengangmake
v3.81. Tetapi Anda benar jikamake
disebut sebagaimake -f xxx/Makefile
.CURDIR
bekerja untuk saya di manaPWD
tidak. Sayamkdir -p a/s/d
kemudian di setiap folder memiliki makefile yang dicetakPWD
danCURDIR
sebelumnya+$(MAKE) <subdir>
.sumber
Saya mencoba banyak jawaban ini, tetapi pada sistem AIX saya dengan gnu make 3,80 saya perlu melakukan beberapa hal jadul.
Ternyata itu
lastword
,abspath
danrealpath
tidak ditambahkan hingga 3,81. :(Seperti yang orang lain katakan, bukan yang paling elegan karena memanggil shell dua kali, dan masih memiliki masalah spasi.
Tetapi karena saya tidak memiliki ruang di jalur saya, itu berfungsi untuk saya terlepas dari bagaimana saya memulai
make
:Semua memberi saya
wherever
untukcurrent_dir
dan jalan absolut menujuwherever
untukmkfile_dir
.sumber
Saya suka jawaban yang dipilih, tetapi saya pikir akan lebih membantu untuk benar-benar menunjukkannya berfungsi daripada menjelaskannya.
/tmp/makefile_path_test.sh
Keluaran:
CATATAN: Fungsi
$(patsubst %/,%,[path/goes/here/])
ini digunakan untuk menghapus garis miring.sumber
Solusi ditemukan di sini: https://sourceforge.net/p/ipt-netflow/bugs-requests-patches/53/
Solusinya adalah : $ (CURDIR)
Anda bisa menggunakannya seperti itu:
sumber
$(CURDIR)
sudah dicoba tidak berhasil.make
diluncurkan di). Memang, memang itu yang diinginkan OP, tetapi judul pertanyaannya palsu, jadi pertanyaannya sendiri tidak konsisten. Jadi, ini adalah jawaban yang benar untuk pertanyaan yang salah. ;)Berikut ini adalah satu-liner untuk mendapatkan path absolut ke
Makefile
file Anda menggunakan sintaks shell:Dan ini adalah versi tanpa shell berdasarkan jawaban @ 0xff :
Uji dengan mencetaknya, seperti:
sumber
Sejauh yang saya ketahui ini adalah satu-satunya jawaban di sini yang bekerja dengan benar dengan spasi:
Ini pada dasarnya bekerja dengan melarikan diri karakter ruang dengan menggantikan
' '
untuk'\ '
yang memungkinkan Membuat untuk mengurai dengan benar, dan kemudian menghapus nama file dari makefile diMAKEFILE_LIST
dengan melakukan substitusi lain sehingga kau pergi dengan direktori yang makefile di. Tidak persis paling kompak hal di dunia tetapi itu berhasil.Anda akan berakhir dengan sesuatu seperti ini di mana semua ruang diloloskan:
sumber
Contoh untuk referensi Anda, seperti di bawah ini:
Struktur folder mungkin sebagai:
Di mana ada dua Makefile, masing-masing seperti di bawah ini;
Sekarang, mari kita lihat konten Makefiles.
Sekarang, jalankan sampel / Makefile, sebagai;
Penjelasannya, adalah bahwa direktori induk / home dapat disimpan di lingkungan-flag, dan dapat diekspor, sehingga dapat digunakan di semua makefile sub-direktori.
sumber
perbarui 2018/03/05 hingga akhir Saya menggunakan ini:
Itu dapat dijalankan dengan benar di jalur relatif atau jalur absolut. Dieksekusi benar dipanggil oleh crontab. Dieksekusi benar di shell lain.
perlihatkan contoh, a.sh print self path.
lama: Saya menggunakan ini:
Ini dapat ditampilkan dengan benar jika dieksekusi di shell lain dan direktori lain.
sumber
Satu baris di Makefile harus cukup:
DIR := $(notdir $(CURDIR))
sumber