- fix building out-of-tree;

to test, checkout the source (let's assume /scratch/src/busybox), then
  mkdir /tmp/bb ; cd /tmp/bb
  make top_srcdir=/scratch/src/busybox O="$(pwd)" -f /scratch/src/busybox/Makefile allyesconfig check
- default to O=$(pwd) if no O was specified. Now you can just specify
  the top_srcdir (without O=/somewhere) to create the obj-tree in pwd.
- make "make configtarget buildtarget" work. Previously this didn't
  work due to how HAVE_DOT_CONFIG was evaluated. Two separate steps were
  needed before, e.g. make config ; make busybox.
- remove some unneeded variables from Rules.mak (BB_SRC_DIR from Mr.
  ldoolitt@recycle.lbl) which suggest that the stuff fixed above
  didn't work before.
- move selinux libraries to where they belong (from Makefile to Rules.mak)
- update the docs to mention svn instead of cvs and provide an example
  for building out-of-tree in INSTALL.
This commit is contained in:
Bernhard Reutner-Fischer 2005-10-05 07:40:46 +00:00
parent dc2510327b
commit 5c071bcf2f
6 changed files with 150 additions and 107 deletions

48
INSTALL
View File

@ -1,14 +1,50 @@
Building:
=========
You will usually build in the source-tree.
Alternatively you can build out-of-tree to have the object files separated
from the source. This allows for building several different configurations
from the same set of sources.
A) Building in the source-tree:
-------------------------------
1) Run 'make config' or 'make menuconfig' and select the 1) Run 'make config' or 'make menuconfig' and select the
functionality that you wish to enable. functionality that you wish to enable.
2) Run 'make' 2) Run 'make'
3) Go get a drink of water, drink a soda, visit the bathroom, 3) Run 'make install' or 'make PREFIX=/target install' to
or whatever while it compiles. It doesn't take very
long to compile, so you don't really need to waste too
much time waiting...
4) Run 'make install' or 'make PREFIX=/target install' to
install busybox and all the needed links. Some people install busybox and all the needed links. Some people
will prefer to install using hardlinks and will instead will prefer to install using hardlinks and will instead
want to run 'make install-hardlinks'.... want to run 'make install-hardlinks'....
B) Building out-of-tree:
------------------------
1) make the directory to hold the object files and chdir to it:
'mkdir /tmp/bb ; cd /tmp/bb'
Then prepare the config giving the full path to the source in top_srcdir:
make top_srcdir=/path/busybox -f /path/busybox/Makefile O=/tmp/b allyesconfig
Note that O=$(pwd) is the default if no O= was specified.
You now have a buildable tree in $O and can run 'make' without the need
to specify any paths.
Proceed with step #A2 above.
Installation:
=============
After the build is complete, a busybox.links file is generated. This is
used by 'make install' to create symlinks to the BusyBox binary for all
compiled in functions. By default, 'make install' will place the symlink
forest into `pwd`/_install unless you have defined the PREFIX environment
variable (i.e., 'make PREFIX=/tmp/foo install')
If you wish to install hard links, rather than symlinks, you can use
'make PREFIX=/tmp/foo install-hardlinks' instead.

147
Makefile
View File

@ -24,8 +24,6 @@ endif
export srctree=$(top_srcdir) export srctree=$(top_srcdir)
vpath %/Config.in $(srctree) vpath %/Config.in $(srctree)
include $(top_srcdir)/Rules.mak
DIRS:=applets archival archival/libunarchive coreutils console-tools \ DIRS:=applets archival archival/libunarchive coreutils console-tools \
debianutils editors findutils init miscutils modutils networking \ debianutils editors findutils init miscutils modutils networking \
networking/libiproute networking/udhcp procps loginutils shell \ networking/libiproute networking/udhcp procps loginutils shell \
@ -33,28 +31,36 @@ DIRS:=applets archival archival/libunarchive coreutils console-tools \
SRC_DIRS:=$(patsubst %,$(top_srcdir)/%,$(DIRS)) SRC_DIRS:=$(patsubst %,$(top_srcdir)/%,$(DIRS))
ifeq ($(strip $(CONFIG_SELINUX)),y) # That's our default target when none is given on the command line
LIBRARIES += -lselinux .PHONY: _all
endif _all:
# All object directories.
OBJ_DIRS = scripts/config include $(DIRS)
$(OBJ_DIRS):
mkdir -p "$(patsubst %,$(top_builddir)/%,$@)"
scripts/config/Makefile: $(top_srcdir)/scripts/config/Makefile
cp -v $< $@
include $(top_srcdir)/Rules.mak
CONFIG_CONFIG_IN = $(top_srcdir)/sysdeps/$(TARGET_OS)/Config.in CONFIG_CONFIG_IN = $(top_srcdir)/sysdeps/$(TARGET_OS)/Config.in
CONFIG_DEFCONFIG = $(top_srcdir)/sysdeps/$(TARGET_OS)/defconfig CONFIG_DEFCONFIG = $(top_srcdir)/sysdeps/$(TARGET_OS)/defconfig
ALL_DIRS:= $(DIRS) scripts/config
ALL_MAKEFILES:=$(patsubst %,%/Makefile,$(ALL_DIRS))
ifeq ($(KBUILD_SRC),) ifeq ($(KBUILD_SRC),)
ifdef O ifdef O
ifeq ("$(origin O)", "command line") ifeq ("$(origin O)", "command line")
KBUILD_OUTPUT := $(O) KBUILD_OUTPUT := $(O)
endif endif
else
# If no alternate output-dir was specified, we build in cwd
# We are using KBUILD_OUTPUT nevertheless to make sure that we create
# Rules.mak and the toplevel Makefile, in case they don't exist.
KBUILD_OUTPUT := $(top_builddir)
endif endif
# That's our default target when none is given on the command line
.PHONY: _all
_all:
ifneq ($(KBUILD_OUTPUT),) ifneq ($(KBUILD_OUTPUT),)
# Invoke a second make in the output directory, passing relevant variables # Invoke a second make in the output directory, passing relevant variables
# check that the output directory actually exists # check that the output directory actually exists
@ -63,24 +69,29 @@ KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) && /bin/pwd)
$(if $(wildcard $(KBUILD_OUTPUT)),, \ $(if $(wildcard $(KBUILD_OUTPUT)),, \
$(error output directory "$(saved-output)" does not exist)) $(error output directory "$(saved-output)" does not exist))
# We only need a copy of the Makefile for the config targets and reuse
# the rest from the source directory, i.e. we do not cp ALL_MAKEFILES.
all_tree: $(OBJ_DIRS) $(KBUILD_OUTPUT)/Rules.mak $(KBUILD_OUTPUT)/Makefile scripts/config/Makefile
.PHONY: $(MAKECMDGOALS) .PHONY: $(MAKECMDGOALS)
$(filter-out _all,$(MAKECMDGOALS)) _all: $(KBUILD_OUTPUT)/Rules.mak $(KBUILD_OUTPUT)/Makefile $(filter-out _all,$(MAKECMDGOALS)) _all: $(KBUILD_OUTPUT)/Rules.mak $(KBUILD_OUTPUT)/Makefile all_tree
#all:
$(MAKE) -C $(KBUILD_OUTPUT) \ $(MAKE) -C $(KBUILD_OUTPUT) \
top_srcdir=$(CURDIR) \ top_srcdir=$(top_srcdir) \
top_builddir=$(KBUILD_OUTPUT) \ top_builddir=$(top_builddir) \
KBUILD_SRC=$(CURDIR) \ KBUILD_SRC=$(top_srcdir) \
-f $(CURDIR)/Makefile $@ -f $(CURDIR)/Makefile $@
$(KBUILD_OUTPUT)/Rules.mak: $(KBUILD_OUTPUT)/Rules.mak:
@echo > $@ @echo > $@
@echo top_srcdir=$(CURDIR) >> $@ @echo top_srcdir=$(top_srcdir) >> $@
@echo top_builddir=$(KBUILD_OUTPUT) >> $@ @echo top_builddir=$(KBUILD_OUTPUT) >> $@
@echo include $(top_srcdir)/Rules.mak >> $@ @echo include $(top_srcdir)/Rules.mak >> $@
$(KBUILD_OUTPUT)/Makefile: $(KBUILD_OUTPUT)/Makefile:
@echo > $@ @echo > $@
@echo top_srcdir=$(CURDIR) >> $@ @echo top_srcdir=$(top_srcdir) >> $@
@echo top_builddir=$(KBUILD_OUTPUT) >> $@ @echo top_builddir=$(KBUILD_OUTPUT) >> $@
@echo KBUILD_SRC='$$(top_srcdir)' >> $@ @echo KBUILD_SRC='$$(top_srcdir)' >> $@
@echo include '$$(KBUILD_SRC)'/Makefile >> $@ @echo include '$$(KBUILD_SRC)'/Makefile >> $@
@ -124,21 +135,61 @@ help:
@echo ' sizes - show size of all enabled busybox symbols' @echo ' sizes - show size of all enabled busybox symbols'
@echo @echo
ifeq ($(strip $(HAVE_DOT_CONFIG)),y)
ifneq ($(strip $(HAVE_DOT_CONFIG)),y)
all: menuconfig
# configuration
# ---------------------------------------------------------------------------
scripts/config/conf: scripts/config/Makefile
$(MAKE) -C scripts/config conf
-@if [ ! -f .config ] ; then \
cp $(CONFIG_DEFCONFIG) .config; \
fi
scripts/config/mconf: scripts/config/Makefile
$(MAKE) -C scripts/config ncurses conf mconf
-@if [ ! -f .config ] ; then \
cp $(CONFIG_DEFCONFIG) .config; \
fi
menuconfig: scripts/config/mconf
@./scripts/config/mconf $(CONFIG_CONFIG_IN)
config: scripts/config/conf
@./scripts/config/conf $(CONFIG_CONFIG_IN)
oldconfig: scripts/config/conf
@./scripts/config/conf -o $(CONFIG_CONFIG_IN)
randconfig: scripts/config/conf
@./scripts/config/conf -r $(CONFIG_CONFIG_IN)
allyesconfig: scripts/config/conf
@./scripts/config/conf -y $(CONFIG_CONFIG_IN)
sed -i -r -e "s/^(CONFIG_DEBUG|USING_CROSS_COMPILER|CONFIG_STATIC|CONFIG_SELINUX).*/# \1 is not set/" .config
@./scripts/config/conf -o $(CONFIG_CONFIG_IN)
allnoconfig: scripts/config/conf
@./scripts/config/conf -n $(CONFIG_CONFIG_IN)
defconfig: scripts/config/conf
@./scripts/config/conf -d $(CONFIG_CONFIG_IN)
else # ifneq ($(strip $(HAVE_DOT_CONFIG)),y)
all: busybox busybox.links doc all: busybox busybox.links doc
all_tree: $(ALL_MAKEFILES)
$(ALL_MAKEFILES): %/Makefile: $(top_srcdir)/%/Makefile
[ -d $(@D) ] || mkdir -p $(@D); cp $< $@
# In this section, we need .config # In this section, we need .config
-include $(top_builddir)/.config.cmd -include $(top_builddir)/.config.cmd
include $(patsubst %,%/Makefile.in, $(SRC_DIRS)) include $(patsubst %,%/Makefile.in, $(SRC_DIRS))
-include $(top_builddir)/.depend -include $(top_builddir)/.depend
busybox: $(ALL_MAKEFILES) .depend $(libraries-y) endif # ifneq ($(strip $(HAVE_DOT_CONFIG)),y)
busybox: .depend $(libraries-y)
$(CC) $(EXTRA_CFLAGS) $(LDFLAGS) -o $@ -Wl,--start-group $(libraries-y) $(LIBRARIES) -Wl,--end-group $(CC) $(EXTRA_CFLAGS) $(LDFLAGS) -o $@ -Wl,--start-group $(libraries-y) $(LIBRARIES) -Wl,--end-group
$(STRIPCMD) $@ $(STRIPCMD) $@
@ -217,7 +268,7 @@ ifeq ($(strip $(CONFIG_BBCONFIG)),y)
DEP_INCLUDES += include/bbconfigopts.h DEP_INCLUDES += include/bbconfigopts.h
include/bbconfigopts.h: .config include/bbconfigopts.h: .config
scripts/config/mkconfigs > $@ $(top_srcdir)/scripts/config/mkconfigs > $@
endif endif
depend dep $(top_builddir)/.depend: .depend depend dep $(top_builddir)/.depend: .depend
@ -245,48 +296,6 @@ finished2:
$(SECHO) Finished installing... $(SECHO) Finished installing...
$(SECHO) $(SECHO)
else # ifeq ($(strip $(HAVE_DOT_CONFIG)),y)
all: menuconfig
# configuration
# ---------------------------------------------------------------------------
scripts/config/conf: scripts/config/Makefile $(top_srcdir)/Rules.mak
$(MAKE) -C scripts/config conf
-@if [ ! -f .config ] ; then \
cp $(CONFIG_DEFCONFIG) .config; \
fi
scripts/config/mconf: scripts/config/Makefile $(top_srcdir)/Rules.mak
$(MAKE) -C scripts/config ncurses conf mconf
-@if [ ! -f .config ] ; then \
cp $(CONFIG_DEFCONFIG) .config; \
fi
menuconfig: scripts/config/mconf
@./scripts/config/mconf $(CONFIG_CONFIG_IN)
config: scripts/config/conf
@./scripts/config/conf $(CONFIG_CONFIG_IN)
oldconfig: scripts/config/conf
@./scripts/config/conf -o $(CONFIG_CONFIG_IN)
randconfig: scripts/config/conf
@./scripts/config/conf -r $(CONFIG_CONFIG_IN)
allyesconfig: scripts/config/conf
@./scripts/config/conf -y $(CONFIG_CONFIG_IN)
sed -i -r -e "s/^(CONFIG_DEBUG|USING_CROSS_COMPILER|CONFIG_STATIC|CONFIG_SELINUX).*/# \1 is not set/" .config
@./scripts/config/conf -o $(CONFIG_CONFIG_IN)
allnoconfig: scripts/config/conf
@./scripts/config/conf -n $(CONFIG_CONFIG_IN)
defconfig: scripts/config/conf
@./scripts/config/conf -d $(CONFIG_CONFIG_IN)
clean: clean:
- $(MAKE) -C scripts/config $@ - $(MAKE) -C scripts/config $@
- rm -f docs/busybox.dvi docs/busybox.ps \ - rm -f docs/busybox.dvi docs/busybox.ps \
@ -327,8 +336,6 @@ tags:
ctags -R . ctags -R .
endif # ifeq ($(strip $(HAVE_DOT_CONFIG)),y)
endif # ifeq ($(skip-makefile),) endif # ifeq ($(skip-makefile),)
.PHONY: dummy subdirs release distclean clean config oldconfig \ .PHONY: dummy subdirs release distclean clean config oldconfig \

