From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mediacenter.hi.pengutronix.de ([2001:6f8:1178:2::65]) by metis.ext.pengutronix.de with esmtp (Exim 4.72) (envelope-from ) id 1S9fGz-0007Hf-JP for ptxdist@pengutronix.de; Mon, 19 Mar 2012 17:17:29 +0100 Received: from mol by mediacenter.hi.pengutronix.de with local (Exim 4.72) (envelope-from ) id 1S9fGz-0002js-Hw for ptxdist@pengutronix.de; Mon, 19 Mar 2012 17:17:29 +0100 Date: Mon, 19 Mar 2012 17:17:29 +0100 From: Michael Olbrich Message-ID: <20120319161729.GG20481@pengutronix.de> References: <1332097818-23592-1-git-send-email-linux@bohmer.net> <1332097818-23592-5-git-send-email-linux@bohmer.net> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1332097818-23592-5-git-send-email-linux@bohmer.net> Subject: Re: [ptxdist] [PATCH 4/9] [x86_64, multilib] Make packages install their libraries at the right place Reply-To: ptxdist@pengutronix.de List-Id: PTXdist Development Mailing List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: ptxdist-bounces@pengutronix.de Errors-To: ptxdist-bounces@pengutronix.de To: ptxdist@pengutronix.de On Sun, Mar 18, 2012 at 08:10:13PM +0100, Remy Bohmer wrote: > While cross-compiling for x86_64 in a multilib configuration we need to > install the libraries conform the Filesystem Hierarchy Standard (FHS). > Summarised this will be for multilib: > * All libraries compiled for and used in 64-bit applications need to be > installed in /lib64 or /usr/lib64. > * All libraries compiled for and used in 32-bit applications need to be > installed in /lib or /usr/lib. > * All executables will still find its way in the regular /bin and /sbin > paths. > * The Operating System itself and all its libraries should only be compiled > in 64 bit mode. It should not be a mix between 32 and 64 bit libraries. > 32 bit support will only contain the libraries that are required by > 32-bit-applications to link against. > > This is also conform what many distros derived from Redhat have in their > setup. Note that Debian based distros follow a somewhat different setup. > > Note that we use the compiler toolchain to tell us at which paths we > need to install the libraries. This means that if you build for a x86_64 > target _without_ multilib support the libraries will likely end up in the > classical /lib and /usr/lib directories, but that is completely steered > by the compiler toolchain configuration. (it follows the location where > the corresponding dynamic linker is expected to be installed) > > So, this change makes ptxdist follow the sysroot of the compiler toolchain > more such that preliminary multilib support can be achieved. Preliminary > in the sense that only still one C-library is being installed. > In another changeset the support for a 2nd C-library installation will be > added. At least after this change (and a few subsequent ptxdist makefile > fixes) the /lib and /usr/lib area will only contain the contents that belong > there in multilib environment. > > Signed-off-by: Remy Bohmer > --- > rules/pre/Rules.make | 11 ++++++++++- > scripts/lib/ptxd_make_00-init.sh | 30 ++++++++++++++++++++++++++---- > scripts/lib/ptxd_make_xpkg_pkg.sh | 4 ++-- > 3 files changed, 38 insertions(+), 7 deletions(-) > > diff --git a/rules/pre/Rules.make b/rules/pre/Rules.make > index 1d6da52..d6d40e0 100644 > --- a/rules/pre/Rules.make > +++ b/rules/pre/Rules.make > @@ -174,6 +174,15 @@ CROSS_ENV_PROGS := \ > $(CROSS_ENV_CPP_FOR_BUILD) \ > $(CROSS_ENV_LINK_FOR_BUILD) > > +# Outputs 'lib' or 'lib64', derived from the ld-linux.so.2 from the compiler toolchain > +CROSS_LIB_DIR := $(shell \ > + dl="$$(echo 'int main(void){return 0;}' | \ > + ${CROSS_CC} ${CROSS_CPPFLAGS} ${CROSS_CFLAGS} -x c -o /dev/null -v - 2>&1 | \ > + sed -n -e 's/.* -dynamic-linker \([^ ]*\).*/\1/p')"; \ > + lib_dir="$${dl%%/ld-linux*}"; \ > + echo "$${lib_dir\#/}" \ > +) This is the same as ptxd_get_lib_dir, right? This function should be defined here: CROSS_LIB_DIR := $(shell ptxd_get_lib_dir) I think. Michael > + > # > # prepare to use pkg-config with wrapper which takes care of > # $(PTXDIST_SYSROOT_TARGET). The wrapper's magic doesn't work when > @@ -266,7 +275,7 @@ CROSS_ENV := \ > # > > CROSS_AUTOCONF_SYSROOT_USR := \ > - --prefix=/usr --sysconfdir=/etc --localstatedir=/var > + --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libdir=/usr/$(CROSS_LIB_DIR) > > CROSS_AUTOCONF_SYSROOT_ROOT := \ > --prefix= > diff --git a/scripts/lib/ptxd_make_00-init.sh b/scripts/lib/ptxd_make_00-init.sh > index da72d29..d08cb92 100644 > --- a/scripts/lib/ptxd_make_00-init.sh > +++ b/scripts/lib/ptxd_make_00-init.sh > @@ -63,7 +63,10 @@ ptxd_init_arch() { > # out: PTXDIST_SYSROOT_TOOLCHAIN > # > ptxd_init_sysroot_toolchain() { > - local compiler_prefix="$(ptxd_get_ptxconf PTXCONF_COMPILER_PREFIX)" > + local compiler_prefix extra_cppflags extra_cflags > + compiler_prefix="$(ptxd_get_ptxconf PTXCONF_COMPILER_PREFIX)" > + extra_cppflags="$(ptxd_get_ptxconf PTXCONF_TARGET_EXTRA_CPPFLAGS)" > + extra_cflags="$(ptxd_get_ptxconf PTXCONF_TARGET_EXTRA_CFLAGS)" > > # > # no compiler prefix specified means using plain "gcc" > @@ -75,7 +78,7 @@ ptxd_init_sysroot_toolchain() { > local sysroot > > sysroot="$(echo 'int main(void){return 0;}' | \ > - ${compiler_prefix}gcc -x c -o /dev/null -v - 2>&1 | \ > + ${compiler_prefix}gcc ${extra_cppflags} ${extra_cflags} -x c -o /dev/null -v - 2>&1 | \ > sed -ne "/.*collect2.*/s,.*--sysroot=\([^[:space:]]*\).*,\1,p" && \ > check_pipe_status)" > > @@ -119,6 +122,22 @@ ptxd_init_collectionconfig() { > > > # > +# out: 'lib' or 'lib64', derived from the ld-linux.so.2 from the compiler toolchain > +# > +ptxd_get_lib_dir() { > + local dl lib_dir extra_cppflags extra_cflags > + compiler_prefix="$(ptxd_get_ptxconf PTXCONF_COMPILER_PREFIX)" > + extra_cppflags="$(ptxd_get_ptxconf PTXCONF_TARGET_EXTRA_CPPFLAGS)" > + extra_cflags="$(ptxd_get_ptxconf PTXCONF_TARGET_EXTRA_CFLAGS)" > + > + dl="$(echo 'int main(void){return 0;}' | \ > + ${compiler_prefix}gcc ${extra_cppflags} ${extra_cflags} -x c -o /dev/null -v - 2>&1 | \ > + sed -n -e 's/.* -dynamic-linker \([^ ]*\).*/\1/p')" > + lib_dir="${dl%%/ld-linux*}" > + echo "${lib_dir#/}" > +} > + > +# > # setup compiler and pkgconfig environment > # > # in: > @@ -140,6 +159,9 @@ ptxd_init_cross_env() { > prefix=( ${PTXDIST_PATH_SYSROOT_PREFIX} ) > IFS="${orig_IFS}" > > + local -a lib_dir > + lib_dir=$(ptxd_get_lib_dir) > + > # add "-isystem /include" > local -a cppflags > cppflags=( "${prefix[@]/%//include}" ) > @@ -147,7 +169,7 @@ ptxd_init_cross_env() { > > # add "-L/lib -Wl,-rpath-link -Wl," > local -a ldflags > - ldflags=( "${prefix[@]/%//lib}" ) > + ldflags=( "${prefix[@]/%//${lib_dir}}" ) > ldflags=( "${ldflags[@]/#/-L}" "${ldflags[@]/#/-Wl,-rpath-link -Wl,}" ) > > export \ > @@ -166,7 +188,7 @@ ptxd_init_cross_env() { > > # add /lib/pkgconfig and /share/pkgconfig > local -a pkg_libdir > - pkg_libdir=( "${prefix[@]/%//lib/pkgconfig}" "${prefix[@]/%//share/pkgconfig}" ) > + pkg_libdir=( "${prefix[@]/%//${lib_dir}/pkgconfig}" "${prefix[@]/%//share/pkgconfig}" ) > > # > # PKG_CONFIG_PATH contains additional pkg-config search > diff --git a/scripts/lib/ptxd_make_xpkg_pkg.sh b/scripts/lib/ptxd_make_xpkg_pkg.sh > index c03f19e..239fa06 100644 > --- a/scripts/lib/ptxd_make_xpkg_pkg.sh > +++ b/scripts/lib/ptxd_make_xpkg_pkg.sh > @@ -605,7 +605,7 @@ ptxd_install_package() { > done > done > > - for dir in "${pkg_pkg_dir}/"{,usr/}lib; do > + for dir in "${pkg_pkg_dir}/"{,usr/}lib{,64}; do > find "${dir}" \( -type f -o -type l \) \ > -a -name "*.so*" 2>/dev/null | while read file; do > ptxd_install_generic - "${file#${pkg_pkg_dir}}" || > @@ -638,7 +638,7 @@ ptxd_install_lib() { > local lib="$1" > shift > > - local file="$(for dir in "${pkg_pkg_dir}/"{,usr/}lib; do > + local file="$(for dir in "${pkg_pkg_dir}/"{,usr/}lib{,64}; do I don't like the explicit lib64 here. Next we'll get some debian like multilib toolchain and it's lib/x86_64-linux-gnu oor so. Can't we get that from ptxd_get_lib_dir? Michael > find "${dir}" -type f -path "${dir}/${lib}.so*"; done 2>/dev/null)" > > if [ ! -f "${file}" ]; then > -- > 1.7.5.4 > > > -- > ptxdist mailing list > ptxdist@pengutronix.de > -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | -- ptxdist mailing list ptxdist@pengutronix.de