diff --git a/.gitignore b/.gitignore
index c5e35f7..a12f5a3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+*.a
/cli/rtbuf
config.mk
/doc/
diff --git a/config.subr b/config.subr
index 0b8f7db..bdd1e51 100644
--- a/config.subr
+++ b/config.subr
@@ -1,11 +1,11 @@
#!/bin/sh
## rtbuf
-## Copyright 2018-2022 kmx.io <contact@kmx.io>
+## Copyright 2018-2023 kmx.io <contact@kmx.io>
##
-## Permission is hereby granted to use this software granted
-## the above copyright notice and this permission paragraph
-## are included in all copies and substantial portions of this
-## software.
+## Permission is hereby granted to use this software excepted
+## on Apple computers granted the above copyright notice and
+## this permission paragraph are included in all copies and
+## substantial portions of this software.
##
## THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
## PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
@@ -14,13 +14,19 @@
set -e
+echo "$(basename "$PWD")/$(basename "$0")"
+
o_rule() {
"$CC" $CPPFLAGS $CFLAGS -M "$1" || { echo "$1" | sed -e 's/^\(.*\)\.c$/\1.o: \1.c/'; }
echo "$1" | sed -e 's/^\(.*\)\.c$/\1.o: Makefile config.mk/'
}
+ext_rule() {
+ o_rule "$2" | sed -e "s/[.]o:/$1:/"
+}
+
lo_rule() {
- o_rule "$1" | sed -e 's/[.]o:/.lo:/'
+ ext_rule .lo "$1"
}
prog_rule() {
@@ -31,16 +37,95 @@ c2prog() {
echo "$@" | sed -e 's/[.]c$//' -e 's/[.]c / /g'
}
+c2ext() {
+ EXT="$1"; shift
+ echo "$@" | sed -e "s/[.]c$/${EXT}/" -e "s/[.]c /${EXT} /g"
+}
+
c2o() {
- echo "$@" | sed -e 's/[.]c$/.o/' -e 's/[.]c /.o /g'
+ c2ext .o "$@"
}
c2lo() {
- echo "$@" | sed -e 's/[.]c$/.lo/' -e 's/[.]c /.lo /g'
+ c2ext .lo "$@"
}
c2la() {
- echo "$@" | sed -e 's/[.]c$/.la/' -e 's/[.]c /.la /g'
+ c2ext .la "$@"
+}
+
+config_asan() {
+ echo "int main() { return 0; }" > .config_asan.c
+ if $CC $CFLAGS .config_asan.c $LDFLAGS -lasan -o /dev/null 2>/dev/null; then
+ HAVE_ASAN=true
+ else
+ HAVE_ASAN=false
+ fi
+ rm .config_asan.c
+}
+
+config_glfw3() {
+ if pkg-config glfw3; then
+ CFLAGS="$CFLAGS $(pkg-config --cflags glfw3)"
+ LIBS="$LIBS $(pkg-config --libs glfw3)"
+ HAVE_GLFW3=Yes
+ else
+ HAVE_GLFW3=No
+ fi
+ echo "Checking library glfw3: $HAVE_GLFW3" >&2
+ echo "HAVE_GLFW3 = $HAVE_GLFW3" >> ${CONFIG_MK}
+}
+
+config_gnu() {
+ if grep -q _GNU_SOURCE /usr/include/features.h 2>/dev/null; then
+ CFLAGS="$CFLAGS -D_GNU_SOURCE"
+ fi
+}
+
+config_libbsd() {
+ if pkg-config libbsd-overlay; then
+ HAVE_LIBBSD=Yes
+ else
+ HAVE_LIBBSD=No
+ fi
+}
+
+config_portaudio() {
+ if pkg-config portaudio-2.0; then
+ CFLAGS="$CFLAGS $(pkg-config --cflags portaudio-2.0)"
+ LIBS="$LIBS $(pkg-config --libs portaudio-2.0)"
+ HAVE_PORTAUDIO=Yes
+ else
+ HAVE_PORTAUDIO=No
+ fi
+ echo "Checking library portaudio: $HAVE_PORTAUDIO" >&2
+ echo "HAVE_PORTAUDIO = $HAVE_PORTAUDIO" >> ${CONFIG_MK}
+}
+
+config_sndio() {
+ if pkg-config sndio; then
+ CFLAGS="$CFLAGS $(pkg-config --cflags sndio)"
+ LIBS="$LIBS $(pkg-config --libs sndio)"
+ HAVE_SNDIO=Yes
+ else
+ OLD_LIBS="$LIBS"
+ LIBS="$LIBS -lsndio"
+ if "${CC}" ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} "${SRCDIR}/lib/sndio/check_sndio.c" ${LIBS} -o /dev/null; then
+ HAVE_SNDIO=Yes
+ else
+ LIBS="${OLD_LIBS}"
+ HAVE_SNDIO=No
+ fi
+ fi
+ echo "Checking library sndio: $HAVE_SNDIO" >&2
+ echo "HAVE_SNDIO = $HAVE_SNDIO" >> ${CONFIG_MK}
+}
+
+pkg_config() {
+ if pkg-config "$1"; then
+ CFLAGS="$CFLAGS $(pkg-config --cflags "$1")"
+ LIBS="$LIBS $(pkg-config --libs "$1")"
+ fi
}
require_pkg_config() {
@@ -53,20 +138,44 @@ require_pkg_config() {
update_config_mk() {
if ! cmp "${CONFIG_MK}" config.mk >/dev/null 2>&1; then
mv "${CONFIG_MK}" config.mk
- echo "$PWD/config.mk"
+ echo "-> $(basename "$PWD")/config.mk"
else
rm "${CONFIG_MK}"
fi
}
+update_sources_mk() {
+ if ! cmp "${SOURCES_MK}" sources.mk >/dev/null 2>&1; then
+ mv "${SOURCES_MK}" sources.mk
+ echo "-> $(basename "$PWD")/sources.mk"
+ else
+ rm "${SOURCES_MK}"
+ fi
+}
+
+update_sources_sh() {
+ if ! cmp "${SOURCES_SH}" sources.sh >/dev/null 2>&1; then
+ mv "${SOURCES_SH}" sources.sh
+ echo "-> $(basename "$PWD")/sources.sh"
+ else
+ rm "${SOURCES_SH}"
+ fi
+}
+
CONFIG_MK=config.mk
CONFIG_MK=".config.mk.tmp"
echo "# config.mk generated by configure" > ${CONFIG_MK}
+SOURCES_MK=sources.mk
+SOURCES_MK=".sources.mk.tmp"
+SOURCES_SH=sources.sh
+SOURCES_SH=".sources.sh.tmp"
+
VER=0.4
echo "VER = $VER" >> ${CONFIG_MK}
+echo "SRC_TOP = $SRC_TOP" >> ${CONFIG_MK}
-if test -z "$CC"; then
+if [ "x$CC" = "x" ]; then
if test -n $(which cc); then
CC=cc
elif test -n $(which gcc); then
@@ -75,7 +184,31 @@ if test -z "$CC"; then
fi
echo "CC = $CC" >> ${CONFIG_MK}
-if test -z "$LIBTOOL"; then
+if [ "x$GCOV" = "x" ]; then
+ if which gcov >/dev/null 2>&1; then
+ GCOV=gcov
+ HAVE_GCOV=true
+ elif which egcov >/dev/null 2>&1; then
+ GCOV=egcov
+ HAVE_GCOV=true
+ fi
+ HAVE_GCOV=false
+else
+ HAVE_GCOV=true
+fi
+echo "HAVE_GCOV = $HAVE_GCOV" >> ${CONFIG_MK}
+if ${HAVE_GCOV}; then
+ echo "GCOV = $GCOV" >> ${CONFIG_MK}
+fi
+
+if [ "x$INSTALL" = "x" ]; then
+ if test -x "$(which install)"; then
+ INSTALL=install
+ fi
+fi
+echo "INSTALL = $INSTALL" >> ${CONFIG_MK}
+
+if [ "x$LIBTOOL" = "x" ]; then
if test -x "$(which glibtool 2>/dev/null)"; then
LIBTOOL="$(which glibtool)"
elif test -x "/usr/local/bin/libtool"; then
@@ -88,37 +221,30 @@ if test -z "$LIBTOOL"; then
fi
echo "LIBTOOL = $LIBTOOL" >> ${CONFIG_MK}
-if test -z "$INSTALL"; then
- if test -x "$(which install)"; then
- INSTALL=install
- fi
-fi
-echo "INSTALL = $INSTALL" >> ${CONFIG_MK}
-
PREFIX="${PREFIX:-/usr/local}"
echo "PREFIX = $PREFIX" >> ${CONFIG_MK}
-if test -z "$OWNER"; then
- OWNER="$(ls -ld "$PREFIX/" | tr -s ' ' | cut -d ' ' -f 3)"
+if [ "x$OWNER" = "x" ]; then
+ OWNER="$(ls -ld "$PREFIX" | tr -s ' ' | cut -d ' ' -f 3)"
fi
echo "OWNER = $OWNER" >> ${CONFIG_MK}
-if test -z "$GROUP"; then
- GROUP="$(ls -ld "$PREFIX/" | tr -s ' ' | cut -d ' ' -f 4)"
+if [ "x$GROUP" = "x" ]; then
+ GROUP="$(ls -ld "$PREFIX" | tr -s ' ' | cut -d ' ' -f 4)"
fi
echo "GROUP = $GROUP" >> ${CONFIG_MK}
-if test -z "$BINDIR"; then
+if [ "x$BINDIR" = "x" ]; then
BINDIR=${PREFIX}/bin
fi
echo "BINDIR = $BINDIR" >> ${CONFIG_MK}
-if test -z "$LIBDIR"; then
+if [ "x$LIBDIR" = "x" ]; then
LIBDIR=${PREFIX}/lib
fi
echo "LIBDIR = $LIBDIR" >> ${CONFIG_MK}
-if test -z "$RTBUF_LIBDIR"; then
+if [ "x$RTBUF_LIBDIR" = "x" ]; then
RTBUF_LIBDIR=${LIBDIR}/rtbuf/${VER}
fi
echo "RTBUF_LIBDIR = $RTBUF_LIBDIR" >> ${CONFIG_MK}
@@ -153,63 +279,6 @@ rtbuf_library() {
done
}
-check_glfw3() {
- LOG=.lib.glfw3.config.log
- OLD_CFLAGS=$CFLAGS
- OLD_LIBS=$LIBS
- CFLAGS="$CFLAGS $(pkg-config --cflags glfw3)"
- LIBS="$LIBS $(pkg-config --libs glfw3)"
- echo "$CC" $CPPFLAGS $CFLAGS "${LIB_SRCDIR}/glfw3/config.c" -o /dev/null ${LDFLAGS} ${LIBS} > $LOG
- if "$CC" $CPPFLAGS $CFLAGS "${LIB_SRCDIR}/glfw3/config.c" -o /dev/null ${LDFLAGS} ${LIBS} >> $LOG 2>&1; then
- HAVE_GLFW3=Yes
- else
- HAVE_GLFW3=No
- CFLAGS=$OLD_CFLAGS
- LIBS=$OLD_LIBS
- fi
- echo "Checking library glfw3: $HAVE_GLFW3" >&2
- echo "HAVE_GLFW3 = $HAVE_GLFW3" >> ${CONFIG_MK}
-}
-
-check_libbsd() {
- if pkg-config libbsd-overlay; then
- HAVE_LIBBSD=Yes
- else
- HAVE_LIBBSD=No
- fi
-}
-
-check_portaudio() {
- if pkg-config portaudio-2.0; then
- CFLAGS="$CFLAGS $(pkg-config --cflags portaudio-2.0)"
- LIBS="$LIBS $(pkg-config --libs portaudio-2.0)"
- HAVE_PORTAUDIO=Yes
- else
- HAVE_PORTAUDIO=No
- fi
- echo "Checking library portaudio: $HAVE_PORTAUDIO" >&2
- echo "HAVE_PORTAUDIO = $HAVE_PORTAUDIO" >> ${CONFIG_MK}
-}
-
-check_sndio() {
- if pkg-config sndio; then
- CFLAGS="$CFLAGS $(pkg-config --cflags sndio)"
- LIBS="$LIBS $(pkg-config --libs sndio)"
- HAVE_SNDIO=Yes
- else
- OLD_LIBS="$LIBS"
- LIBS="$LIBS -lsndio"
- if "${CC}" ${CPPFLAGS} ${CFLAGS} ${LDFLAGS} "${SRCDIR}/lib/sndio/check_sndio.c" ${LIBS} -o /dev/null; then
- HAVE_SNDIO=Yes
- else
- LIBS="${OLD_LIBS}"
- HAVE_SNDIO=No
- fi
- fi
- echo "Checking library sndio: $HAVE_SNDIO" >&2
- echo "HAVE_SNDIO = $HAVE_SNDIO" >> ${CONFIG_MK}
-}
-
type_prog() {
TYPE_SRC="$1_type.c"
TYPE_PROG="$(c2prog "$TYPE_SRC")"
diff --git a/configure b/configure
index 6e03c0b..9eecde1 100755
--- a/configure
+++ b/configure
@@ -13,7 +13,7 @@
## THIS SOFTWARE.
set -e
-export SRCDIR="$PWD"
+export RTBUF_SRC_TOP="$(pwd)/.."
PREFIX="${PREFIX:-/usr/local}"
if [ "x$1" = "x--prefix" ]; then
diff --git a/librtbuf/Makefile b/librtbuf/Makefile
index ada4a2d..94549f1 100644
--- a/librtbuf/Makefile
+++ b/librtbuf/Makefile
@@ -10,11 +10,50 @@
## PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
## AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
## THIS SOFTWARE.
-all: librtbuf.la
+CLEANFILES = *.a *.gcno *.la librtbuf.la .libs *.lo *.o
+
+CLEANFILES_COV = *.css *.gcda *.html .libs/*.gcda
+CLEANFILES += ${CLEANFILES_COV}
+
+DISTCLEANFILES = ${CLEANFILES} config.mk
+
+build: librtbuf.la librtbuf.a
+
+all:
+ ${MAKE} build
+ if ${HAVE_GCOV}; then ${MAKE} cov; fi
+ ${MAKE} debug
+ if ${HAVE_ASAN}; then ${MAKE} asan; fi
+
+asan: librtbuf.asan.la librtbuf.asan.a
clean:
- rm -rf .libs *.o *.lo *.la *.gcno *.gcna
+ rm -rf ${CLEANFILES}
+
+clean_cov:
+ rm -rf ${CLEANFILES_COV}
+
+cov: librtbuf.cov.la librtbuf.cov.a
+
+debug: librtbuf.debug.la librtbuf.debug.a
+
+distclean:
+ rm -rf ${DISTCLEANFILES}
+
+gcovr:
+ gcovr --gcov-executable ${GCOV} --html-details librtbuf.html
+
+librtbuf.a: librtbuf.la
+ cp .libs/librtbuf.a ./
+
+librtbuf.asan.a: librtbuf.asan.la
+ cp .libs/librtbuf.asan.a ./
+
+librtbuf.cov.a: librtbuf.cov.la
+ cp .libs/librtbuf.cov.a ./
-.PHONY: all clean
+librtbuf.debug.a: librtbuf.debug.la
+ cp .libs/librtbuf.debug.a ./
include config.mk
+include sources.mk
diff --git a/librtbuf/configure b/librtbuf/configure
index 0489a5b..7761bda 100755
--- a/librtbuf/configure
+++ b/librtbuf/configure
@@ -13,59 +13,121 @@
## THIS SOFTWARE.
set -e
+export RTBUF_SRC_TOP="$(pwd)/.."
+
. ../config.subr
LIB=librtbuf.la
+LIB_ASAN=librtbuf.asan.la
+LIB_COV=librtbuf.cov.la
+LIB_DEBUG=librtbuf.debug.la
-SOURCES="$(ls *.c | tr '\n' ' ')"
-echo "SOURCES = $SOURCES" >> ${CONFIG_MK}
+. ./sources.sh
-OBJECTS="$(c2lo "$SOURCES")"
+OBJECTS="$(c2ext .main.lo "$LO_SOURCES")"
echo "OBJECTS = $OBJECTS" >> ${CONFIG_MK}
+OBJECTS_ASAN="$(c2ext .asan.lo "$LO_SOURCES")"
+OBJECTS_COV="$(c2ext .cov.lo "$LO_SOURCES")"
+OBJECTS_DEBUG="$(c2ext .debug.lo "$LO_SOURCES")"
-check_libbsd
+# Default config
+CPPFLAGS="${CPPFLAGS:=}"
+ENV_CFLAGS="${CFLAGS:=}"
+DEFAULT_CFLAGS="-O2 -pipe -fPIC"
+LDFLAGS="${LDFLAGS:=}"
+LIBS="${LIBS:=-lm}"
+# Common config for all targets
+CFLAGS="$CFLAGS -W -Wall -Werror -std=c99 -pedantic"
CPPFLAGS="$CPPFLAGS -DRTBUF_LIBDIR=\\\"${RTBUF_LIBDIR}\\\""
CPPFLAGS="$CPPFLAGS -DVER=\\\"${VER}\\\""
-if pkg-config libbsd-overlay; then
- CPPFLAGS="$CPPFLAGS -D_DEFAULT_SOURCE -D__USE_MISC"
-fi
-echo "CPPFLAGS = $CPPFLAGS" >> ${CONFIG_MK}
+config_asan
+config_gnu
+pkg_config libbsd-overlay
+pkg_config libffi
+pkg_config libmd
-if [ x"$DEBUG" = x"yes" ]; then
- CFLAGS="$CFLAGS -DDEBUG -O0 -ggdb"
-else
- CFLAGS="$CFLAGS -DNDEBUG -O3"
-fi
-CFLAGS="$CFLAGS -W -Wall -Werror -std=c89 -pedantic"
-if pkg-config libbsd-overlay; then
- CFLAGS="$CFLAGS $(pkg-config --cflags libbsd-overlay)"
-fi
-echo "CFLAGS = $CFLAGS" >> ${CONFIG_MK}
+# Address Sanitizer config
+CFLAGS_ASAN="$CFLAGS -fsanitize=address -O1 -fno-omit-frame-pointer -g"
+LDFLAGS_ASAN="$LDFLAGS"
+LIBS_ASAN="$LIBS"
-if test -d /opt/homebrew/lib; then
- LDFLAGS="$LDFLAGS -L/opt/homebrew/lib -lSystem"
-fi
-echo "LDFLAGS = $LDFLAGS" >> ${CONFIG_MK}
+# Coverage config
+CFLAGS_COV="$CFLAGS -ftest-coverage -fprofile-arcs"
+LDFLAGS_COV="$LDFLAGS"
+LIBS_COV="$LIBS"
-LIBS=""
-if pkg-config libbsd-overlay; then
- LIBS="$LIBS $(pkg-config --libs libbsd-overlay)"
+# Debug config
+CFLAGS_DEBUG="$CFLAGS -DDEBUG -O0 -ggdb"
+LDFLAGS_DEBUG="$LDFLAGS"
+LIBS_DEBUG="$LIBS"
+
+# Main config
+if [ "x$ENV_CFLAGS" = "x" ]; then
+ CFLAGS="$CFLAGS $DEFAULT_CFLAGS"
fi
-echo "LIBS = $LIBS" >> ${CONFIG_MK}
+CFLAGS="$CFLAGS -DNDEBUG"
+LIBS="$LIBS"
-for SRC in $SOURCES; do
- SRC_LO="$(c2lo "$SRC")"
- echo >> ${CONFIG_MK}
- lo_rule "$SRC" >> ${CONFIG_MK}
- echo " ${LIBTOOL} --tag=CC --mode=compile \${CC} \${CPPFLAGS} \${CFLAGS} -c $SRC -o $SRC_LO" >> ${CONFIG_MK}
-done
+echo "HAVE_ASAN = $HAVE_ASAN" >> ${CONFIG_MK}
+echo "CPPFLAGS = $CPPFLAGS" >> ${CONFIG_MK}
+echo "CFLAGS = $CFLAGS" >> ${CONFIG_MK}
+echo "LDFLAGS = $LDFLAGS" >> ${CONFIG_MK}
+echo "LIBS = $LIBS" >> ${CONFIG_MK}
+echo >> ${CONFIG_MK}
+echo "CFLAGS_ASAN = $CFLAGS_ASAN" >> ${CONFIG_MK}
+echo "LDFLAGS_ASAN = $LDFLAGS_ASAN" >> ${CONFIG_MK}
+echo "LIBS_ASAN = $LIBS_ASAN" >> ${CONFIG_MK}
+echo >> ${CONFIG_MK}
+echo "CFLAGS_COV = $CFLAGS_COV" >> ${CONFIG_MK}
+echo "LDFLAGS_COV = $LDFLAGS_COV" >> ${CONFIG_MK}
+echo "LIBS_COV = $LIBS_COV" >> ${CONFIG_MK}
+echo >> ${CONFIG_MK}
+echo "CFLAGS_DEBUG = $CFLAGS_DEBUG" >> ${CONFIG_MK}
+echo "LDFLAGS_DEBUG = $LDFLAGS_DEBUG" >> ${CONFIG_MK}
+echo "LIBS_DEBUG = $LIBS_DEBUG" >> ${CONFIG_MK}
echo >> ${CONFIG_MK}
echo "$LIB: $OBJECTS" >> ${CONFIG_MK}
-echo " ${LIBTOOL} --tag=CC --mode=link \${CC} \${LDFLAGS} $OBJECTS \${LIBS} -o $LIB -rpath ${LIBDIR}" >> ${CONFIG_MK}
+echo " ${LIBTOOL} --tag=CC --mode=link \${CC} \${LDFLAGS} ${OBJECTS} \${LIBS} -o ${LIB} -rpath ${LIBDIR}" >> ${CONFIG_MK}
+
+echo >> ${CONFIG_MK}
+echo "$LIB_ASAN: $OBJECTS_ASAN" >> ${CONFIG_MK}
+echo " ${LIBTOOL} --tag=CC --mode=link \${CC} \${LDFLAGS_ASAN} ${OBJECTS_ASAN} \${LIBS_ASAN} -o ${LIB_ASAN}" >> ${CONFIG_MK}
+
+echo >> ${CONFIG_MK}
+echo "$LIB_COV: $OBJECTS_COV" >> ${CONFIG_MK}
+echo " ${LIBTOOL} --tag=CC --mode=link \${CC} \${LDFLAGS_COV} ${OBJECTS_COV} \${LIBS_COV} -o ${LIB_COV}" >> ${CONFIG_MK}
echo >> ${CONFIG_MK}
-echo "install: $LIB" >> ${CONFIG_MK}
+echo "$LIB_DEBUG: $OBJECTS_DEBUG" >> ${CONFIG_MK}
+echo " ${LIBTOOL} --tag=CC --mode=link \${CC} \${LDFLAGS_DEBUG} ${OBJECTS_DEBUG} \${LIBS_DEBUG} -o ${LIB_DEBUG}" >> ${CONFIG_MK}
+
+echo >> ${CONFIG_MK}
+echo "install: ${LIB}" >> ${CONFIG_MK}
echo " \${INSTALL} -o \${OWNER} -g \${GROUP} -m 0755 -d \${LIBDIR}" >> ${CONFIG_MK}
-echo " \${LIBTOOL} --tag=CC --mode=install \${INSTALL} -o \${OWNER} -g \${GROUP} -m 0755 $LIB \${LIBDIR}" >> ${CONFIG_MK}
+echo " \${LIBTOOL} --tag=CC --mode=install \${INSTALL} -o \${OWNER} -g \${GROUP} -m 0755 ${LIB} \${LIBDIR}" >> ${CONFIG_MK}
+
+for SRC in $SOURCES; do
+ echo >> ${CONFIG_MK}
+ SRC_LO="$(c2ext .main.lo "$SRC")"
+ ext_rule .main.lo "$SRC" >> ${CONFIG_MK}
+ echo " ${LIBTOOL} --tag=CC --mode=compile \${CC} \${CPPFLAGS} \${CFLAGS} -c $SRC -o $SRC_LO" >> ${CONFIG_MK}
+
+ echo >> ${CONFIG_MK}
+ SRC_ASAN_LO="$(c2ext .asan.lo "$SRC")"
+ ext_rule .asan.lo "$SRC" >> ${CONFIG_MK}
+ echo " ${LIBTOOL} --tag=CC --mode=compile \${CC} \${CPPFLAGS} \${CFLAGS_ASAN} -c $SRC -o $SRC_ASAN_LO" >> ${CONFIG_MK}
+
+ echo >> ${CONFIG_MK}
+ SRC_COV_LO="$(c2ext .cov.lo "$SRC")"
+ ext_rule .cov.lo "$SRC" >> ${CONFIG_MK}
+ echo " ${LIBTOOL} --tag=CC --mode=compile \${CC} \${CPPFLAGS} \${CFLAGS_COV} -c $SRC -o $SRC_COV_LO" >> ${CONFIG_MK}
+
+ echo >> ${CONFIG_MK}
+ SRC_DEBUG_LO="$(c2ext .debug.lo "$SRC")"
+ ext_rule .debug.lo "$SRC" >> ${CONFIG_MK}
+ echo " ${LIBTOOL} --tag=CC --mode=compile \${CC} \${CPPFLAGS} \${CFLAGS_DEBUG} -c $SRC -o $SRC_DEBUG_LO" >> ${CONFIG_MK}
+done
+
+update_config_mk
diff --git a/librtbuf/sources.mk b/librtbuf/sources.mk
new file mode 100644
index 0000000..1c6ec58
--- /dev/null
+++ b/librtbuf/sources.mk
@@ -0,0 +1,3 @@
+# sources.mk generated by update_sources
+SOURCES = data.c rtbuf.c rtbuf_lib.c rtbuf_proc.c rtbuf_type.c rtbuf_var.c symbol.c
+LO_SOURCES = data.c rtbuf.c rtbuf_lib.c rtbuf_proc.c rtbuf_type.c rtbuf_var.c symbol.c
diff --git a/librtbuf/sources.sh b/librtbuf/sources.sh
new file mode 100644
index 0000000..ee23088
--- /dev/null
+++ b/librtbuf/sources.sh
@@ -0,0 +1,3 @@
+# sources.sh generated by update_sources
+SOURCES='data.c rtbuf.c rtbuf_lib.c rtbuf_proc.c rtbuf_type.c rtbuf_var.c symbol.c '
+LO_SOURCES='data.c rtbuf.c rtbuf_lib.c rtbuf_proc.c rtbuf_type.c rtbuf_var.c symbol.c '
diff --git a/librtbuf/update_sources b/librtbuf/update_sources
new file mode 100755
index 0000000..8ca1c6a
--- /dev/null
+++ b/librtbuf/update_sources
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+. ../config.subr
+
+echo "# sources.mk generated by update_sources" > ${SOURCES_MK}
+echo "# sources.sh generated by update_sources" > ${SOURCES_SH}
+
+SOURCES="$(ls *.c)"
+SOURCES="$(echo "$SOURCES" | tr '\n' ' ')"
+echo "SOURCES = $SOURCES" >> ${SOURCES_MK}
+echo "SOURCES='$SOURCES'" >> ${SOURCES_SH}
+
+LO_SOURCES="$SOURCES"
+echo "LO_SOURCES = $LO_SOURCES" >> ${SOURCES_MK}
+echo "LO_SOURCES='$LO_SOURCES'" >> ${SOURCES_SH}
+
+update_sources_mk
+update_sources_sh