[Buildroot] Remove and Rebuild "project_build_arch/project/root" tree

Eric Malkowski eric at bvwireless.net
Wed Feb 11 21:29:21 UTC 2009


After working on this some more, here's what I came up with --
With this rebuild_root.sh script, I can use it to rebuild the rootfs and 
pickup updates to target skeleton, my own stuff I build on top of base 
buildroot and packages that copies stuff into the rootfs.

Just calling make after a full build has most things install all of 
their stuff properly (verified by diffing a full build versus 
rebuild_root.sh run):
   busybox
   gdb  (I'm just building gdbserver for target)
   kernel modules
   pci_utils
   setserial
   wireless_tools
   zlib

Stuff that needs "extra files" removed so they'll properly install their 
binaries / utils / libs in to the rootfs:

   grub
   openssl / openssh

I get libgcc_s share libs from gcc_final from removing autotools-stamps 
files for free.
If I want my kernel to rebuild completely, I remove 
project_build_arch/project/linux-2.6.X.Y and it rebuilds the kernel for 
me -- I mostly rebuild the kernel if I change kernel config, or rootfs 
if I change my own stuff or some buildroot item.

Here's the script as it stands -- still open for other ideas ... curious 
what you guys think -- maybe I'm way off in left field here, but this 
does what I'm after and what I historically have been doing since 2005 
timeframe (what I did in 2005 was even simpler than 2007 shown in quoted 
post below which is simpler than the following script -- that's why I'm 
wondering if I'm wandering into the weeds):

#!/bin/sh

# Set appropriately -- I realize if we did this w/ make we could use
# vars from buildroot hierarchy.

RB_ARCH=i586
RB_PROJECT=vehicle_manager

set -x

# Kill everything in "root" area except /lib directory
# If some package we enable that installs convenience shared libs in /lib
# and we want to make sure those get rebuilt and populated in the "root" 
area,
# then remove those by individial libxyz-x.y.z.so and various libxyz.so.N
# symlink -- currently there's nothing but uclibc provided libs and
# libgcc_s.so.1 from gcc-final in our setup -- when enabling new packages --
# check for new libs installed in /lib area of "root" and add to removal
# commands here for rebuild_root functionality.

(cd project_build_${RB_ARCH}/${RB_PROJECT}/root; \
   rm -rf bin dev etc home lib/modules linuxrc mnt opt \
          proc root sbin sys tmp usr var)

# Make sure target_skeleton gets copied over
rm -f project_build_${RB_ARCH}/${RB_PROJECT}/.root

# Make sure fakeroot does makedevs based on device table and creates
# a real ramdisk capable fs w/ genext2fs
rm -f build_${RB_ARCH}/staging_dir/.fakeroot.00000

# Make sure grub populates it's files
rm -f build_${RB_ARCH}/grub-0.97/.installed

# Maks sure SSH populates it's binaries ... also makes gcc libs get copied
# too, no harm there -- but be careful if more packages are enabled in
# buildroot conf that cause more autotools-stamps to appear for which
# removal on rebuild-root might make more stuff rebuild than we want
rm -f project_build_${RB_ARCH}/${RB_PROJECT}/autotools-stamps/*

make


That's the end of the above script.

The next thing I'll do is a quick hack to toplevel makfile to include a 
small bit of make variables in a file that use my own target_skeleton 
and device_table.txt, then I'll specify my own busybox config and 
possibly uclibc config, although the default so far appears fine and 
what I'll have is all stuff I need custom in one place w/o having to do 
a target/device/xyz "board support" setup like I've done in the past.  I 
was going to suggest adding the ability to pick in the BR menuconfig a 
custom target_skeleton / device_table to use -- if what I do doesn't end 
up being too ugly, I'll post a patch for what I plan to do.

Thanks,

-Eric

Eric Malkowski wrote:
> Hi everyone-
>
> It's been since November, 2007 since I last grabbed a copy of 
> buildroot for a project -- a lot is the same since then, but obviously 
> a lot has changed too.
>
> I'm creating a new project based off the tip of svn which is RC4 + 
> r25295: gmp/mpfr use static since shared libs are gone -- Peter 
> recently committed.  BTW: the unwanted rebuild of mpfr when make is 
> called again appears to work fine for me having seen the issue w/ pure 
> RC4 from 2 days ago.
>
> In the past I've built everything and then just called make to rebuild 
> stuff and when things look good, I would use a small script to clean 
> out the rootfs and call make to just populate w/ shared libs and 
> binaries by having the "make install" portion of everything take care 
> of re-creating the rootfs tree under 
> project_build_$(ARCH)/project/root.  This is very handy when making 
> wholesale changes to a customized target skeleton so I can be 
> confident there's no stale stuff hanging around in the final rootfs 
> filesystem.  The script is called "rebuild_root.sh" and looked like this:
>
>  #!/bin/sh
>
>  set -x
>
>  rm -f build_i486/grub-0.97/.installed
>  rm -f toolchain_build_i486/gcc-4.2.1-final/.libs_installed
>
>  rm -rf project_build_i486/wireless/root
>  rm -f project_build_i486/wireless/.root
>  rm -f build_i486/staging_dir/.fakeroot.00000
>
>  make
>
> On past projects the above worked great.  With the latest buildroot 
> I'm finding after a complete build of everything from scratch, calling 
> rebuild_root.sh would rebuild (unwantingly) the uClibc 0.9.30 static 
> and shared libs and install those -- that's not too bad -- it would 
> then carry on and just install busybox binaries and various packages 
> rebuilding my rootfs from a fresh target_skeleton.
>
> But -- calling rebuild_root.sh a second time would cause a bunch of 
> additional toolchain related stuff (gcc final) and busybox itself to 
> be recompiled, but NOT uClibc -- it's not consistent.  Calling it a 
> third time is like the first time -- rebuild just uClibc 0.9.30 and 
> then just install busybox, other packages etc.
>
> In tracing this a bit, first rebuild causes uClibc to call "make 
> install_runtime" and it recompiles the libs, installs in TARGET_DIR -- 
> everything else just installs, nothing else rebuilds
> The second rebuild causes uClibc to call "make install_runtime 
> install_dev" which skips compling uclibc like the first rebuild, but 
> some headers are re-created which causes a call to just "make 
> install_runtime", that skips compiling uClibc -- fine, but 
> gcc-4.3.2-final would run configure and make and rebuild libiberty -- 
> recompiling all of that.  That then causes busybox to recompile 
> everything due to some dependency on gcc/uclibc being partially 
> rebuilt (I think).  The remaining stuff after busybox installs fine 
> w/o rebuilds.
> Do a third rebuild, it behaves like the first rebuild and the pattern 
> repeats.
>
> My goal is to be able to somehow remove 
> project_build_$(ARCH)/$(PROJECT)/root and call make to re-populate 
> while minimizing stuff from being rebuilt -- just allow the various 
> "make installs" to re-populate.  Does anyone have any suggestions / 
> alternatives to meet my goal?  I'm open for other approaches -- 
> perhaps what I'm doing is overkill?
>
> If my approach seems doable -- can anyone advise what files to remove 
> or touch so I can re-build the root from empty and let genxt2fs create 
> my compressed rootfs -- it's very handy when trying to just re-build 
> add-ons to the base buildroot toolchain + packages and re-create the 
> rootfs.
>
> If the toolchain is just too inter-twined with dependencies on things 
> under project_build_$(ARCH)/$(PROJECT)/root, then I will try to work 
> around it -- I guess I can get everything working w/o removing the 
> rootfs wholesale or perhaps not remove the various .so files placed in 
> there by gcc/uclibc/toolchain related "make install" stuff, but 
> suggestions are appreciated.
>
> On another note -- the OpenSSL and OpenSSH packages for whatever 
> reason don't re-build or re-install their binaries in the rootfs when 
> doing this.  In the past they did and the only package I had to force 
> into re-populating it's binaries was grub as seen above along with the 
> gcc-4.2.1-final libgcc shared libs by removing .libs_installed -- I've 
> noticed .libs_installed is no longer, grub doesn't install it's 
> binaries, and OpenSSL / OpenSSH similar to grub don't install their 
> binaries upon trying to rebuild root.
>
> Sorry to be so long winded -- any ideas appreciated.
>
> Thanks,
>
> -Eric Malkowski



More information about the buildroot mailing list