Commit c0a9ef98 authored by Max Kellermann's avatar Max Kellermann

removed the "bs" build scripts

autotools are somewhat ugly, but that doesn't justify duplicating its effort with another complex build system.
parent 9b5ce27c
......@@ -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 $@
......
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.
# 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 :=
#!/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
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
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
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
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
#!/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
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:
#!/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"
#!/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
#!/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"
#!/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
#!/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)
#!/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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment