removed the "bs" build scripts

autotools are somewhat ugly, but that doesn't justify duplicating its
effort with another complex build system.
This commit is contained in:
Max Kellermann 2008-10-16 15:00:00 +02:00
parent 9b5ce27c3b
commit c0a9ef980f
16 changed files with 1 additions and 757 deletions

View File

@ -3,7 +3,7 @@ AUTOMAKE_OPTIONS = foreign 1.6
SUBDIRS = src doc
doc_DATA = README UPGRADING
EXTRA_DIST = COPYING $(doc_DATA) m4 autogen.sh bs build.mk scripts .gitignore
EXTRA_DIST = COPYING $(doc_DATA) m4 autogen.sh scripts .gitignore
sparse-check test:
$(MAKE) -C src $@

View File

@ -1,69 +0,0 @@
bs - build system
-----------------
bs is an attempt at a fast and reliable build system that will let
developers build mpd without having to deal with the complexity of
autotools. It is still a work in progress, but it seems to be
reasonably usable (to developers) and fast.
It is designed from the ground up to work with cross-compilation, as well as
multiple build targets/configurations from the same source tree (using the O
variable).
It is NOT intended to replace autotools for distribution maintainers
or end users who are satisfied with autotools.
SYNOPSIS
--------
# To build mpd in a directory "output"
./build.mk O=output defconfig
$EDITOR output/config.mk
./build.mk O=output
FEATURES
--------
* Designed for cross-compilation from the ground up
* Designed to easily handle multiple build directories from the same source
tree. Just set the O variable when invoking make (see synopsis).
* Automatic dependency analysis (if using GCC)
* Highly configurable (no auto-detection of dependencies to get wrong)
* Simple, no archaic M4 macros or unreadable auto-generated shell or makefiles
just human-maintained GNU Make and POSIX shell.
config.mk
---------
This is the configuration file a user should edit if they wish to
enable/disable features or tune settings. Once created, this
will NOT be modified by the build system, so user settings will
always be preserved.
VARIABLES
---------
These are conventions, not hard and fast rules (as there's no good way to
enforce them :)
mixed-case or lower-case variables are used by bs internally.
ALL_CAPS variables are designed to be changed by users.
REQUIREMENTS
------------
GNU Make, POSIX shell + common UNIX tools (awk, sed, mv, rm, mkdir).
git (version control system) is only required if you wish to autodownload
external dependencies (flac, tremor, mad, etc...) for static linking.
BUGS
----
Modifications to config.mk will over-rebuild.
Changes to CFLAGS/LDFLAGS from the command-line are not yet checked in
rebuilds.

View File

@ -1,64 +0,0 @@
# config.mk file for the bs build-system this is the only file a user should
# need to edit
# report bugs to Eric Wong <normalperson@yhbt.net>
# change this if cross compiling, default: @@HOST@@
# HOST := @@HOST@@
# default compiler and linker settings
CC = gcc
CFLAGS = -O2 -Wall \
-Wmissing-prototypes -Wextra -Wno-unused-parameter \
-Wno-deprecated-declarations -Wmissing-prototypes \
-Wdeclaration-after-statement -Wshadow -Wpointer-arith \
-Wstrict-prototypes -Wcast-qual -Wwrite-strings
LDFLAGS = -Wl,-O1
# TCP or UNIX domain sockets support. MPD needs at least one of these
HAVE_TCP := 1
HAVE_UN :=
# miscellaneous dependencies and features, mpd does not
# require any of these:
#
HAVE_LANGINFO_CODESET :=
HAVE_IPV6 :=
HAVE_ICONV :=
HAVE_ID3TAG :=
MPD_PATH_MAX := 255
# audio output features, at least one of these must be defined to 1
# (and usable)
#
HAVE_ALSA :=
HAVE_AO :=
HAVE_FIFO :=
HAVE_JACK :=
HAVE_MVP :=
HAVE_NULL :=
HAVE_OSS :=
HAVE_OSX :=
HAVE_PULSE :=
HAVE_SHOUT :=
# input file format support, at least one of these must be defined to 1
# (and usable)
#
HAVE_AUDIOFILE :=
HAVE_FAAD :=
HAVE_FAAD_BUFLEN_FUNCS :=
HAVE_MP4AUDIOSPECIFICCONFIG :=
HAVE_FAACDECCONFIGURATION_DONTUPSAMPLEIMPLICITSBR :=
HAVE_FAACDECCONFIGURATION_DOWNMATRIX :=
HAVE_FAACDECFRAMEINFO_SAMPLERATE :=
HAVE_FLAC :=
HAVE_HELIXMP3 :=
HAVE_MIKMOD :=
HAVE_MAD :=
HAVE_MPCDEC :=
HAVE_OGGFLAC :=
HAVE_OGGVORBIS :=
HAVE_TREMOR :=
HAVE_WAVPACK :=

