sfeed-box.sh: cleanup and simplify - randomcrap - random crap programs of varying quality
(HTM) git clone git://git.codemadness.org/randomcrap
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 8dc3054b2de49534bba2d74d818b44e1187652ad
(DIR) parent d15b0b1cff53d00bd6ce18c9744c3250138e8aa9
(HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Mon, 9 Sep 2024 16:38:58 +0200
sfeed-box.sh: cleanup and simplify
... and after running the build you can simply "make install" now.
Diffstat:
M sfeed/sfeed-box.sh | 140 +++++++++++++++++--------------
1 file changed, 78 insertions(+), 62 deletions(-)
---
(DIR) diff --git a/sfeed/sfeed-box.sh b/sfeed/sfeed-box.sh
@@ -1,104 +1,120 @@
#!/bin/sh
-# adapted from sbase sbase-box.
-# combine binaries from sfeed into one binary to save some more space.
-if ! test -f sfeed.c; then
- echo "current directory should be in sfeed source-code directory" >&2
- exit 1
-fi
-
-CC="cc"
-CFLAGS="-Os -flto -Wall" # optimize for size
-#CFLAGS="-Os" # optimize for size
+CC="${CC:-cc}"
+AR="${AR:-ar}"
+RANLIB="${RANLIB:-ranlib}"
+CFLAGS="-Os -flto -Wall" # optimize for size and enable link-time optimizations.
+# use minicurses (no linking with (n)curses)
CPPFLAGS="-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 -D_BSD_SOURCE -DSFEED_MINICURSES"
-LDFLAGS="-s -flto -Wl,--gc-sections" # strip
-#LDFLAGS="-s" # strip
+LDFLAGS="-s -flto -Wl,--gc-sections" # aggressive strip and link-time optimizations.
# uncomment for static-linked.
#STATIC="-static"
-hdr="minicurses.h util.h xml.h themes"
-src=$(ls -1 sfeed*.c)
-lib="util.c xml.c"
-scripts="sfeed_content sfeed_markread sfeed_opml_export sfeed_update"
-box="build/sfeed-box.c"
+src="sfeed.c sfeed_atom.c sfeed_curses.c sfeed_frames.c sfeed_gopher.c sfeed_html.c sfeed_json.c sfeed_mbox.c sfeed_opml_import.c sfeed_plain.c sfeed_twtxt.c sfeed_web.c sfeed_xmlenc.c"
+obj="sfeed.o sfeed_atom.o sfeed_curses.o sfeed_frames.o sfeed_gopher.o sfeed_html.o sfeed_json.o sfeed_mbox.o sfeed_opml_import.o sfeed_plain.o sfeed_twtxt.o sfeed_web.o sfeed_xmlenc.o"
+libsrc="util.c xml.c"
+libobj="util.o xml.o"
# uncomment compatsrc for some systems (non-BSD).
compatsrc="strlcpy.c strlcat.c"
compatobj="strlcat.o strlcpy.o"
-do_build() {
- rm -rf build
- mkdir -p build
- cp -fR $hdr $compatsrc $lib build/
+# compile source from stdin to object file.
+compile() {
+ echo "compile: $1"
+ ${CC} ${STATIC} ${CFLAGS} ${CPPFLAGS} -x c -c - -o "$1"
+}
-cat <<! > "$box"
+box() {
+cat <<!
#include <stdio.h>
#include <string.h>
-!
- # replace main with program_main
- for f in $src; do
- n="${f%.c}"
- sed "s/^main(/$(echo "$n" | sed s/-/_/g)_&/" < $f > "build/$f"
+int sfeed_atom_main(int argc, char *argv[]);
+int sfeed_curses_main(int argc, char *argv[]);
+int sfeed_frames_main(int argc, char *argv[]);
+int sfeed_gopher_main(int argc, char *argv[]);
+int sfeed_html_main(int argc, char *argv[]);
+int sfeed_json_main(int argc, char *argv[]);
+int sfeed_mbox_main(int argc, char *argv[]);
+int sfeed_opml_import_main(void);
+int sfeed_plain_main(int argc, char *argv[]);
+int sfeed_twtxt_main(int argc, char *argv[]);
+int sfeed_web_main(int argc, char *argv[]);
+int sfeed_xmlenc_main(void);
+
+int sfeed_main(int argc, char *argv[]);
- decl=$(sed -nE 's@^(main\(.*\))$@\1@p' < $f)
- echo "int ${n}_${decl};" >> "$box"
+int
+main(int argc, char *argv[])
+{
+ const char *s = ((s = strrchr(argv[0], '/'))) ? s + 1 : argv[0];
+
+ if (!strcmp(s, "sfeed_atom")) return sfeed_atom_main(argc, argv);
+ else if (!strcmp(s, "sfeed_curses")) return sfeed_curses_main(argc, argv);
+ else if (!strcmp(s, "sfeed_frames")) return sfeed_frames_main(argc, argv);
+ else if (!strcmp(s, "sfeed_gopher")) return sfeed_gopher_main(argc, argv);
+ else if (!strcmp(s, "sfeed_html")) return sfeed_html_main(argc, argv);
+ else if (!strcmp(s, "sfeed_json")) return sfeed_json_main(argc, argv);
+ else if (!strcmp(s, "sfeed_mbox")) return sfeed_mbox_main(argc, argv);
+ else if (!strcmp(s, "sfeed_opml_import")) return sfeed_opml_import_main();
+ else if (!strcmp(s, "sfeed_plain")) return sfeed_plain_main(argc, argv);
+ else if (!strcmp(s, "sfeed_twtxt")) return sfeed_twtxt_main(argc, argv);
+ else if (!strcmp(s, "sfeed_web")) return sfeed_web_main(argc, argv);
+ else if (!strcmp(s, "sfeed_xmlenc")) return sfeed_xmlenc_main();
+ return sfeed_main(argc, argv);
+}
+!
+}
+
+do_build() {
+ # lib
+ for f in ${libsrc} ${compatsrc}; do
+ compile "${f%.c}.o" < "$f"
+ done
+ for f in util xml; do
+ ${AR} -rc "lib${f}.a" "${f}.o"
+ ${RANLIB} "lib${f}.a"
done
- # real main, compare argv[0] to program name.
- echo "int main(int argc, char *argv[]) { const char *s = ((s = strrchr(argv[0], '/'))) ? s + 1 : argv[0]; if(0);" >> "$box"
+ # replace main with program_main
for f in $src; do
- n="${f%.c}"
- [ "$n" = "sfeed" ] && continue
-
- decl=$(sed -nE 's@^(main\(int.*\))$@\1@p' < $f)
- if [ "$decl" != "" ]; then
- decl="main(argc, argv);"
- else
- decl="main();"
- fi
- echo "else if(!strcmp(s, \"$n\")) return $(echo "$n" | sed s/-/_/g)_${decl}" >> "$box"
+ sed "s/^main(/$(echo "${f%.c}" | sed s/-/_/g)_&/" < $f | compile "${f%.c}.o"
done
- echo 'return sfeed_main(argc, argv); }' >> "$box"
+
+ box | compile "sfeed-box.o"
}
-do_compile() {
- cd build/
- $CC $STATIC $CFLAGS $CPPFLAGS -c *.c
+do_link() {
+ echo "link sfeed-box"
$CC $STATIC $CFLAGS $LDFLAGS -o \
sfeed-box \
- *.o
- strip sfeed-box
- cd ../
+ ${obj} ${libobj} ${compatobj} \
+ sfeed-box.o
+# strip sfeed-box
}
do_install() {
- rm -rf install
- mkdir -p install
- cd install
- cp ../build/sfeed-box sfeed
+ cp -f sfeed-box sfeed
# symlink, except use "sfeed" as "sfeed-box" itself.
for f in $src; do
- n="${f%.c}"
- [ "$n" = "sfeed" ] && continue
- ln -s sfeed "$n"
- done
- cd ../
+ [ "$f" = "sfeed.c" ] && continue
- # copy shellscripts.
- cp -f $scripts install/
+ ln -sf sfeed "${f%.c}" # symlink
+ #ln -f sfeed "${f%.c}" # hardlink
+ done
}
do_list() {
- ls -l install/
- size install/sfeed
+ size sfeed-box
+ ls -l sfeed-box
}
if [ "$1" != "" ]; then
"do_$1"
else
do_build
- do_compile
+ do_link
do_install
do_list
fi