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