View File

@ -1,82 +0,0 @@
#!/bin/sh
# many parts of this blatantly ripped from GNU Autoconf macros
# Use this for cross-compiling, as we can't run cross-compiled binaries
# on our host.
if test -z "$O" || ! cd "$O"; then
echo '$O= not defined or not a directory' >&2
exit 1
fi
echo '/* architecture-specific settings (auto-detected): */'
# check sizes of various types we care for
# this is slightly slower but much easier to read and follow than the
# bisecting autoconf version
for t in short int long 'long long'; do
> out
for s in 2 4 6 8 12 1 16 24 32 0; do
cat > t.c <<EOF
int main(void)
{
static int x[(long int)(sizeof($t)) == $s ? 1 : -1];
x[0] = 0;
return 0;
}
EOF
echo "trying sizeof($t) == $s" >> out
$CC -o t.o $CFLAGS $CPPFLAGS t.c \
>> out 2>&1 && break
done
if test $s -eq 0; then
echo "Unable to calculate sizeof($t) for cross-compiling" >&2
cat out >&2
exit 1
fi
t=`echo $t | tr a-z A-Z | tr ' ' _`
echo "#define SIZEOF_$t $s"
echo "SIZEOF_$t := $s" >> config_detected.mk
done
# check endian-ness
cat > t.c <<EOF
short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
void _ascii(void)
{
char *s = (char *)ascii_mm;
s = (char *)ascii_ii;
}
short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
void _ebcdic(void)
{
char *s = (char *)ebcdic_mm;
s = (char *)ebcdic_ii;
}
int main(void)
{
_ascii();
_ebcdic();
return 0;
}
EOF
echo "compiling endian test" > out
$CC -o t.o $CFLAGS $CPPFLAGS t.c >> out 2>&1
if grep BIGenDianSyS t.o >/dev/null 2>&1; then
echo "#define WORDS_BIGENDIAN 1"
echo "WORDS_BIGENDIAN := 1" >> config_detected.mk
elif grep LiTTleEnDian t.o >/dev/null 2>&1; then
echo "/* #undef WORDS_BIGENDIAN */"
echo "# WORDS_BIGENDIAN :=" >> config_detected.mk
else
echo "Unable to determine endian-ness for cross compiling" >&2
cat out >&2
exit 1
fi
echo ''
exec rm -f t.o out t.c

View File

@ -1,38 +0,0 @@
ifeq ($(HAVE_ALSA),1)
mpd_CFLAGS += $(ALSA_CFLAGS) -DHAVE_LIBASOUND=1
mpd_LDFLAGS += $(ALSA_LDFLAGS) -lasound
endif
ifeq ($(HAVE_AO),1)
# mpd_CFLAGS += -pthread
mpd_LDFLAGS += -lao -lpthread
endif
ifeq ($(HAVE_FIFO),1)
endif
ifeq ($(HAVE_JACK),1)
mpd_LDFLAGS += -ljack
endif
ifeq ($(HAVE_MVP),1)
endif
ifeq ($(HAVE_OSX),1)
mpd_LDFLAGS += -framework AudioUnit -framework CoreServices
endif
ifeq ($(HAVE_OSS),1)
# check some BSDs (-lossaudio?)
endif
ifeq ($(HAVE_PULSE),1)
mpd_LDFLAGS += -lpulse -lpulse-simple
endif
ifeq ($(HAVE_SHOUT),1)
mpd_CFLAGS += -DHAVE_SHOUT_SHOUT_H=1
# XXX -ltheora, -lspeex
mpd_LDFLAGS += -lshout -logg -lvorbis -lvorbisenc -ltheora -lspeex -lpthread
endif
ifeq ($(HAVE_SUN),1)
mpd_CFLAGS += $(SUN_CFLAGS)
mpd_LDFLAGS += $(SUN_LDFLAGS)
endif

