Gentoo Logo
Gentoo Spaceship




Note: Due to technical difficulties, the Archives are currently not up to date. GMANE provides an alternative service for most mailing lists.
c.f. bug 424647
List Archive: gentoo-embedded
Navigation:
Lists: gentoo-embedded: < Prev By Thread Next > < Prev By Date Next >
Headers:
To: gentoo-embedded@g.o
From: Jason <gentoo@...>
Subject: Re: Re: Problem with ROOT
Date: Sun, 21 Oct 2007 19:26:50 -0400
Marc Blumentritt wrote:
> Jason schrieb:
>> Marc Blumentritt wrote:
>>> Jason schrieb:
>>>> If you haven't already, try this [1] out. Could you attach mm_emerge?
>> [snip]
>>>> [1] - http://www.gentoo.org/proj/en/base/embedded/cross-development.xml
>>> I was using [1] to write mm_emerge:
>>>
>>> (build) hive / # cat /mediamachine/tools/mm_emerge
>> Does '(build)' imply you are chrooted into your build environment?  If
>> so, why?
> Because I'm working in a uclibc-stage3 setup.
> 
>>> #!/bin/bash
>>>
>>> check_bind || bind_dirs
>> This looks dangerous (speaking from experience, I overwrote my host's
>> 64bit LSB x86 glibc files with 32bit ARM MSB uclibc once.  Once.  ;-)
>> No, I didn't have to reinstall)  Which dir's are you binding?
> 
> I started with empty dirs (e.g. for $ROOT/var/db) and bind another empty
> dir (e.g. $BIND_DIRS/var/db) to it. After emerging I have everything,
> which is not needed for a running system, under $BIND_DIRS and not in
> $ROOT. The only things I bind from my stage3 to my embedded system, are
> /dev, /proc, and kernel source. Therefore I do not mix my envireonments.

Okay, so you're using bind so you don't have to trim the final image.
Neat.  Personally, I 'cp -ax ${TGTROOT}/* /tmp/img_dir/', then my script
trims out var/db, etc/portage, usr/{src,include}, and so on.  I was also
considering moving to 'rsync -FF ...', but I haven't decided yet.  It
seems more adaptable, but it litters the fs with a lot of .rsync-filter
files (they are excluded from the transfer by the second 'F').

>>> # source and export vars
>>> . /mediamachine/tools/vars
>>> export PORTAGE_CONFIGROOT ROOT
>> If you're in chroot, this should be fine.  If not, I'd be cautious with
>> this.  It would be better (especially since it's in a script) to say:
>>
>> PORTAGE_CONFIGROOT=${SYSROOT} ROOT=${TGTROOT} emerge $*
>>
>> By exporting those vars, they'll be set after the script finishes.  So a
>> later 'emerge foo' in the same terminal would have unanticipated results.
> 
> Not in my case!?
> 
> (build) hive mediamachine # mm_emerge -pv dropbear
> 
> These are the packages that would be merged, in order:
> 
> Calculating dependencies... done!
> [ebuild   R   ] net-misc/dropbear-0.49 to /mediamachine/devroot/
> USE="minimal -multicall -pam -savedconfig -static -zlib" 1,724 kB
> 
> Total: 1 package (1 reinstall), Size of downloads: 1,724 kB
> ****** passwd diff *******
> ###### shadow diff ######
> ++++++ group diff +++++++
> (build) hive mediamachine # echo $ROOT
> 
> (build) hive mediamachine #
> 
> Or did I miss something?

my mistake.  I confused sourcing the bash script with executing it.
Good catch. :-)

>>> cp /etc/passwd /tmp
>>> cp /etc/shadow /tmp
>>> cp /etc/group /tmp
>>>
>>> # run emerge
>>> emerge $*
>>>
>>> echo "****** passwd diff *******"
>>> diff /tmp/passwd /etc/passwd
>>> mv -f /tmp/passwd /etc/passwd
>>> echo "###### shadow diff ######"
>>> diff /tmp/shadow /etc/shadow
>>> mv -f /tmp/shadow /etc/shadow
>>> echo "++++++ group diff +++++++"
>>> diff /tmp/group /etc/group
>>> mv -f /tmp/group /etc/group
>> This shouldn't be necessary.  When portage adds the pkg to your build
>> system ( / ), it will update these files as it is supposed to.  That
>> should be fine.  When you then install the pkg to $ROOT (assuming it is
>> an RDEPEND or pkg you want), it should make the necessary changes to
>> ${ROOT}/etc/{passwd,shadow,group} .
> 
> Yes, should. When I directly install in $ROOT without building first a
> bin pkg, portage does not change any of these files, but does change the
> files of my build system. There is an open bug about this:
> 
> http://bugs.gentoo.org/show_bug.cgi?id=53269