26
README
View File

@ -1,4 +1,5 @@
Please see the LICENSE file for details on copying and usage. Please see the LICENSE file for details on copying and usage.
Please refer to the INSTALL file for instructions on how to build.
BusyBox combines tiny versions of many common UNIX utilities into a single BusyBox combines tiny versions of many common UNIX utilities into a single
small executable. It provides minimalist replacements for most of the utilities small executable. It provides minimalist replacements for most of the utilities
@ -15,17 +16,8 @@ BusyBox provides a fairly complete POSIX environment for any small or embedded
system. system.
BusyBox is extremely configurable. This allows you to include only the BusyBox is extremely configurable. This allows you to include only the
components you need, thereby reducing binary size. Run 'make config' or components you need, thereby reducing binary size. See the file INSTALL
'make menuconfig' to select the functionality that you wish to enable. for details.
After the build is complete, a busybox.links file is generated. This is
used by 'make install' to create symlinks to the BusyBox binary for all
compiled in functions. By default, 'make install' will place the symlink
forest into `pwd`/_install unless you have defined the PREFIX environment
variable (i.e., 'make PREFIX=/tmp/foo install')
If you wish to install hard links, rather than symlinks, you can use
'make PREFIX=/tmp/foo install-hardlinks' instead.
---------------- ----------------
@ -110,14 +102,14 @@ be downloaded from
CVS: CVS:
BusyBox now has its own publicly browsable CVS tree at: BusyBox now has its own publicly browsable SVN tree at:
http://busybox.net/cgi-bin/cvsweb/busybox/ http://busybox.net/cgi-bin/viewcvs.cgi/trunk/busybox/
Anonymous CVS access is available. For instructions, check out: Anonymous SVN access is available. For instructions, check out:
http://busybox.net/cvs_anon.html http://busybox.net/subversion.html
For those that are actively contributing there is even CVS write access: For those that are actively contributing there is even SVN write access:
http://busybox.net/cvs_write.html http://busybox.net/developer.html
---------------- ----------------

