Mailing List Archive

libraries on multilib profile
Hi all
i'm using multilib profile (default/linux/sparc/experimental/multilib)

when i compile something simple, like socat, i'm able to have it on 32 or 64 bit
but i don't found a way to have libraries on 32 AND 64 bit (lib32 and lib64)

for example
if i want a 64bit mysql, i need a 64bit ncurses, and so on

if i add -m64 to CFLAGS, portage will refuse to install it to lib32 due to multilib-strict FEATURE (which i think is correct)

anybody has any workaround for this? i took a look to glibc ebuild, but it wasn't much help


thanks
Re: libraries on multilib profile [ In reply to ]
Access to this information requires level 4 clearance!



Nah, just kidding, but with the information in this mail you could
seriously break your system, use it carefully.


There's very little documentation about how multilib works (in general
and in Gentoo), most of it you'll find in mailing list archives.

You understood the basics correctly, for multilib a library must be
compiled twice, once in 32 bit(with -m32 cflag) and once in 64 bit(with
- -m64 cflag).

However glibc is a bad example since it's not a "normal" library. To get
glibc to compile for a specific bitness you have to pass different
configure-hosts.

2.8 has these configure-hosts:

UltraSPARC CPus:
sparcv9-*-linux-gnu: 32 bit
sparc64-*-linux-gnu: 64 bit
UltraSPARC III CPUs:
sparcv9b-*-linux-gnu: 32 bit
sparc64b-*-linux-gnu: 64 bit
UltraSPARC T1 CPUs:
sparcv9v-*-linux-gnu: 32bit
sparc64v-*-linux-gnu: 64bit
UltraSPARC T2 CPUs:
sparcv9v2-*-linux-gnu: 32bit
sparc64v2-*-linux-gnu: 64bit

The glibc ebuild determines which to use according to your -mcpu cflag.

For instance if you have "-mcpu=ultrasparc" a non multilib glibc would
be compiled like this:

configure --host=sparcv9-unknown-linux-gnu
make
make install

And a multilib one would be compiled like this:

configure --host=sparcv9-unknown-linux-gnu
make
make install
configure --host=sparc64-unknown-linux-gnu
make
make install


A "normal" library doesn't really care about bitness, it just trusts the
compiler to do it's job right.

So a non multilib ncurses would be compiled like this

export CFLAGS="${CFLAGS} -m32"
configure
make
make install

and a multilib one like this:

export CFLAGS="${CFLAGS} -m32"
configure
make
make install
export CFLAGS="${CFLAGS} -m64"
configure
make
make install


Ok so much about general multilib stuff, now how Gentoo does it:

The examples above only work if the library's Makefile respects the
user's cflags. Sadly, not all Makefiles do that.

Therefore Gentoo's gcc contains a hack to allow one to pass cflags which
are _always_ respected, no matted how messed up the Makefile is.

If you excute

gcc foo.c

it really is

`eval echo gcc \$CFLAGS_$ABI foo.c`

for instance

export ABI="sparc64"
export CFLAGS_sparc64="-m64"
gcc foo.c

will have the same effect as

gcc -m64 foo.c


These variables are set in your profile, if you execute emerge --info
- --verbose you'll see:

CFLAGS_sparc32="" # -m32 it the default, no need to set it
CFLAGS_sparc64="-m64"
ABI="sparc32"

You may also have noted these variables which are also set in the profile:

DEFAULT_ABI="sparc32"
KERNEL_ABI="sparc64"
MULTILIB_ABIS="sparc32 sparc64" # non multilib profiles have "sparc32"

As you can guess a multilib enabled ebuild would need to do:

for ABI in ${MULTILIB_ABIS}; do
compile_and_install
done

But that means the ebuild would have to be rewritten to do that, only
very few ebuils are written like that.

There's also bug #145737 [0] to add native support for this to portage
directly and eluminate the need to rewrite the ebuilds but it's far from
beeing implemented ;)

Back to topic: That means if you want a 64 bit mysql you have 2 options:

- - rewrite the mysql ebuild and all ebuilds it depends on

Don't do it. It's way to much work and it would never get into the tree.

- - use what you learned above and portage's ROOT support to make portage
create a /opt/mysql64 dir containing a 64 bit mysql and the 64 bit libraries

With the ROOT environment variable you can tell portage to use a ROOT
other than /, in this case something like /opt/mysql64. Sort of a
second, smaller Gentoo installation.
(This is similar to what the Gentoo Prefix project [1] does)

export ROOT="/opt/mysql64"

Use the ABI environment variable to use the sparc64 ABI.

export DEFAULT_ABI="sparc64"
export ABI="${DEFAULT_ABI}"