Wow, that's an old one.  I haven't seen this behavior when
cross-compiling.  I also haven't been looking for it either. I'll keep
an eye out.

>>> With bind_dirs I bind some dirs, which I need for building, but not for
>>> running my embedded system. The passwd/shadow/group stuff is there to
>>> show me changes in these files, because they are made to my build system
>>> and not to the embedded system in ROOT. /mediamachine/tools/vars
>>> contains the definition of ROOT and PORTAGE_CONFIGROOT .
>>
>> I think the concept you may be missing here is that portage needs three
>> locations, not two. Portage is going to PORTAGE_CONFIGROOT for portage
>> config stuff (USE flags, package.keywords, and so on), it installs the
>> finished pkg to ROOT, but it needs to go somewhere to find files to
>> build against.  Dependencies have to come from somewhere.  In your case,
>> this is '/'.  This is correct behavior on the part of portage because we
>> don't want to leave a bunch of non-runtime pkgs in ROOT.
> 
> Your are right. I did not know this. Thanks for clarification.
> 
>> So, if it doesn't see zlib.h in /usr/include/, it's going to try to
>> install sys-libs/zlib in '/'.  If sys-libs/zlib is also an RDEPEND for
>> your pkg, it will need to be installed to $ROOT also.  Most likely you
>> only need the shared libraries in ROOT, eg 'libz.so*'.  You should be
>> able to delete the includes and static libs from $ROOT (*.h,*.a,*.la)
>> since those are only used for building.  At least, that works for me :-)
> 
> I will try this and clean up my system. I will see, if this works.

You should be able to use your BINDDIR trick on usr/{include,src},
however, static libs are in the same directories as shared libs.  I
usually do a:

find ${TGTROOT}/ -name "*.a" -print >>${file_list}
find ${TGTROOT}/ -name "*.la" -print >>${file_list}

You could also replace '-print' with '-exec rm -f {} ';'' but I like to
print out the list first, and hit a key to confirm.

>>> Concerning [1], if I would use cross compilation with ROOT and
>>> PORTAGE_CONFIGROOT, would the same happen there? I mean, would some
>>> packages be installed in the build system? That would be really bad,
>>> wouldn't it?
>>
>> Cross-compiling is different because those build dependencies I
>> mentioned above have to be installed in $SYSROOT which equals
>> PORTAGE_CONFIGROOT.  This is necessary because the cross-compiler can't
>> read any of the files in '/', they're for the wrong target architecture.
>> And, as you mentioned, the host system can't understand anything built
>> for the target arch.  Yes, that is very bad.  See my comment above about
>> ARM uclibc being written over the host glibc.  :-)
> 
> OK, thanks again for clarification.

Glad I could help.  Keep in mind, I'm still learning all this myself. ;-)

thx,

Jason.
-- 
gentoo-embedded@g.o mailing list


Replies:
Re: Problem with ROOT
-- Marc Blumentritt
References:
Problem with ROOT
-- Marc Blumentritt
Re: Problem with ROOT
-- Jason
Re: Problem with ROOT
-- Marc Blumentritt
Re: Re: Problem with ROOT
-- Jason
Re: Problem with ROOT
-- Marc Blumentritt
Navigation:
Lists: gentoo-embedded: < Prev By Thread Next > < Prev By Date Next >
Previous by thread:
Re: Problem with ROOT
Next by thread:
Re: Problem with ROOT
Previous by date:
Re: Problem with ROOT
Next by date:
Re: Gentoo port to Arm's A9?


Updated Jun 17, 2009

Summary: Archive of the gentoo-embedded mailing list.

Donate to support our development efforts.

Copyright 2001-2013 Gentoo Foundation, Inc. Questions, Comments? Contact us.