2011-06-18 18 views
15

Yüklemek ve hedefleri kaldırmak için automake kullanmak istediğim bir veri dizinim var. Esasen, sadece VERİ dizinine aynen bu dizini kopyalamak istediğiniz, Normalde,Veri dizini ağacını automake kullanarak çok sayıda dosya ile yükle

dist_whatever_DATA=dir/subdir/filea ... 

gibi tek tek tüm dosyaları, listeleyebilir Ama dizin yapısı bu

*root 
*subdir 
    *~10 files 
*subdir 
    *~10 files 
*subdir 
    *~700 files 
*subdir 
... 
~20 subdirs 
benzediği zaman sorun ortaya çıkar

Ben sadece benim Makefile.am bir parçası olarak dahil tüm 1000 + dosyaları listeleyemez. Bu çok saçma olurdu.

Dizin yapısını da korumalıyım. Bu verinin, tüm oluşturma işlemiyle üretilen numaralı olduğunu ve aslında büyük ölçüde kısa ses kayıtları olduğunu not etmeliyim. Bu yüzden, yüklemek istediğim her dosyanın gerçekten var olduğu, ya da var olmadığı ve dosya ne olursa olsun, yüklenmesini istediğimi bildiğimden emin değilim. dosya değil, yüklü olmamalıdır. Bunun joker kurmayları yapmamaları için başka yerlerde kullanıldığı gerekçesi olduğunu biliyorum, ancak tüm olası nedenler burada geçerli değil.

Ben tüm dosyaları listeleyen bir Makefile parçası üretmek için bir komut dosyası kullanmak istiyorsunuz

cevap

10

Yüzlerce dosyanın aynı anda yüklenmesinin, make install'un işkenceci uzun bir çağrısı için yapıldığını buldum. Ben dizin yapısını koruyarak, yüzlerce dosya yüklemek istedim benzer bir durumda vardı ve ben bir dosya eklendiğinde veya koleksiyondan kaldırıldı her zaman Makefile.am değiştirmek istemedim.

benim dağılımındaki dosyaların bir LZMA arşivini dahil ve şöyle automake kuralları yaptı:

GIANTARCHIVE = My_big_archive.tar.lz 

dist_pkgdata_DATA = $(GIANTARCHIVE) 

install-data-hook: 
    cd $(DESTDIR)$(pkgdatadir); \ 
    cat $(GIANTARCHIVE) | unlzma | $(TAR) --list > uninstall_manifest.txt; \ 
    cat $(GIANTARCHIVE) | unlzma | $(TAR) --no-same-owner --extract; \ 
    rm --force $(GIANTARCHIVE); \ 
    cat uninstall_manifest.txt | sed --expression='s/^\|$$/"/g' | xargs chmod a=rX,u+w 

uninstall-local: 
    cd $(DESTDIR)$(pkgdatadir); \ 
    cat uninstall_manifest.txt | sed --expression='s/ /\\ /g' | xargs rm --force; \ 
    rm --force uninstall_manifest.txt 

Bu şekilde, automake $(pkgdata) dizinde My_big_archive.tar.lz yükler ve bir listesini yaparak, orada ayıklar İçinde bulunan tüm dosyalar, daha sonra bunları kaldırabilir. Bu, bu listeyi otomatik olarak oluştursanız bile, her dosyayı bir yükleme hedefi olarak listelemekten daha hızlı çalışır.

+1

Bunu neden '$ (pkgdatadir) 'içine yüklüyorsunuz? Sadece 'install-data-hook' içinde '$ (srcdir)' dan çıkarın. EXTRA_DIST = giant_archive.tar.lzma' gibi bir şey kullanın, böylece dağıtılır. –

+0

Eh, iyi nokta. – ptomato

+3

Asıl soruyla ilgisiz üç küçük öneri. Ben kedi xxx yerine olurdu | yyy | zzz' tarafından yyyy adl

11

: o zaman

echo 'subdir_files =' > subfiles.mk 
find subdir -type f -print | sed 's/^/ /;$q;s/$/ \\/' >> subfiles.mk 

ve ana Makefile.am bu subfiles.mk şunlardır:

include $(srcdir)/subfiles.mk 
nobase_dist_pkgdata_DATA = $(subdir_files) 

İkinci seçenek EXTRA_DIST = subdir ve sonra özel install-data-local ve uninstall-local kurallarını yazmaktır. Burada

sorun EXTRA_DIST = subdir irade yedekleme dosyaları, yapılandırma dosyalarına (örneğin sizin VCS itibaren) ve dağıtmak istemem başka şeyler de dahil olmak üzere, subdir/ tüm dosyaları dağıtan olmasıdır.

Yukarıdaki gibi bir komut dosyası kullanmak, gerçekten dağıtmak istediğiniz dosyaları filtrelemenizi sağlar.

+0

Sadece bir not: ": execvp:/bin/bash: çok uzun Argüman listesinin [2] yapmak" –

+0

Vay onunla başarısız olarak ilki, çalışmıyor! Ben dosyaların oldukça büyük listeleri ile bazı 'Makefile's yarattığını fakat yoktu am * henüz * Bir gün komut satırı boyut sınırı vururdu fark! – adl

+0

İkinci seçeneğe bir örnek verebilir misiniz? Ben sadece yanlış izinleri almak ve cp sonra chmod gerekiyor "-Rf cp" (ya da belki cp önce umask) ise. Ben bütün dizin yüklemek için en iyi, en taşınabilir yolu nedir, vb bunun yerine cp $ (INSTALL_DATA) kullanır, ancak bu durumda tüm dosyalar belirtilmesi gerekir, bu nedenle bu "Bul" gerektirecektir otomatik olarak oluşturulan kuralların içine baktı yüklemek-veri-yerel? Bu http://www.google.com/codesearch#EIS5BlthS9Y/Makefile.am&q=install-data-local%20INSTALL_DATA&type=cs – marcin

3

install-data-hook hedefinin bir parçası olarak çalıştırılan bir komut dosyası (ayrı bir kabuk komut dosyası olarak veya Makefile.am) yazar.