View File

@ -27,7 +27,7 @@ BUILDTIME := $(shell TZ=UTC date -u "+%Y.%m.%d-%H:%M%z")
# With a modern GNU make(1) (highly recommended, that's what all the # With a modern GNU make(1) (highly recommended, that's what all the
# developers use), all of the following configuration values can be # developers use), all of the following configuration values can be
# overridden at the command line. For example: # overridden at the command line. For example:
# make CROSS=powerpc-linux- BB_SRC_DIR=$HOME/busybox PREFIX=/mnt/app # make CROSS=powerpc-linux- top_srcdir="$HOME/busybox" PREFIX=/mnt/app
#-------------------------------------------------------- #--------------------------------------------------------
# If you are running a cross compiler, you will want to set 'CROSS' # If you are running a cross compiler, you will want to set 'CROSS'
@ -60,11 +60,6 @@ LC_ALL:= C
# For optimization overrides, it's better still to set OPTIMIZATION. # For optimization overrides, it's better still to set OPTIMIZATION.
CFLAGS_EXTRA=$(subst ",, $(strip $(EXTRA_CFLAGS_OPTIONS))) CFLAGS_EXTRA=$(subst ",, $(strip $(EXTRA_CFLAGS_OPTIONS)))
# If you have a "pristine" source directory, point BB_SRC_DIR to it.
# Experimental and incomplete; tell the mailing list
# <busybox@busybox.net> if you do or don't like it so far.
BB_SRC_DIR=
# To compile vs some other alternative libc, you may need to use/adjust # To compile vs some other alternative libc, you may need to use/adjust
# the following lines to meet your needs... # the following lines to meet your needs...
# #
@ -176,19 +171,20 @@ ifeq ($(strip $(CONFIG_STATIC)),y)
LDFLAGS += --static LDFLAGS += --static
endif endif
ifeq ($(strip $(CONFIG_SELINUX)),y)
LIBRARIES += -lselinux
endif
ifeq ($(strip $(PREFIX)),) ifeq ($(strip $(PREFIX)),)
PREFIX:=`pwd`/_install PREFIX:=`pwd`/_install
endif endif
# Additional complications due to support for pristine source dir. # Additional complications due to support for pristine source dir.
# Include files in the build directory should take precedence over # Include files in the build directory should take precedence over
# the copy in BB_SRC_DIR, both during the compilation phase and the # the copy in top_srcdir, both during the compilation phase and the
# shell script that finds the list of object files. # shell script that finds the list of object files.
# Work in progress by <ldoolitt@recycle.lbl.gov>. # Work in progress by <ldoolitt@recycle.lbl.gov>.
#
ifneq ($(strip $(BB_SRC_DIR)),)
VPATH:=$(BB_SRC_DIR)
endif
OBJECTS:=$(APPLET_SOURCES:.c=.o) busybox.o usage.o applets.o OBJECTS:=$(APPLET_SOURCES:.c=.o) busybox.o usage.o applets.o
CFLAGS += $(CROSS_CFLAGS) CFLAGS += $(CROSS_CFLAGS)