View File

@ -1,14 +0,0 @@
ifeq ($(HAVE_TREMOR),1)
ifeq ($(HAVE_SHOUT),1)
$(error Tremor and Shout are incompatible, enable one or the other)
endif
ifeq ($(HAVE_OGGFLAC),1)
$(error Tremor and OggFLAC are incompatible, enable one or the other)
endif
endif
ifeq ($(HAVE_HELIXMP3),1)
ifeq ($(HAVE_MAD),1)
$(error Helix MP3 and MAD are incompatible, enable one or the other)
endif
endif

View File

@ -1,46 +0,0 @@
ifeq ($(HAVE_AUDIOFILE),1)
mpd_LDFLAGS += -laudiofile -lm
endif
ifeq ($(HAVE_FAAD),1)
# XXX needs work
mpd_CFLAGS += $(FAAD_CFLAGS)
mpd_LDFLAGS += -lfaad -lmp4ff
endif
ifeq ($(HAVE_FLAC),1)
mpd_LDFLAGS += -lFLAC -lm
endif
ifeq ($(HAVE_HELIXMP3),1)
mpd_CFLAGS += $(HELIXMP3_CFLAGS)
mpd_LDFLAGS += $(HELIXMP3_LDFLAGS) -lmp3codecfixpt
endif
ifeq ($(HAVE_MIKMOD),1)
mpd_LDFLAGS += -lmikmod -lm
endif
ifeq ($(HAVE_MAD),1)
mpd_LDFLAGS += -lmad -lm
endif
ifeq ($(HAVE_MPCDEC),1)
mpd_LDFLAGS += -lmpcdec
endif
ifeq ($(HAVE_OGGFLAC),1)
mpd_LDFLAGS += $(OGGFLAC_LDFLAGS) -lOggFLAC -logg -lFLAC -lm
endif
ifeq ($(HAVE_OGGVORBIS),1)
ifeq ($(HAVE_TREMOR),1)
mpd_LDFLAGS += $(TREMOR_LDFLAGS) -lvorbisidec
else
mpd_LDFLAGS += $(OGGVORBIS_LDFLAGS) -lvorbis -logg -lvorbisfile
endif
endif
ifeq ($(HAVE_WAVPACK),1)
mpd_LDFLAGS += -lwavpack
endif

View File

@ -1,17 +0,0 @@
ifeq ($(HAVE_ID3TAG),1)
mpd_LDFLAGS += -lid3tag -lz
endif
ifeq ($(HAVE_ICONV),1)
ifeq ($(NEED_LIBICONV),1)
mpd_LDFLAGS += -liconv
endif
endif
ifeq ($(HAVE_IPV6),1)
endif
ifeq ($(HAVE_LANGINFO_CODESET),1)
endif
mpd_LDFLAGS += -lpthread

View File