And merge mysql:

emerge mysql

Which will fail because gcc won't find the required 64 bit libraries.

You need to tell gcc(and glibc's loader) to also search in
/opt/mysql64/lib64 and /opt/mysql64/usr/lib64 for libraries and
/opt/mysql64/usr/include for headers, like this:

CFLAGS_sparc64="-m64" # keep this
CFLAGS_sparc64="${CFLAGS_sparc64} -L/opt/mysql64/lib64"
CFLAGS_sparc64="${CFLAGS_sparc64} -L/opt/mysql64/usr/lib64"
CFLAGS_sparc64="${CFLAGS_sparc64} -Wl,-rpath=/opt/mysql64/lib64"
CFLAGS_sparc64="${CFLAGS_sparc64} -Wl,-rpath=/opt/mysql64/usr/lib64"
CFLAGS_sparc64="${CFLAGS_sparc64} -I/opt/mysql64/usr/include"
export CFLAGS_sparc64


So much for now.

Please note that I didn't really test this, it may not even compile, let
alone run.
But considering that MySQL works on Linux/SPARC(32 bit) and Linux/AMD64
and Solaris/SPARC(32 and 64 bit) chances are quite good.

Just keep in mind that your are probably the only one using a
configuration like this so when you hit a bug you may find that nobody
is able (or willing) to help you.


Ps: Is there a reason you compiled socat in 64 bit? Or just for
testing/learning purpose? Afaik the only packages we have in the tree
which could benefit from beeing compile in 64 bit are mysql and postgresql.

Cheers,
Friedrich

[0] http://bugs.gentoo.org/show_bug.cgi?id=145737
[1] http://www.gentoo.org/proj/en/gentoo-alt/prefix/

Gustavo Panizzo <gfa> schrieb:
> Hi all
> i'm using multilib profile (default/linux/sparc/experimental/multilib)
>
> when i compile something simple, like socat, i'm able to have it on 32 or 64 bit
> but i don't found a way to have libraries on 32 AND 64 bit (lib32 and lib64)
>
> for example
> if i want a 64bit mysql, i need a 64bit ncurses, and so on
>
> if i add -m64 to CFLAGS, portage will refuse to install it to lib32 due to multilib-strict FEATURE (which i think is correct)
>
> anybody has any workaround for this? i took a look to glibc ebuild, but it wasn't much help
>
>
> thanks
>
>
Re: libraries on multilib profile [ In reply to ]
nice, thanks for the information

i compiled socat in 64 bit just to try if the toolchain is working fine. i just plan to have mysql on 64bit, anything else will be 32bit

thanks

----- Original Message -----
From: "Friedrich Oslage" <bluebird@gentoo.org>
To: gentoo-sparc@lists.gentoo.org
Sent: Saturday, March 7, 2009 12:46:40 PM (GMT-0300) Auto-Detected
Subject: Re: [gentoo-sparc] libraries on multilib profile


Access to this information requires level 4 clearance!



Nah, just kidding, but with the information in this mail you could
seriously break your system, use it carefully.


There's very little documentation about how multilib works (in general
and in Gentoo), most of it you'll find in mailing list archives.

You understood the basics correctly, for multilib a library must be
compiled twice, once in 32 bit(with -m32 cflag) and once in 64 bit(with
- -m64 cflag).

However glibc is a bad example since it's not a "normal" library. To get
glibc to compile for a specific bitness you have to pass different
configure-hosts.

2.8 has these configure-hosts:

UltraSPARC CPus:
sparcv9-*-linux-gnu: 32 bit
sparc64-*-linux-gnu: 64 bit
UltraSPARC III CPUs:
sparcv9b-*-linux-gnu: 32 bit
sparc64b-*-linux-gnu: 64 bit
UltraSPARC T1 CPUs:
sparcv9v-*-linux-gnu: 32bit
sparc64v-*-linux-gnu: 64bit
UltraSPARC T2 CPUs:
sparcv9v2-*-linux-gnu: 32bit
sparc64v2-*-linux-gnu: 64bit

The glibc ebuild determines which to use according to your -mcpu cflag.

For instance if you have "-mcpu=ultrasparc" a non multilib glibc would
be compiled like this:

configure --host=sparcv9-unknown-linux-gnu
make
make install

And a multilib one would be compiled like this:

configure --host=sparcv9-unknown-linux-gnu
make
make install
configure --host=sparc64-unknown-linux-gnu
make
make install


A "normal" library doesn't really care about bitness, it just trusts the
compiler to do it's job right.

So a non multilib ncurses would be compiled like this

export CFLAGS="${CFLAGS} -m32"
configure
make
make install

