Dapatkan direktori tingkat atas dari variabel makefile

8

Apa kode paling sederhana untuk mendapatkan bagian direktori tingkat atas dari variabel makefile? Contoh:

BUILD_DIR = dir/subdir/.../sub-a-dub-dir
distclean:
        rm -rf <some code which evaluates to "dir" from $(BUILD_DIR)>

PS: Saya tidak bermaksud $(dir $(dir $(BUILD_DIR))), tetapi sesuatu yang mendapat bagian direktori pertama dari nilai variabel apa pun .

l0b0
sumber
dirname /tmp/foo/barakan memberi /tmpatau dirname foo/bar/bazakan memberifoo
Abhishek A
1
@ greenmang0: Tandai jawaban Anda. Pertama, itu jelas salah (apakah Anda bahkan menjalankan perintah itu?), Dan kedua untuk makefile , bukan Bash.
l0b0
@ l0b0 Ini adalah komentar, dan "itu salah" bukan alasan yang baik untuk menandai apa pun, tinggalkan komentar yang mengatakan apa masalahnya
Michael Mrozek
@MichaelMrozek: Saya menandainya "bukan topik yang konstruktif / tidak aktif", yang keduanya berlaku untuk itu.
l0b0
Saya tidak mengerti pertanyaan Anda: apa yang Anda maksud dengan "bagian direktori tingkat atas"? Apakah maksud Anda bagian sebelum yang pertama /? Apakah Anda menjamin bahwa argumennya adalah jalur relatif? Apakah Anda mengasumsikan buatan GNU?
Gilles 'SO- stop being evil'

Jawaban:

5

Apakah maksud Anda komponen pertama dari direktori? Jika demikian, ubah jalur menjadi daftar komponen, lalu ekstrak komponen pertama. Saya berasumsi Anda menggunakan GNU make, dan Anda tidak melakukan sesuatu yang gila seperti mengharapkan nama file dengan spasi kosong tanpa terluka. Jangan coba ini dengan jalur absolut.

override BUILD_DIR = dir/subdir/.../sub-a-dub-dir
distclean:
        rm -rf $(firstword $(subst /, ,$(BUILD_DIR)))

Saya membuat BUILD_DIRmenimpa apa pun yang mungkin telah dilewati pengguna pada baris perintah, untuk menghindari seseorang secara tidak sengaja melewatkannya dan menghapus sesuatu yang tidak diinginkan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
BUILD_DIRseharusnya menjadi variabel internal, tetapi Anda benar, masih ada kemungkinan seseorang menetapkannya untuk sesuatu yang berbahaya. Jadi menerima jawaban ini, dengan peringatan bahwa solusinya tidak boleh digunakan :)
l0b0
1
@ l0b0 Karena kita mengasumsikan GNU membuat:override BUILD_DIR = …
Gilles 'SO- berhenti menjadi jahat'
0

Jika Anda yakin BUILD_DIR tidak akan pernah memulai dengan '/':

rootdir=$( echo $BUILD_DIR | cut -d/ -f1 )

Jika tidak, Anda mungkin perlu memperhitungkan jalur yang dimulai dengan '/':

if [[ $BUILD_DIR =~ "^/" ]]; then
        rootdir=$( echo $BUILD_DIR | cut -d/ -f1,2 )
else
        rootdir=$( echo $BUILD_DIR | cut -d/ -f1 )
fi

echo $rootdir

Atau mungkin yang terbaik adalah mengabaikan jalur apa pun yang dimulai dengan '/'.

Tim Kennedy
sumber
1
Ini untuk makefile, bukan Bash. Ini adalah masalah sepele di Bash, tapi saya tertarik pada solusi makefile sederhana .
l0b0
Satu hal yang dapat Anda lakukan di Makefile adalah menjalankan perintah. Jadi Anda membuat skrip shell, di path Anda, yang disebut rootdir, dan di makefile Anda, jalankan "rm -rf $ (rootdir $ BUILD_DIR)", atau sesuatu seperti itu. Atau Anda harus melakukan sesuatu seperti pra-mendefinisikan root build, sehingga Anda bisa rm -rfmelakukannya nanti. Saya pasti akan menggandakan cek respons yang rootdirdapat dikembalikan skrip, sehingga Anda tidak berakhir dengan kesalahan sintaks saat memberikan skrip rm -rf /.
Tim Kennedy