2011-09-14 14 views
16

Ponieważ muszę zainstalować wiele wersji Pythona na wielu serwerach Oracle Linux, które są budowane w procesie kickstart, chciałem zbudować rpm Pythona dla naszego repozytorium yuma. Byłem w stanie zbudować Python ręcznie, używając 'make altinstall', który nie jest instalowany przez domyślną instalację systemu Python, więc pomyślałem, że to będzie droga.Python RPM, który zbudowałem, nie będzie instalował

Po wielu prób i błędów udało mi się zbudować rpm wychodząc z .bz2 Pythona 2.7 pakietu - ale teraz, gdy próbuję go zainstalować, pojawia się błąd:

error: Failed dependencies: 
    /usr/local/bin/python is needed by Python-2.7.2-1.i386 

Co się .. . ??? Python jest tym, co próbuję zainstalować !!! I domyślny system Python (2.4) znajduje się w/usr/bin/python !!! Moją lokalizacją prototypowania dla katalogu Pythona jest /tmp/python2.7 (a plik wykonywalny to /tmp/python2.7/bin/python2.7). Dlaczego więc szuka w/usr/local/bin?

Oto sedno mojego RPM SPEC:

%prep 
%setup -q 

%build 
./configure --prefix=/tmp/python2.7 
make 

%install 

make altinstall 

I przyjrzeć się bliżej w dzienniku budowania rpm i widzę:

Requires: /bin/sh /tmp/python2.7/bin/python2.7 /usr/bin/env /usr/local/bin/python libc.so.6 libc.so.6(GLIBC_2.0)...[a lot more...] 

Ok, więc nie ma gdzie/usr/local/bin wchodzi ... Teraz pytanie brzmi: jak to określa te wymagania? Czy podałem coś niewłaściwego? Czy muszę coś zmienić?

Podobnie jak wielu początkujących rpm, otrzymuję część konstrukcyjną, ale tak naprawdę nie "grokuję" tego, co dzieje się na końcu rpmbuild i co faktycznie dostaje się do pliku rpm (innego niż pliki określone w% plików), a następnie, co faktycznie dzieje się podczas instalacji rpm.

Czy ktoś może zasugerować, dlaczego moja instalacja się nie udała lub co przeczytałem, aby zrozumieć, dlaczego moja kompilacja rpm wymaga tego, co próbuję zbudować?

Odpowiedz

18

powinien być w stanie rozwiązać ten problem poprzez dodanie następującej linii do pliku spec:

AutoReq: no 

Oto moje rozumienie, dlaczego jest to konieczne. Kiedy rpmbuild działa poprzez pliki .py z #! (shebang) automatycznie doda plik binarny, który shebang określa jako wymaganie. Nie tylko to, że jeśli shebang jest #!/usr/bin/env python, doda zależność od tego, co się rozwiąże (pierwszy pyton na $PATH).

Musisz wyłączyć automatyczne przetwarzanie wymagań lub znaleźć wszystkie shebang, które spowodują problemy i zmienić je na coś innego.

+0

Brzmi obiecująco - spróbuję ... – Ilane

+0

>>> print "Dziękuję, F.J. !!!" Dziękuję, F.J !!! – Ilane

+1

Nie należy wyłączać przetwarzania zależności w tym przypadku. To może przerwać pakiet Pythona, ponieważ RPM nie będzie wiedział, z czego pliki zależą. Prawidłową rzeczą jest załatanie pliku zawierającego błędną linię shebang. – jayhendren

6

rpmbuild może stać się całkiem sprytny i jest to jeden z tych przypadków. To prawdopodobnie wyciągnął /usr/local/bin/python z jednego z plików skryptów zawierających coś takiego:

#!/usr/local/bin/python 

na szczycie. Spróbuj grep'ing dla tej ścieżki w plikach w twoim pliku bz2.

+0

Są dwa - nie chcę jednak pozbyć się źródeł, jeśli nie muszę, ponieważ program% setup rozpakowuje je z oryginalnego pobranego pliku - czy jest jakiś sposób obejścia tego problemu? – Ilane

+1

To jest poprawna odpowiedź. W kodzie źródłowym Pythona znajduje się plik z linią shebang zawierającą '/ usr/local/bin/python'. @Ilane, poprawną rzeczą jest napisanie łatki do kodu źródłowego. Standardową częścią budowania RPM jest pisanie łat.Zauważysz, że w pliku zawierającym szkodliwy shebang jest komentarz do tego, że pakiety pakujące Pythona będą musiały napisać łatkę, jeśli nie zainstalują Pythona w '/ usr/local'. – jayhendren

+1

W szczególności problemem jest "cgi.py". Specyfikacja Fedory ([python 3] (http://pkgs.fedoraproject.org/cgit/python3.git/tree/python3.spec), [python 2] (http://pkgs.fedoraproject.org/cgit/python .git/tree/python.spec)) napraw to, uruchamiając 'Tools/scripts/pathfix.py'. –

Powiązane problemy