чување 8cd16ee13cb7b2ef679dd28169767235eaae06c6
родитељ c68cefd4ea09a2f7aa6c29822f078f33c389f641
Аутор: Страхиња Радић <sr@strahinja.org>
Датум: Tue, 20 Jan 2026 09:03:30 +0100
Add lib, update Makefile, config.mk
Diffstat:
измењених датотека: 8, додавања: 183(+), брисања: 9(-)
diff --git a/Makefile b/Makefile
@@ -3,9 +3,27 @@
include config.mk
.SUFFIXES:
-.SUFFIXES: .y .l .c .o
+.SUFFIXES: .h.in .h .y .l .c .o
-all: bool
+.h.in.h:
+ sh lib/replacepat $< $@
+
+all: makedate makeversion $(PROG)
+ if [ -f .rebuild ]; then rm .rebuild; make -e all; else true; fi
+
+date:
+ sh lib/makedate
+
+version:
+ sh lib/makeversion
+
+makedate:
+ sh lib/makedate -l
+
+makeversion:
+ sh lib/makeversion -l
+
+version.h:version.h.in date version
lex.yy.c: bool.l
$(FLEX) bool.l
@@ -20,8 +38,8 @@ bool.o: y.tab.c
lex.yy.o: lex.yy.c
-bool: bool.o lex.yy.o
- $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ bool.o lex.yy.o $(LIBS)
+$(PROG): $(OBJS) $(SRC) $(HEADERS)
+ $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
clean:
rm -f bool y.tab.c lex.yy.c *.o *~
diff --git a/config.mk b/config.mk
@@ -1,9 +1,13 @@
-CFLAGS = -Os -Wextra -Wall -pedantic -std=c99
-#CFLAGS = -O0 -ggdb -Wextra -Wall -pedantic -std=c99
+#CFLAGS = -Os -Wextra -Wall -pedantic -std=c99
+CFLAGS = -O0 -ggdb -Wextra -Wall -pedantic -std=c99
CPPFLAGS = -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200809L \
-D_XOPEN_SOURCE=700 -DNDEBUG
+LIBS = #-lfl
+SRC = bool.l bool.y lex.yy.c y.tab.c
+HEADERS = bool.h version.h y.tab.h
+OBJS = bool.o lex.yy.o
#CC = clang
FLEX = flex
-LIBS = #-lfl
YACC = yacc
YACCFLAGS = -d
+PROG = bool
diff --git a/lib/.replacepat.swp b/lib/.replacepat.swp
Бинарне датотеке се разликују.
diff --git a/lib/makedate b/lib/makedate
@@ -0,0 +1,61 @@
+#!/bin/sh -x
+# vim: set ft=bash:
+FALLBACKDATE=${FALLBACKDATE:-unknown}
+LC_ALL=C
+export LC_ALL
+
+if [ -d .got ] && command -v got >/dev/null 2>&1; then
+ got log |
+ awk '
+ /^date: / {
+ sub(/^date: /,"",$0)
+ # Convert to proper form for `mandoc -Tlint`
+ month_names["Jan"] = "January"
+ month_names["Feb"] = "February"
+ month_names["Mar"] = "March"
+ month_names["Apr"] = "April"
+ month_names["May"] = "May"
+ month_names["Jun"] = "June"
+ month_names["Jul"] = "July"
+ month_names["Aug"] = "August"
+ month_names["Sep"] = "September"
+ month_names["Oct"] = "October"
+ month_names["Nov"] = "November"
+ month_names["Dec"] = "December"
+ print month_names[$2] " " $3 ", " $5
+ exit
+ }' >date.new
+elif [ -d .git ] && command -v git >/dev/null 2>&1; then
+ user=$(getent passwd "$(unalias ls >/dev/null 2>&1 || true; \
+ command ls -lnd . | awk '{print $3}')" | awk -F: '{print $1}')
+ if [ -z "$user" ]; then
+ printf "$0: error: Cannot determine owner of %s" "$(pwd)" >&2
+ exit 1
+ fi
+ e_user=$(id -un)
+ if [ "$e_user" = "$user" ]; then
+ git log --format=format:%cd \
+ --date=format:"%B %d, %Y" -1 @ >date.new
+ else
+ su "${user}" -c 'env LC_ALL=C git log --format=format:%cd \
+ --date=format:"%B %d, %Y" -1 @' >date.new
+ fi
+ echo >>date.new
+else
+ printf "%s\n" "$FALLBACKDATE" >date.new
+fi
+
+if [ -f date ]; then
+ if diff date date.new >/dev/null; then
+ rm date.new
+ else
+ mv date.new date
+ touch .rebuild
+ fi
+else
+ mv date.new date
+ touch .rebuild
+fi
+if [ "$1" = "-l" ]; then
+ printf "DATE=\"%s\"\n" "$(cat date)"
+fi
diff --git a/lib/makeversion b/lib/makeversion
@@ -0,0 +1,66 @@
+#!/bin/sh -x
+# vim: set ft=bash:
+FALLBACKVER=${FALLBACKVER:-unknown}
+
+if [ -d .got ] && command -v got >/dev/null 2>&1; then
+ lastcommit=$(got log |
+ awk '/^commit/ {print substr($2,1,7); exit}')
+ got tag -l |
+ awk -v lastcommit="$lastcommit" '
+ /^object: commit/ {
+ if (!lasttagcom)
+ {
+ lasttagcom = substr($3,1,7)
+ }
+ next
+ }
+ /^tag/ {
+ if (!ver)
+ {
+ sub(/^v/,"",$2)
+ ver = $2
+ }
+ next
+ }
+ END {
+ printf "%s", ver
+ if (lastcommit != lasttagcom)
+ {
+ printf "-g%s", lastcommit
+ }
+ printf "\n"
+ }' >version.new
+elif [ -d .git ] && command -v git >/dev/null 2>&1; then
+ LC_ALL=C
+ export LC_ALL
+ user=$(getent passwd "$(unalias ls >/dev/null 2>&1 || true; \
+ command ls -lnd . | awk '{print $3}')" | awk -F: '{print $1}')
+ if [ -z "$user" ]; then
+ printf "$0: error: Cannot determine owner of %s" "$(pwd)" >&2
+ exit 1
+ fi
+ e_user=$(id -un)
+ if [ "$e_user" = "$user" ]; then
+ git describe 2>/dev/null | sed 's/^v//' >version.new
+ else
+ su "$user" -c 'git describe' 2>/dev/null |
+ sed 's/^v//' >version.new
+ fi
+else
+ printf "%s\n" "$FALLBACKVER" >version.new
+fi
+
+if [ -f version ]; then
+ if diff version version.new >/dev/null; then
+ rm version.new
+ else
+ mv version.new version
+ touch .rebuild
+ fi
+else
+ mv version.new version
+ touch .rebuild
+fi
+if [ "$1" = "-l" ]; then
+ printf "VERSION=\"%s\"\n" "$(cat version)"
+fi
diff --git a/lib/mkpack b/lib/mkpack
@@ -0,0 +1,20 @@
+#!/bin/sh -x
+# vim: set ft=bash:
+DISTDIR=$(grep '^PROG[[:space:]]\{1,\}=' config.mk |
+ sed -E 's,.*=[[:space:]]+([[:alpha:]]+),\1,')-$(cat version)
+mkdir "$DISTDIR"
+if [ -d .got ] && command -v got >/dev/null 2>&1; then
+ files=$(got tree | sed -e 's,[@/*$]$,,g')
+elif [ -d .git ] && command -v git >/dev/null 2>&1; then
+ files=$(git ls-files)
+else
+ printf "Either got or git are required for 'make pack'\n" >&2
+ exit 1
+fi
+for f in $files; do
+ d="$DISTDIR"/"$(dirname "$f")"
+ mkdir -p "$d"
+ cp "$f" "$d"/
+done
+tar -cf - "$DISTDIR" | xz -9v - > "$DISTDIR".tar.xz
+rm -fr "$DISTDIR"
diff --git a/lib/replacepat b/lib/replacepat
@@ -0,0 +1,5 @@
+#!/bin/sh -x
+# vim: set ft=bash:
+DATE=$(cat date)
+VERSION=$(cat version)
+sed -e 's|%VERSION%|'"$VERSION"'|g' -e 's|%DATE%|'"$DATE"'|g' "$1" > "$2"
diff --git a/version.h.in b/version.h.in
@@ -3,5 +3,5 @@
* See the file LICENSE for exact copyright and license details. */
#define PROGNAME "bool"
-#define DATE "January 18, 2026"
-#define VERSION "0.1"
+#define DATE "%DATE%"
+#define VERSION "%VERSION%"