View File

@ -8,8 +8,8 @@ top_srcdir=..
top_builddir=.. top_builddir=..
srcdir=$(top_srcdir)/e2fsprogs srcdir=$(top_srcdir)/e2fsprogs
E2FSPROGS_DIR:=./ E2FSPROGS_DIR:=./
include $(top_builddir)/Rules.mak
include $(top_builddir)/.config include $(top_builddir)/.config
include $(top_builddir)/Rules.mak
include Makefile.in include Makefile.in
all: $(libraries-y) all: $(libraries-y)
-include $(top_builddir)/.depend -include $(top_builddir)/.depend

View File

@ -39,7 +39,18 @@ UUID_SRC := compare.c gen_uuid.c pack.c parse.c unpack.c unparse.c \
UUID_SRCS := $(patsubst %,uuid/%, $(UUID_SRC)) UUID_SRCS := $(patsubst %,uuid/%, $(UUID_SRC))
UUID_OBJS := $(patsubst %.c,%.o, $(UUID_SRCS)) UUID_OBJS := $(patsubst %.c,%.o, $(UUID_SRCS))
E2FSPROGS-:= # for building out-of-tree we need to make sure that the directories to hold
# the object tree are created
$(patsubst %,$(E2FSPROGS_DIR)/%, blkid e2fsck e2p ext2fs uuid):
mkdir -p "$@"
$(patsubst %,$(E2FSPROGS_DIR)/%, $(BLKID_OBJS)):$(E2FSPROGS_DIR)/blkid
$(patsubst %,$(E2FSPROGS_DIR)/%, $(E2FSCK_OBJS)):$(E2FSPROGS_DIR)/e2fsck
$(patsubst %,$(E2FSPROGS_DIR)/%, $(E2P_OBJS)):$(E2FSPROGS_DIR)/e2p
$(patsubst %,$(E2FSPROGS_DIR)/%, $(EXT2FS_OBJS)):$(E2FSPROGS_DIR)/ext2fs
$(patsubst %,$(E2FSPROGS_DIR)/%, $(UUID_OBJS)):$(E2FSPROGS_DIR)/uuid
E2FSPROGS-y:=
E2FSPROGS-$(CONFIG_CHATTR) += chattr.o $(E2P_OBJS) E2FSPROGS-$(CONFIG_CHATTR) += chattr.o $(E2P_OBJS)
E2FSPROGS-$(CONFIG_E2FSCK) += e2fsck.o util.o $(BLKID_OBJS) $(EXT2FS_OBJS) $(UUID_OBJS) E2FSPROGS-$(CONFIG_E2FSCK) += e2fsck.o util.o $(BLKID_OBJS) $(EXT2FS_OBJS) $(UUID_OBJS)
E2FSPROGS-$(CONFIG_FSCK) += fsck.o base_device.o $(BLKID_OBJS) $(UUID_OBJS) E2FSPROGS-$(CONFIG_FSCK) += fsck.o base_device.o $(BLKID_OBJS) $(UUID_OBJS)
@ -53,5 +64,6 @@ libraries-y+=$(E2FSPROGS_DIR)/$(E2FSPROGS_AR)
$(E2FSPROGS_DIR)/$(E2FSPROGS_AR): $(patsubst %,$(E2FSPROGS_DIR)/%, $(E2FSPROGS-y)) $(E2FSPROGS_DIR)/$(E2FSPROGS_AR): $(patsubst %,$(E2FSPROGS_DIR)/%, $(E2FSPROGS-y))
$(AR) $(ARFLAGS) $@ $(patsubst %,$(E2FSPROGS_DIR)/%, $(E2FSPROGS-y)) $(AR) $(ARFLAGS) $@ $(patsubst %,$(E2FSPROGS_DIR)/%, $(E2FSPROGS-y))
$(E2FSPROGS_DIR)/%.o: $(E2FSPROGS_DIR)/%.c $(E2FSPROGS_DIR)/%.o: $(subst $(top_builddir),$(top_srcdir),$(E2FSPROGS_DIR)/%.c)
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(E2FSPROGS_CFLAGS) -c -o $@ $< $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(E2FSPROGS_CFLAGS) -c -o $@ $<