2011-06-18 14 views
15

Mam katalog danych, który chciałbym, aby automake generował cele instalacji i deinstalacji. Zasadniczo, po prostu chcę, aby skopiować ten katalog verbatim do katalogu danych, Normalnie, mogę wymienić wszystkich indywidualnie plików, jakInstaluj drzewo katalogów danych z ogromną liczbą plików za pomocą automake

dist_whatever_DATA=dir/subdir/filea ... 

Ale problem pojawia się, gdy moja struktura katalogów wygląda tak

*root 
*subdir 
    *~10 files 
*subdir 
    *~10 files 
*subdir 
    *~700 files 
*subdir 
... 
~20 subdirs 

Po prostu nie mogę listy wszystkich 1000 + plików zawartych jako część mojego Makefile.am. To byłoby śmieszne.

Potrzebuję również zachować strukturę katalogów. Powinienem zauważyć, że te dane są , a nie generowane w ogóle przez proces kompilacji i są w rzeczywistości w dużej mierze krótkimi nagraniami audio. Więc to nie jest tak, że chciałbym, aby automake "sprawdził", czy każdy plik, który chcę zainstalować, został rzeczywiście utworzony, ponieważ albo tam jest, czy jakikolwiek plik tam jest, wiem, że chcę go zainstalować i cokolwiek innego. plik nie jest, nie powinien być instalowany. Wiem, że jest to uzasadnienie stosowane w innych miejscach, aby nie wykonywać instancji w postaci wieloznacznej, ale wszystkie możliwe przyczyny nie mają tutaj zastosowania.

Odpowiedz

10

Zauważyłem, że instalowanie setek plików osobno sprawia, że ​​jest to długo trwające wywołanie make install. Miałem podobny przypadek, w którym chciałem zainstalować setki plików, zachowując strukturę katalogów i nie chciałem zmieniać pliku Makefile.am za każdym razem, gdy plik został dodany do kolekcji lub usunięty z niej.

włączyłem archiwum LZMA plików w moim rozkładzie, wykonane zasady automake tak:

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 

ten sposób automake instaluje My_big_archive.tar.lz w katalogu $(pkgdata) i wydobywa go tam, robiąc listę wszystkie pliki, które się w nim znajdowały, aby móc je później odinstalować. Działa to również znacznie szybciej niż umieszczanie każdego pliku jako celu instalacji, nawet jeśli tworzyłeś tę listę automatycznie.

+1

Dlaczego instalujesz to w '$ (pkgdatadir)'? Po prostu wyodrębnij go z '$ (srcdir)' w 'install-data-hook'. Użyj czegoś takiego jak 'EXTRA_DIST = giant_archive.tar.lzma', aby było rozpowszechniane. –

+0

Eh, dobry punkt. – ptomato

+3

Trzy drobne sugestie, niezwiązane z faktycznym pytaniem. Zastąpiłbym "cat xxx | yyy | zzz' przez 'yyyy adl

11

Chciałbym użyć skryptu do generowania Makefile fragment, który zawiera wszystkie pliki:

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

a następnie dołączyć tę subfiles.mk od głównego Makefile.am:

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

Druga opcja jest to EXTRA_DIST = subdir, a następnie należy wprowadzić własne reguły: install-data-local i uninstall-local.

Problem polega na tym, że EXTRA_DIST = subdir rozpowszechnia wszystkie pliki w numerze subdir/, w tym pliki kopii zapasowych, pliki konfiguracyjne (np. Z VCS) i inne rzeczy, których nie chce się rozpowszechniać.

Korzystanie ze skryptu jak powyżej pozwala filtrować pliki, które naprawdę chcesz dystrybuować.

+0

Tylko jedna uwaga: Pierwsza nie działa, ponieważ kończy się niepowodzeniem z "make [2]: execvp:/bin/bash: Lista argumentów za długa" –

+0

Wow! Generuję 'Makefile's z dość dużymi listami plików, ale nie * jeszcze * zdałem sobie sprawę, że pewnego dnia osiągnęłbym limit rozmiaru linii poleceń! – adl

+0

Czy możesz podać przykład drugiej opcji? Jeśli po prostu "cp -Rf" dostaję złe uprawnienia i muszę chmodować po cp (lub może umask przed cp). Sprawdziłem automatycznie generowane reguły, używają one $ (INSTALL_DATA) zamiast cp, ale w tym przypadku należy określić wszystkie pliki, więc wymagałoby to "find" itp. Jaki jest najlepszy, najbardziej przenośny sposób instalacji całego katalogu w install-data-local? – marcin

3

Napisałbym skrypt (jako osobny skrypt powłoki lub w Makefile.am), który jest uruchamiany jako część celu install-data-hook.