@ -1,88 +0,0 @@
#!/bin/sh
# detect the uninteresting (unlikely to be manually changed by the user)
# parts of config.h
if test -z "$O" || ! cd "$O"; then
echo '$O= not defined or not a directory' >&2
exit 1
fi
> config_detected.mk
ansi_headers='assert ctype errno limits locale math signal
stdarg stddef stdint stdio stdlib string'
common_headers='dlfcn inttypes memory strings sched
sys/inttypes sys/stat sys/types unistd'
all_ansi=t
echo '/* ANSI C headers: */'
for h in $ansi_headers; do
if test x$h = xlocale; then
H=HAVE_LOCALE
else
H="HAVE_`echo $h | tr a-z A-Z | tr / _`_H"
fi
cat > t.c <<EOF
#include <$h.h>
int main(void) { return 0; }
EOF
if $CC -o t.o $CFLAGS $CPPFLAGS t.c >> out 2>&1; then
echo "#define $H 1"
echo "$H := 1" >> config_detected.mk
else
echo "/* #undef $H */"
echo "# $H := " >> config_detected.mk
all_ansi=
fi
done
if test x$all_ansi = xt; then
echo '#define STDC_HEADERS 1'
else
echo '/* #undef STDC_HEADERS */'
fi
echo ''
echo '/* common system headers/features on UNIX and UNIX-like system: */'
for h in $common_headers; do
H="HAVE_`echo $h | tr a-z A-Z | tr / _`_H"
cat > t.c <<EOF
#include <$h.h>
int main(void) { return 0; }
EOF
if $CC -o t.o $CFLAGS $CPPFLAGS t.c >> out 2>&1; then
echo "#define $H 1"
echo "$H := 1" >> config_detected.mk
else
echo "/* #undef $H */"
echo "# $H :=" >> config_detected.mk
fi
done
# test for setenv
cat > t.c <<EOF
#include <stdlib.h>
int main(void) { setenv("mpd","rocks", 1); return 0; }
EOF
if $CC -o t.o $CFLAGS $CPPFLAGS t.c >> out 2>&1; then
echo '#define HAVE_SETENV 1'
echo "HAVE_SETENV := 1" >> config_detected.mk
else
echo '/* #undef HAVE_SETENV */'
echo "# HAVE_SETENV :=" >> config_detected.mk
fi
echo ''
# test for alloca
cat > t.c <<EOF
#include <alloca.h>
int main(void) { char *x = (char *)alloca(2 * sizeof(int)); return 0; }
EOF
if $CC -o t.o $CFLAGS $CPPFLAGS t.c >> out 2>&1; then
echo '#define HAVE_ALLOCA_H 1'
echo "HAVE_ALLOCA_H := 1" >> config_detected.mk
else
echo '/* #undef HAVE_ALLOCA_H */'
echo "# HAVE_ALLOCA_H :=" >> config_detected.mk
fi
echo ''
exec rm -f out t.c t.o

View File

@ -1,55 +0,0 @@
have += TCP
have += UN
have += AUDIOFILE
have += FAAD
have += FAACDECCONFIGURATION_DONTUPSAMPLEIMPLICITSBR
have += FAACDECCONFIGURATION_DOWNMATRIX
have += FAACDECFRAMEINFO_SAMPLERATE
have += MP4AUDIOSPECIFICCONFIG
have += FAAD_BUFLEN_FUNCS
have += FLAC
have += HELIXMP3
have += MIKMOD
have += MAD
have += MPCDEC
have += OGGFLAC
have += OGGVORBIS
have += TREMOR
have += WAVPACK
have += ALSA
have += AO
have += FIFO
have += JACK
have += MVP
have += OSX
have += OSS
have += PULSE
have += SHOUT
have += SUN
have += ID3TAG
have += ICONV
have += IPV6
have += LANGINFO_CODESET
MPD_PATH_MAX ?= 255
req_vars += MPD_PATH_MAX
export
include $(O)/config.mk
$(O)/config.h: $(O)/config_detected.h $(O)/config.mk
echo '#ifndef CONFIG_H' > $@+
echo '#define CONFIG_H' >> $@+
$(SHELL) ./bs/pkginfo-header.sh >> $@+
cat $(O)/config_detected.h >> $@+
echo '/* user-enabled features: */' >> $@+
for d in $(have); do eval "val=`echo '$$'HAVE_$$d` var=HAVE_$$d"; \
if test -n "$$val"; then echo "#define $$var 1" >> $@+; \
else echo "/* #undef $$var */" >> $@+; fi ; done
for d in $(req_vars); do eval "val=`echo '$$'$$d`"; \
echo "#define $$d $$val" >> $@+; done
echo '#endif /* CONFIG_H */' >> $@+
mv $@+ $@
.NOTPARALLEL:

View File

@ -1,58 +0,0 @@
#!/bin/sh
# $d must have a trailing slash $(dir file) in GNU Make
f="$1"
d="$2"
x="$3"
if test -z "$O"; then
echo '$O= not defined or not a directory' >&2
exit 1
fi
test -d "$O/$d" || "$SHELL" ./bs/mkdir_p.sh "$O/$d"
t="$O/t.$$.d"
depmode=
out=
if test -e "$O/depmode"; then
. "$O/depmode"
fi
case "$depmode" in
mm)
$CC -MM $CPPFLAGS $CFLAGS "$f" > "$t" 2>/dev/null
;;
m)
$CC -M $CPPFLAGS $CFLAGS "$f" > "$t" 2>/dev/null
;;
none)
echo "$O/$f: $f $HDR_DEP_HACK" | sed -e 's#c:#o:#' > "$x"+
;;
*)
# detect our depmode
# -MM is gcc-specific...
$CC -MM $CPPFLAGS $CFLAGS "$f" > "$t" 2>/dev/null
if test $? -eq 0; then
depmode=mm
else
# ok, maybe -M is supported...
$CC -M $CPPFLAGS $CFLAGS "$f" \
> "$t" 2>/dev/null
if test $? -eq 0; then
depmode=m
else
depmode=none
# don't guess, fudge the dependencies by using
# all headers
echo "$O/$f: $f $HDR_DEP_HACK" \
| sed -e 's#c:#o:#' > "$x"+
fi
fi
echo "depmode=$depmode" > "$O/depmode"
;;
esac
case "$depmode" in
m|mm)
sed -e 's#.c$#.o#' -e "1s#^#$O/$d&#" < "$t" > "$x"+
;;
esac
rm -f "$t"
exec mv "$x"+ "$x"

View File

@ -1,37 +0,0 @@
#!/bin/sh
# based on mkinstalldirs:
# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
# Public domain.
errstatus=0
for file
do
test -d "$file" && continue
case $file in
/*) pathcomp=/ ;;
*) pathcomp= ;;
esac
oIFS=$IFS
IFS=/
set fnord $file
shift
IFS=$oIFS
for d
do
test "x$d" = x && continue
pathcomp=$pathcomp$d
case $pathcomp in
-*) pathcomp=./$pathcomp ;;
esac
if test ! -d "$pathcomp"; then
mkdir "$pathcomp" || lasterr=$?
if test ! -d "$pathcomp"; then
errstatus=$lasterr
fi
fi
pathcomp=$pathcomp/
done
done
exit $errstatus

View File

@ -1,50 +0,0 @@
#!/bin/sh
set -e
. bs/pkginfo.sh
head=${1-'HEAD'}
git_ver=
if git rev-parse --git-dir > /dev/null 2>&1; then
git_ver=`git describe $head`
git_ver=`expr "z$git_ver" : 'z.*\(-g[0-9a-f].*\)' || true`
if test -n "$git_ver"; then
dirty=`git diff-index --name-only HEAD 2>/dev/null || true`
if test -n "$dirty"; then
git_ver=$git_ver-dirty
fi
fi
fi
v=$v$git_ver
dir=$O/$p-$v
rm -rf "$dir"
git tar-tree $head $dir | tar x
at_files='
Makefile.in
aclocal.m4
compile
config.guess
config.h.in
config.sub
configure
depcomp
doc/Makefile.in
install-sh
ltmain.sh
missing
mkinstalldirs
src/Makefile.in
src/mp4ff/Makefile.in
'
for i in $at_files; do
if test -f $i; then
echo cp $i $dir/$i
cp $i $dir/$i
fi
done
cd $O
tar c $p-$v | gzip -9 > $p-$v.tar.gz
rm -rf $p-$v
echo "Generated tarball in: $p-$v.tar.gz"

View File

@ -1,16 +0,0 @@
#!/bin/sh
# basic package info:
. bs/pkginfo.sh
cat <<EOF
/* Basic package info: */
#define PACKAGE "$p"
#define VERSION "$v"
#define PACKAGE_BUGREPORT "$b"
#define PACKAGE_NAME "$p"
#define PACKAGE_STRING "$p $v"
#define PACKAGE_TARNAME "$p"
#define PACKAGE_VERSION "$v"
#define PROTOCOL_VERSION "$pv"
EOF

View File