and a multilib one like this:

export CFLAGS="${CFLAGS} -m32"
configure
make
make install
export CFLAGS="${CFLAGS} -m64"
configure
make
make install


Ok so much about general multilib stuff, now how Gentoo does it:

The examples above only work if the library's Makefile respects the
user's cflags. Sadly, not all Makefiles do that.

Therefore Gentoo's gcc contains a hack to allow one to pass cflags which
are _always_ respected, no matted how messed up the Makefile is.

If you excute

gcc foo.c

it really is

`eval echo gcc \$CFLAGS_$ABI foo.c`

for instance

export ABI="sparc64"
export CFLAGS_sparc64="-m64"
gcc foo.c

will have the same effect as

gcc -m64 foo.c


These variables are set in your profile, if you execute emerge --info
- --verbose you'll see:

CFLAGS_sparc32="" # -m32 it the default, no need to set it
CFLAGS_sparc64="-m64"
ABI="sparc32"

You may also have noted these variables which are also set in the profile:

DEFAULT_ABI="sparc32"
KERNEL_ABI="sparc64"
MULTILIB_ABIS="sparc32 sparc64" # non multilib profiles have "sparc32"

As you can guess a multilib enabled ebuild would need to do:

for ABI in ${MULTILIB_ABIS}; do
compile_and_install
done

But that means the ebuild would have to be rewritten to do that, only
very few ebuils are written like that.

There's also bug #145737 [0] to add native support for this to portage
directly and eluminate the need to rewrite the ebuilds but it's far from
beeing implemented ;)

Back to topic: That means if you want a 64 bit mysql you have 2 options:

- - rewrite the mysql ebuild and all ebuilds it depends on

Don't do it. It's way to much work and it would never get into the tree.

- - use what you learned above and portage's ROOT support to make portage
create a /opt/mysql64 dir containing a 64 bit mysql and the 64 bit libraries

With the ROOT environment variable you can tell portage to use a ROOT
other than /, in this case something like /opt/mysql64. Sort of a
second, smaller Gentoo installation.
(This is similar to what the Gentoo Prefix project [1] does)

export ROOT="/opt/mysql64"

Use the ABI environment variable to use the sparc64 ABI.

export DEFAULT_ABI="sparc64"
export ABI="${DEFAULT_ABI}"

And merge mysql:

emerge mysql

Which will fail because gcc won't find the required 64 bit libraries.

You need to tell gcc(and glibc's loader) to also search in
/opt/mysql64/lib64 and /opt/mysql64/usr/lib64 for libraries and
/opt/mysql64/usr/include for headers, like this:

CFLAGS_sparc64="-m64" # keep this
CFLAGS_sparc64="${CFLAGS_sparc64} -L/opt/mysql64/lib64"
CFLAGS_sparc64="${CFLAGS_sparc64} -L/opt/mysql64/usr/lib64"
CFLAGS_sparc64="${CFLAGS_sparc64} -Wl,-rpath=/opt/mysql64/lib64"
CFLAGS_sparc64="${CFLAGS_sparc64} -Wl,-rpath=/opt/mysql64/usr/lib64"
CFLAGS_sparc64="${CFLAGS_sparc64} -I/opt/mysql64/usr/include"
export CFLAGS_sparc64


So much for now.

Please note that I didn't really test this, it may not even compile, let
alone run.
But considering that MySQL works on Linux/SPARC(32 bit) and Linux/AMD64
and Solaris/SPARC(32 and 64 bit) chances are quite good.

Just keep in mind that your are probably the only one using a
configuration like this so when you hit a bug you may find that nobody
is able (or willing) to help you.


Ps: Is there a reason you compiled socat in 64 bit? Or just for
testing/learning purpose? Afaik the only packages we have in the tree
which could benefit from beeing compile in 64 bit are mysql and postgresql.

Cheers,
Friedrich

[0] http://bugs.gentoo.org/show_bug.cgi?id=145737
[1] http://www.gentoo.org/proj/en/gentoo-alt/prefix/

Gustavo Panizzo <gfa> schrieb:
> Hi all
> i'm using multilib profile (default/linux/sparc/experimental/multilib)
>
> when i compile something simple, like socat, i'm able to have it on 32 or 64 bit
> but i don't found a way to have libraries on 32 AND 64 bit (lib32 and lib64)
>
> for example
> if i want a 64bit mysql, i need a 64bit ncurses, and so on
>
> if i add -m64 to CFLAGS, portage will refuse to install it to lib32 due to multilib-strict FEATURE (which i think is correct)
>
> anybody has any workaround for this? i took a look to glibc ebuild, but it wasn't much help
>
>
> thanks
>
>