@@ -119,61 +119,120 @@ if [[ "${source_dir}" == *.tgz ]] || [[ "${source_dir}" == *.tar.gz ]]; then
119119 source_dir=" $filename "
120120fi
121121
122+ prefix=" usr/python"
122123cd " ${source_dir} "
123- ./configure ${PYTHON_CONFIG} " --with-ensurepip=install" " --prefix=/usr "
124+ ./configure ${PYTHON_CONFIG} " --with-ensurepip=install" " --prefix=/${prefix} "
124125HOME=" ${PYTHON_BUILD_DIR} " make -j" $NPROC " DESTDIR=" $APPDIR " install
125126
126127
127- # Copy any TCl/Tk shared data
128- if [ -d " /usr/share/tcltk" ]; then
129- cp -r " /usr/share/tcltk" " ${APPDIR} /usr/share/tcltk"
130- fi
131-
132-
133128# Install any extra requirements with pip
134129if [ ! -z " ${PIP_REQUIREMENTS} " ]; then
135- cd " ${APPDIR} /usr "
130+ cd " ${APPDIR} /${prefix} /bin "
136131 pythons=( " python" ? " ." ? )
137- HOME=" ${PYTHON_BUILD_DIR} " PYTHONHOME=$PWD ./bin /${pythons[0]} -m pip install ${PIP_OPTIONS} ${PIP_REQUIREMENTS}
132+ HOME=" ${PYTHON_BUILD_DIR} " PYTHONHOME=$( readlink -f ${ PWD} /.. ) . /${pythons[0]} -m pip install ${PIP_OPTIONS} ${PIP_REQUIREMENTS}
138133fi
139134
140135
141136# Prune the install
142- cd " $APPDIR /usr "
137+ cd " $APPDIR /${prefix} "
143138rm -rf " bin/python" * " -config" " bin/idle" * " include" " lib/pkgconfig" \
144139 " share/doc" " share/man" " lib/libpython" * " .a" " lib/python" * " /test" \
145140 " lib/python" * " /config-" * " -x86_64-linux-gnu"
146141
147142
148143# Wrap the Python executables
149- cd " $APPDIR /usr /bin"
144+ cd " $APPDIR /${prefix} /bin"
150145set +e
151146pythons=$( ls " python" " python" ? " python" ? " ." ? " python" ? " ." ? " m" 2> /dev/null)
152147set -e
148+ cd " $APPDIR /usr/bin"
153149for python in $pythons
154150do
155151 if [ ! -L " $python " ]; then
156- mv " $python " " . $ python"
152+ strip " $APPDIR / ${prefix} /bin/ ${ python} "
157153 cp " ${BASEDIR} /share/python-wrapper.sh" " $python "
158154 sed -i " s|[{][{]PYTHON[}][}]|$python |g" " $python "
155+ sed -i " s|[{][{]PREFIX[}][}]|$prefix |g" " $python "
159156 fi
160157done
161158
162159
163160# Sanitize the shebangs of local Python scripts
164- for exe in $( ls " ${APPDIR} /usr/bin" * )
161+ cd " $APPDIR /${prefix} /bin"
162+ for exe in $( ls " ${APPDIR} /${prefix} /bin" * )
165163do
166- sed -i ' 1s|^#!.*\(python[0-9.]*\)|#!/bin/sh\n"exec" "$(dirname $(readlink -f $\{0\}))/\1" "$0" "$@"|' " $exe "
164+ sed -i ' 1s|^#!.*\(python[0-9.]*\)|#!/bin/sh\n"exec" "$(dirname $(readlink -f $\{0\}))/../../bin/ \1" "$0" "$@"|' " $exe "
167165done
168166
169167
170168# Set a hook in Python for cleaning the path detection
171- cp " $BASEDIR /share/sitecustomize.py" " $APPDIR " /usr/lib/python* /site-packages
169+ cp " $BASEDIR /share/sitecustomize.py" " $APPDIR " /${prefix} /lib/python* /site-packages
170+
172171
172+ # Patch binaries and install dependencies
173+ excludelist=$( cat " ${BASEDIR} /share/excludelist" | sed ' s|#.*||g' | sed -r ' /^\s*$/d' )
173174
174- # Relocate the Python extension modules for the dynamic linker
175+ is_excluded () {
176+ local e
177+ for e in ${excludelist} ; do
178+ [[ " $e " == " $1 " ]] && echo " true" && return 0
179+ done
180+ return 0
181+ }
182+
183+ set +e
184+ patchelf=$( command -v patchelf)
185+ set -e
186+ patchelf=" ${patchelf:- ${BASEDIR} / usr/ bin/ patchelf} "
187+
188+ patch_binary () {
189+ local name=" $( basename $1 ) "
190+
191+ if [ " ${name:: 3} " == " lib" ]; then
192+ if [ ! -f " ${APPDIR} /usr/lib/${name} " ]; then
193+ echo " Patching dependency ${name} "
194+ strip " $1 "
195+ " ${patchelf} " --set-rpath ' $ORIGIN' " $1 "
196+ ln -rs " $1 " " ${APPDIR} /usr/lib"
197+ fi
198+ else
199+ echo " Patching C-extension module ${name} "
200+ strip " $1 "
201+
202+ local rel=$( dirname $( readlink -f $1 ) )
203+ rel=${rel# ${APPDIR} / usr}
204+ rel=$( echo $rel | sed ' s|/[_a-zA-Z0-9.-]*|/..|g' )
205+ " ${patchelf} " --set-rpath ' $ORIGIN:$ORIGIN' " ${rel} /lib" " $1 "
206+ fi
207+
208+ local deps
209+ for deps in $( ldd $1 ) ; do
210+ if [[ " ${deps:: 1} " == " /" ]] && [[ " ${deps} " != " ${APPDIR} " * ]]; then
211+ local lib=" $( basename ${deps} ) "
212+ if [ ! -f " ${APPDIR} /usr/lib/${lib} " ]; then
213+ if [ ! " $( is_excluded ${lib} ) " ]; then
214+ echo " Installing dependency ${lib} "
215+ cp " ${deps} " " ${APPDIR} /usr/lib"
216+ strip " ${APPDIR} /usr/lib/${lib} "
217+ " ${patchelf} " --set-rpath ' $ORIGIN' " ${APPDIR} /usr/lib/${lib} "
218+ fi
219+ fi
220+ fi
221+ done
222+ return 0
223+ }
224+
225+ cd " $APPDIR /${prefix} /bin"
175226python=$( ls " python" ? " ." ? )
176- cd " $APPDIR /usr/lib"
177- mv " ${python} /lib-dynload/" * " ."
178- rm -rf " ${python} /lib-dynload"
179- ln -fs " ../" " ${python} /lib-dynload"
227+ mkdir -p " ${APPDIR} /usr/lib"
228+ cd " ${APPDIR} /${prefix} /lib/${python} "
229+ find " lib-dynload" -name ' *.so' -type f | while read file; do patch_binary " ${file} " ; done
230+ find " site-packages" -name ' *.so' -type f | while read file; do patch_binary " ${file} " ; done
231+ find " site-packages" -name ' lib*.so*' -type f | while read file; do patch_binary " ${file} " ; done
232+
233+
234+ # Copy any TCl/Tk shared data
235+ if [[ -d " /usr/share/tcltk" ]] && [[ ! -d " ${APPDIR} /${prefix} /share/tcltk" ]]; then
236+ mkdir -p " ${APPDIR} /${prefix} /share"
237+ cp -r " /usr/share/tcltk" " ${APPDIR} /${prefix} /share"
238+ fi
0 commit comments