@ -1,19 +0,0 @@
#!/bin/sh
# sourcing this defines the folling variables:
# p: package, v: version, b: bugreport email, pv: protocol version
script='
/^AC_INIT\(/ {
gsub("[() ]","",$0);
gsub("AC_INIT","",$1);
print "p="$1;
print "v="$2;
print "b="$3;
}
/^AC_DEFINE\(PROTOCOL_VERSION, / {
gsub("[\" ]", "", $2);
print "pv="$2;
}
'
eval $(awk -F, "$script" < configure.ac)

103
build.mk
View File

@ -1,103 +0,0 @@
#!/usr/bin/make -f
# default target
all:
# output directory can be set with O:=dir
ifeq ($(O),)
O := .
endif
srcdir := src
include src/Makefile.am
mpd_SRC := $(addprefix src/,$(filter %.c,$(mpd_SOURCES)))
mpd_HDR := $(addprefix src/,$(filter %.h,$(mpd_SOURCES)))
mpd_OBJ := $(subst .c,.o,$(addprefix $(O)/,$(mpd_SRC)))
mpd_DEP := $(subst .o,.d,$(mpd_OBJ))
-include $(mpd_DEP)
uname_s := $(shell uname -s | tr A-Z a-z 2>/dev/null || echo unknown)
uname_m := $(shell uname -m | tr A-Z a-z 2>/dev/null || echo unknown)
# build: the machine type this builds on
# HOST: the machine this runs on
build := $(uname_s)-$(uname_m)
HOST ?= $(build)
-include $(O)/config.mk
-include $(O)/config_detected.mk
include bs/deps-audio.mk
include bs/deps-input.mk
include bs/deps-misc.mk
include bs/deps-conflicts.mk
RANLIB ?= ranlib
ifneq ($(HOST),$(build))
ifeq ($(origin CC),default)
CC := $(HOST)-$(CC)
endif
ifeq ($(origin RANLIB),default)
RANLIB := $(HOST)-$(RANLIB)
endif
ifeq ($(origin AR),default)
AR := $(HOST)-$(AR)
endif
endif
mpd_CFLAGS += -I$(O)/src -I$(O)
mpd_LDFLAGS += -lm
mpd_DIRS := $(O)/src/inputPlugins $(O)/src/audioOutputs
STRIP ?= strip
export O CC CPPFLAGS CFLAGS HOST SHELL
defconfig: $(O)/config.mk
$(O)/config.mk:
@test -d "$(@D)" || $(SHELL) ./bs/mkdir_p.sh "$(@D)"
@if ! test -e $@; then \
sed -e 's/@@HOST@@/$(HOST)/g' \
< bs/config.mk.default > $@+ && mv $@+ $@ && \
echo Please edit $(O)/config.mk to your liking; fi
@touch $@
$(O)/src/../config.h: $(O)/config.h
$(O)/config.h: $(O)/config.mk $(O)/config_detected.h
$(MAKE) -f bs/mkconfig.h.mk $(O)/config.h
$(O)/config_detected.h:
@test -d "$(@D)" || $(SHELL) ./bs/mkdir_p.sh "$(@D)"
> $@+ && $(SHELL) ./bs/mkconfig-header.sh >> $@+ && \
$(SHELL) ./bs/cross-arch.sh >> $@+ && mv $@+ $@
all: $(O)/src/mpd
@echo OK $<
strip: $(O)/src/mpd
$(STRIP) $(STRIP_OPTS) $<
$(O)/src/mpd: $(mpd_OBJ)
$(CC) -o $@ $^ $(CFLAGS) $(mpd_CFLAGS) $(LDFLAGS) $(mpd_LDFLAGS)
$(O)/src/%.o: src/%.c $(O)/config.h
@HDR_DEP_HACK="$(O)/config.h $(mpd_HDR)" \
CFLAGS="$(CFLAGS) $(mpd_CFLAGS)" \
$(SHELL) ./bs/mkdep.sh $< $(dir $<) $(subst .o,.d,$@)
$(CC) $(CPPFLAGS) $(CFLAGS) $(mpd_CFLAGS) -c -o $@ $<
$(mpd_SRC): $(O)/config.h
clean:
$(RM) $(O)/src/mpd $(mpd_OBJ)
reallyclean: clean
$(RM) $(mpd_DEP) $(O)/depmode $(O)/config.h
# in case a .d file had a dep on a deleted file, we have this:
src/%.h src/%.c::
@true
# we only do static linking in bs (since our main goal is cross-compiling),
# if you want dynamic linking, use autotools
$(O)/%.a::
$(RM) $@
$(AR) cru $@ $^
$(RANLIB) $@
dist:
$(SHELL) ./bs/mkdist.sh
.PHONY: clean reallyclean defconfig all
.PRECIOUS: $(O)/%.h
.SUFFIXES:
.SUFFIXES: .c .o .h .d