add build dependencies and a script for generating them

Tue, 02 Jun 2026 19:30:34 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 02 Jun 2026 19:30:34 +0200
changeset 1158
96c202d45fbb
parent 1157
0a9f4d689c12
child 1159
9811e27e0889

add build dependencies and a script for generating them

Makefile file | annotate | diff | comparison | revisions
application/Makefile file | annotate | diff | comparison | revisions
client/Makefile file | annotate | diff | comparison | revisions
make/Makefile.mk file | annotate | diff | comparison | revisions
make/update-rules.sh file | annotate | diff | comparison | revisions
ucx/Makefile file | annotate | diff | comparison | revisions
ui/common/Makefile file | annotate | diff | comparison | revisions
ui/gtk/Makefile file | annotate | diff | comparison | revisions
ui/motif/Makefile file | annotate | diff | comparison | revisions
ui/server/Makefile file | annotate | diff | comparison | revisions
--- a/Makefile	Mon Jun 01 20:29:26 2026 +0200
+++ b/Makefile	Tue Jun 02 19:30:34 2026 +0200
@@ -35,4 +35,14 @@
 clean: FORCE
 	rm -fR build/*
 
+update-rules: config.mk FORCE
+	$(MAKE) -f make/Makefile.mk update-rules-generic
+	$(MAKE) -f make/Makefile.mk update-rules-toolkit
+
+update-all-rules: config.mk FORCE
+	$(MAKE) -f make/Makefile.mk update-rules-generic
+	for tk in libadwaita motif; do ./configure --toolkit=$$tk \
+		&& $(MAKE) -f make/Makefile.mk update-rules-toolkit ; done
+	echo '!! Attention !! You should now reconfigure your project!'
+
 FORCE:
--- a/application/Makefile	Mon Jun 01 20:29:26 2026 +0200
+++ b/application/Makefile	Tue Jun 02 19:30:34 2026 +0200
@@ -47,6 +47,12 @@
 $(DEMO_BINDINGS): $(DEMO_BINDINGS_OBJ) $(RES_FILE) $(BUILD_ROOT)/build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)uitk$(LIB_EXT)
 	$(LD) -o $(DEMO_BINDINGS) $(DEMO_BINDINGS_OBJ) $(RES_FILE) $(BUILD_ROOT)/build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)uitk$(LIB_EXT) $(BUILD_ROOT)/build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)ucx$(LIB_EXT) $(LDFLAGS) $(TK_LDFLAGS)
 
-../build/application/%$(OBJ_EXT): %.c
-	$(CC) $(CFLAGS) $(TK_CFLAGS) -o $@ -c $<
+FORCE:
 
+../build/application/demo_bindings$(OBJ_EXT): demo_bindings.c \
+ demo_bindings.h
+	$(CC) -o $@ $(CFLAGS) $(TK_CFLAGS) -c $<
+
+../build/application/main$(OBJ_EXT): main.c
+	$(CC) -o $@ $(CFLAGS) $(TK_CFLAGS) -c $<
+
--- a/client/Makefile	Mon Jun 01 20:29:26 2026 +0200
+++ b/client/Makefile	Tue Jun 02 19:30:34 2026 +0200
@@ -51,6 +51,28 @@
 $(APP_BIN): $(APP_BIN_OBJ) $(RES_FILE) $(BUILD_ROOT)/build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)uitk$(LIB_EXT)
 	$(LD) -o $(APP_BIN) $(APP_BIN_OBJ) $(RES_FILE) $(BUILD_ROOT)/build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)uitk$(LIB_EXT) $(BUILD_ROOT)/build/$(BUILD_LIB_DIR)/$(LIB_PREFIX)ucx$(LIB_EXT) $(LDFLAGS) $(TK_LDFLAGS) $(CLIENT_LDFLAGS)
 
-../build/client/%$(OBJ_EXT): %.c
-	$(CC) $(CFLAGS) $(TK_CFLAGS) $(CLIENT_CFLAGS) -o $@ -c $<
+FORCE:
+
+../build/client/args$(OBJ_EXT): args.c args.h ../ui/common/args.h \
+ ../ui/common/../ui/window.h ../ui/common/../ui/toolkit.h \
+ ../ui/common/../ui/container.h ../ui/common/../ui/display.h \
+ ../ui/common/../ui/button.h ../ui/common/../ui/entry.h \
+ ../ui/common/../ui/menu.h ../ui/common/../ui/toolbar.h \
+ ../ui/common/../ui/list.h ../ui/common/../ui/text.h \
+ ../ui/common/../ui/webview.h ../ui/common/../ui/widget.h
+	$(CC) -o $@ $(CFLAGS) $(TK_CFLAGS) $(CLIENT_CFLAGS) -c $<
 
+../build/client/main$(OBJ_EXT): main.c main.h ../ui/common/message.h \
+ uiclient.h
+	$(CC) -o $@ $(CFLAGS) $(TK_CFLAGS) $(CLIENT_CFLAGS) -c $<
+
+../build/client/uiclient$(OBJ_EXT): uiclient.c uiclient.h \
+ ../ui/common/message.h args.h ../ui/common/args.h \
+ ../ui/common/../ui/window.h ../ui/common/../ui/toolkit.h \
+ ../ui/common/../ui/container.h ../ui/common/../ui/display.h \
+ ../ui/common/../ui/button.h ../ui/common/../ui/entry.h \
+ ../ui/common/../ui/menu.h ../ui/common/../ui/toolbar.h \
+ ../ui/common/../ui/list.h ../ui/common/../ui/text.h \
+ ../ui/common/../ui/webview.h ../ui/common/../ui/widget.h
+	$(CC) -o $@ $(CFLAGS) $(TK_CFLAGS) $(CLIENT_CFLAGS) -c $<
+
--- a/make/Makefile.mk	Mon Jun 01 20:29:26 2026 +0200
+++ b/make/Makefile.mk	Tue Jun 02 19:30:34 2026 +0200
@@ -53,5 +53,24 @@
 client: ui FORCE
 	cd client; $(MAKE)
 
+update-rules-generic: FORCE
+	make/update-rules.sh ucx '$$(SHLIB_CFLAGS)'
+	make/update-rules.sh application '$$(TK_CFLAGS)'
+	make/update-rules.sh client '$$(TK_CFLAGS) $$(CLIENT_CFLAGS)'
+	make/update-rules.sh ui '-I../ucx $$(SHLIB_CFLAGS) $$(TK_CFLAGS)' \
+		server/ "\$$(SERVER_OBJPRE)" .o
+
+update-rules-toolkit: FORCE
+	case "$(TOOLKIT)" in \
+		qt*|winui) echo "Not necessary for $(TOOLKIT)." ;; \
+		cocoa) echo "Not yet supported for $(TOOLKIT)." ;; \
+		gtk*|libadwaita) CFLAGS="$(CFLAGS) $(TK_CFLAGS)" make/update-rules.sh ui \
+			'-I../ucx $$(SHLIB_CFLAGS) $$(TK_CFLAGS)' \
+			gtk/ "\$$(GTK_OBJPRE)" .o ;; \
+		motif) CFLAGS="$(CFLAGS) $(TK_CFLAGS)" make/update-rules.sh ui \
+			'-I../ucx $$(SHLIB_CFLAGS) $$(TK_CFLAGS)' \
+			motif/ "\$$(MOTIF_OBJPRE)" .o ;; \
+	esac
+
 FORCE:
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/make/update-rules.sh	Tue Jun 02 19:30:34 2026 +0200
@@ -0,0 +1,74 @@
+#!/bin/sh
+
+# the directory where the executed Makefile is
+dir="$1"
+
+# extra flags to add to the compile recipe (if you want to use extra
+# flags for the dependency resolution, set CFLAGS environment variable)
+extra_flags="$2"
+
+# additional source prefix in case the recipes are for a included Makefile
+src_prefix="$3"
+
+# the target directory for the object files (default: ../build/$dir/)
+target="$4"
+
+# the object file extension to use (default: $(OBJ_EXT) from the config.mk)
+obj_ext="$5"
+
+
+if [ -z "$dir" ]; then
+  echo "Usage: $0 <src_dir>"
+  exit 1
+fi
+
+if [ -z "$target" ]; then
+  target="../build/$dir/"
+fi
+
+if [ -z "$obj_ext" ]; then
+  obj_ext='$(OBJ_EXT)'
+fi
+
+if [ -d "$dir" ]; then
+  :
+else
+  echo "'$dir' is not a directory"
+  exit 1
+fi
+
+if [ -z "$CC" ]; then
+  for cc in gcc clang ; do
+    if command -v "$cc" > /dev/null ; then
+      CC="$cc"
+      break
+    fi
+  done
+fi
+
+if [ -z "$CC" ]; then
+  echo "No suitable compiler found to generate make rules"
+  exit 1
+fi
+
+if command -v sed > /dev/null ; then
+  :
+else
+  echo "You need the 'sed' program for this script to work."
+  exit 1
+fi
+
+# cleanup include paths to only depend on non-system headers
+cflags=`echo $CFLAGS | sed 's/-I\//-isystem \//g'`
+
+# switch into the directory of the executed Makefile and generate the recipes
+cd "$dir"
+
+mv ${src_prefix}Makefile ${src_prefix}Makefile.old
+sed '/FORCE:/q' ${src_prefix}Makefile.old > ${src_prefix}Makefile
+echo >> ${src_prefix}Makefile
+for file in `ls ${src_prefix}*.c` ; do
+  "$CC" -MT "$target$(basename $file .c)$obj_ext" -MM $cflags "$file"
+  printf '\t$(CC) -o $@ $(CFLAGS) %s -c $<\n\n' "$extra_flags"
+done  >> ${src_prefix}Makefile
+rm ${src_prefix}Makefile.old
--- a/ucx/Makefile	Mon Jun 01 20:29:26 2026 +0200
+++ b/ucx/Makefile	Tue Jun 02 19:30:34 2026 +0200
@@ -64,6 +64,84 @@
 ../build/ucx:
 	mkdir -p ../build/ucx
 
-../build/ucx/%$(OBJ_EXT): %.c
-	$(CC) $(CFLAGS) $(SHLIB_CFLAGS) -o $@ -c $<
+FORCE:
+
+../build/ucx/allocator$(OBJ_EXT): allocator.c cx/allocator.h cx/common.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/array_list$(OBJ_EXT): array_list.c cx/array_list.h cx/list.h \
+ cx/common.h cx/collection.h cx/allocator.h cx/iterator.h cx/compare.h \
+ cx/compare.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/buffer$(OBJ_EXT): buffer.c cx/buffer.h cx/common.h \
+ cx/allocator.h cx/string.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/compare$(OBJ_EXT): compare.c cx/compare.h cx/common.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/hash_key$(OBJ_EXT): hash_key.c cx/hash_key.h cx/common.h \
+ cx/string.h cx/allocator.h cx/compare.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/hash_map$(OBJ_EXT): hash_map.c cx/hash_map.h cx/map.h \
+ cx/common.h cx/collection.h cx/allocator.h cx/iterator.h cx/compare.h \
+ cx/string.h cx/hash_key.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/iterator$(OBJ_EXT): iterator.c cx/iterator.h cx/common.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/json$(OBJ_EXT): json.c cx/json.h cx/common.h cx/allocator.h \
+ cx/string.h cx/buffer.h cx/array_list.h cx/list.h cx/collection.h \
+ cx/iterator.h cx/compare.h cx/map.h cx/hash_key.h cx/kv_list.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/kv_list$(OBJ_EXT): kv_list.c cx/kv_list.h cx/common.h \
+ cx/list.h cx/collection.h cx/allocator.h cx/iterator.h cx/compare.h \
+ cx/map.h cx/string.h cx/hash_key.h cx/hash_map.h cx/linked_list.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
 
+../build/ucx/linked_list$(OBJ_EXT): linked_list.c cx/linked_list.h \
+ cx/common.h cx/list.h cx/collection.h cx/allocator.h cx/iterator.h \
+ cx/compare.h cx/compare.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/list$(OBJ_EXT): list.c cx/list.h cx/common.h cx/collection.h \
+ cx/allocator.h cx/iterator.h cx/compare.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/map$(OBJ_EXT): map.c cx/map.h cx/common.h cx/collection.h \
+ cx/allocator.h cx/iterator.h cx/compare.h cx/string.h cx/hash_key.h \
+ cx/list.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/mempool$(OBJ_EXT): mempool.c cx/mempool.h cx/common.h \
+ cx/allocator.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/printf$(OBJ_EXT): printf.c cx/printf.h cx/common.h \
+ cx/string.h cx/allocator.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/properties$(OBJ_EXT): properties.c cx/properties.h \
+ cx/common.h cx/string.h cx/allocator.h cx/map.h cx/collection.h \
+ cx/iterator.h cx/compare.h cx/hash_key.h cx/buffer.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/streams$(OBJ_EXT): streams.c cx/streams.h cx/common.h \
+ cx/allocator.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/string$(OBJ_EXT): string.c cx/string.h cx/common.h \
+ cx/allocator.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/szmul$(OBJ_EXT): szmul.c cx/common.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
+../build/ucx/tree$(OBJ_EXT): tree.c cx/tree.h cx/common.h cx/collection.h \
+ cx/allocator.h cx/iterator.h cx/compare.h
+	$(CC) -o $@ $(CFLAGS) $(SHLIB_CFLAGS) -c $<
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ui/common/Makefile	Tue Jun 02 19:30:34 2026 +0200
@@ -0,0 +1,29 @@
+#
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+#
+# Copyright 2012 Olaf Wintermann. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+#   1. Redistributions of source code must retain the above copyright notice,
+#      this list of conditions and the following disclaimer.
+#
+#   2. Redistributions in binary form must reproduce the above copyright
+#      notice, this list of conditions and the following disclaimer in the
+#      documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+
+FORCE:
--- a/ui/gtk/Makefile	Mon Jun 01 20:29:26 2026 +0200
+++ b/ui/gtk/Makefile	Tue Jun 02 19:30:34 2026 +0200
@@ -26,11 +26,184 @@
 # POSSIBILITY OF SUCH DAMAGE.
 #
 
-$(GTK_OBJPRE)%.o: gtk/%.c
-	$(CC) -o $@ -c -I../ucx $(CFLAGS) $(SHLIB_CFLAGS) $(TK_CFLAGS) $<
-	
 $(UI_LIB): $(OBJ)
 	$(AR) $(ARFLAGS) $(UI_LIB) $(OBJ)	
 
 $(UI_SHLIB): $(OBJ)
 	$(CC) -o $(UI_SHLIB) $(LDFLAGS) $(SHLIB_LDFLAGS) $(TK_LDFLAGS) $(OBJ) -L../build/lib -lucx
+
+FORCE:
+
+$(GTK_OBJPRE)action.o: gtk/action.c gtk/action.h gtk/../ui/toolkit.h \
+ gtk/../common/action.h gtk/../common/../ui/toolkit.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)button.o: gtk/button.c gtk/button.h gtk/../ui/toolkit.h \
+ gtk/../ui/button.h gtk/../ui/toolkit.h gtk/toolkit.h \
+ gtk/../common/context.h gtk/../common/../ui/toolkit.h \
+ gtk/../common/action.h gtk/../common/object.h gtk/container.h \
+ gtk/../ui/container.h gtk/widget.h gtk/../ui/widget.h \
+ gtk/../common/action.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)container.o: gtk/container.c gtk/container.h \
+ gtk/../ui/toolkit.h gtk/../ui/container.h gtk/../ui/toolkit.h \
+ gtk/toolkit.h gtk/../common/context.h gtk/../common/../ui/toolkit.h \
+ gtk/../common/action.h gtk/../common/object.h gtk/headerbar.h \
+ gtk/../ui/toolbar.h gtk/../common/toolbar.h \
+ gtk/../common/../ui/toolbar.h gtk/../common/menu.h \
+ gtk/../common/../ui/menu.h gtk/../common/../ui/toolkit.h \
+ gtk/../common/container.h gtk/../common/../ui/container.h \
+ gtk/../ui/properties.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)display.o: gtk/display.c gtk/display.h gtk/../ui/toolkit.h \
+ gtk/toolkit.h gtk/../common/context.h gtk/../common/../ui/toolkit.h \
+ gtk/../common/action.h gtk/../common/object.h gtk/container.h \
+ gtk/../ui/container.h gtk/../ui/toolkit.h gtk/../ui/display.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)dnd.o: gtk/dnd.c gtk/dnd.h gtk/../ui/dnd.h \
+ gtk/../ui/toolkit.h gtk/toolkit.h gtk/../ui/toolkit.h \
+ gtk/../common/context.h gtk/../common/../ui/toolkit.h \
+ gtk/../common/action.h gtk/../common/object.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)draw_cairo.o: gtk/draw_cairo.c gtk/container.h \
+ gtk/../ui/toolkit.h gtk/../ui/container.h gtk/../ui/toolkit.h \
+ gtk/toolkit.h gtk/../common/context.h gtk/../common/../ui/toolkit.h \
+ gtk/../common/action.h gtk/../common/object.h gtk/draw_cairo.h \
+ gtk/graphics.h gtk/../ui/graphics.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)draw_gdk.o: gtk/draw_gdk.c gtk/container.h \
+ gtk/../ui/toolkit.h gtk/../ui/container.h gtk/../ui/toolkit.h \
+ gtk/toolkit.h gtk/../common/context.h gtk/../common/../ui/toolkit.h \
+ gtk/../common/action.h gtk/../common/object.h gtk/draw_gdk.h \
+ gtk/graphics.h gtk/../ui/graphics.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)entry.o: gtk/entry.c gtk/../common/context.h \
+ gtk/../common/../ui/toolkit.h gtk/../common/action.h \
+ gtk/../common/object.h gtk/container.h gtk/../ui/toolkit.h \
+ gtk/../ui/container.h gtk/../ui/toolkit.h gtk/toolkit.h gtk/entry.h \
+ gtk/../ui/entry.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)graphics.o: gtk/graphics.c gtk/graphics.h \
+ gtk/../ui/graphics.h gtk/../ui/toolkit.h gtk/toolkit.h \
+ gtk/../ui/toolkit.h gtk/../common/context.h \
+ gtk/../common/../ui/toolkit.h gtk/../common/action.h \
+ gtk/../common/object.h gtk/container.h gtk/../ui/container.h \
+ gtk/draw_cairo.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)headerbar.o: gtk/headerbar.c gtk/headerbar.h gtk/toolkit.h \
+ gtk/../ui/toolkit.h gtk/../common/context.h \
+ gtk/../common/../ui/toolkit.h gtk/../common/action.h \
+ gtk/../common/object.h gtk/../ui/toolbar.h gtk/../ui/toolkit.h \
+ gtk/../common/toolbar.h gtk/../common/../ui/toolbar.h \
+ gtk/../common/menu.h gtk/../common/../ui/menu.h \
+ gtk/../common/../ui/toolkit.h gtk/button.h gtk/../ui/button.h gtk/menu.h \
+ gtk/../ui/menu.h gtk/../common/menu.h gtk/../ui/properties.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)icon.o: gtk/icon.c gtk/toolkit.h gtk/../ui/toolkit.h \
+ gtk/../common/context.h gtk/../common/../ui/toolkit.h \
+ gtk/../common/action.h gtk/../common/object.h gtk/icon.h \
+ gtk/../ui/icons.h gtk/../ui/toolkit.h gtk/../common/properties.h \
+ gtk/../common/../ui/properties.h gtk/../common/../ui/toolkit.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)image.o: gtk/image.c gtk/image.h gtk/../ui/image.h \
+ gtk/../ui/toolkit.h gtk/toolkit.h gtk/../ui/toolkit.h \
+ gtk/../common/context.h gtk/../common/../ui/toolkit.h \
+ gtk/../common/action.h gtk/../common/object.h gtk/container.h \
+ gtk/../ui/container.h gtk/menu.h gtk/../ui/menu.h gtk/../common/menu.h \
+ gtk/../common/../ui/menu.h gtk/widget.h gtk/../ui/widget.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)list.o: gtk/list.c gtk/../common/context.h \
+ gtk/../common/../ui/toolkit.h gtk/../common/action.h \
+ gtk/../common/object.h gtk/../common/action.h gtk/container.h \
+ gtk/../ui/toolkit.h gtk/../ui/container.h gtk/../ui/toolkit.h \
+ gtk/toolkit.h gtk/list.h gtk/../ui/list.h gtk/button.h \
+ gtk/../ui/button.h gtk/icon.h gtk/../ui/icons.h gtk/menu.h \
+ gtk/../ui/menu.h gtk/../common/menu.h gtk/../common/../ui/menu.h \
+ gtk/dnd.h gtk/../ui/dnd.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)menu.o: gtk/menu.c gtk/menu.h gtk/../ui/menu.h \
+ gtk/../ui/toolkit.h gtk/../common/menu.h gtk/../common/../ui/menu.h \
+ gtk/toolkit.h gtk/../ui/toolkit.h gtk/../common/context.h \
+ gtk/../common/../ui/toolkit.h gtk/../common/action.h \
+ gtk/../common/object.h gtk/widget.h gtk/../ui/widget.h \
+ gtk/../common/types.h gtk/../common/action.h gtk/../ui/properties.h \
+ gtk/../ui/window.h gtk/container.h gtk/../ui/container.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)range.o: gtk/range.c gtk/range.h gtk/toolkit.h \
+ gtk/../ui/toolkit.h gtk/../common/context.h \
+ gtk/../common/../ui/toolkit.h gtk/../common/action.h \
+ gtk/../common/object.h gtk/../ui/range.h gtk/../ui/toolkit.h \
+ gtk/container.h gtk/../ui/container.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)text.o: gtk/text.c gtk/text.h gtk/../ui/text.h \
+ gtk/../ui/toolkit.h gtk/toolkit.h gtk/../ui/toolkit.h \
+ gtk/../common/context.h gtk/../common/../ui/toolkit.h \
+ gtk/../common/action.h gtk/../common/object.h gtk/container.h \
+ gtk/../ui/container.h gtk/widget.h gtk/../ui/widget.h \
+ gtk/../common/types.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)toolbar.o: gtk/toolbar.c gtk/toolbar.h gtk/../ui/toolbar.h \
+ gtk/../ui/toolkit.h gtk/../common/toolbar.h \
+ gtk/../common/../ui/toolbar.h gtk/../common/menu.h \
+ gtk/../common/../ui/menu.h gtk/../common/../ui/toolkit.h gtk/list.h \
+ gtk/../ui/list.h gtk/toolkit.h gtk/../ui/toolkit.h \
+ gtk/../common/context.h gtk/../common/../ui/toolkit.h \
+ gtk/../common/action.h gtk/../common/object.h gtk/menu.h \
+ gtk/../ui/menu.h gtk/../common/menu.h gtk/button.h gtk/../ui/button.h \
+ gtk/icon.h gtk/../ui/icons.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)toolkit.o: gtk/toolkit.c gtk/toolkit.h gtk/../ui/toolkit.h \
+ gtk/../common/context.h gtk/../common/../ui/toolkit.h \
+ gtk/../common/action.h gtk/../common/object.h gtk/toolbar.h \
+ gtk/../ui/toolbar.h gtk/../ui/toolkit.h gtk/../common/toolbar.h \
+ gtk/../common/../ui/toolbar.h gtk/../common/menu.h \
+ gtk/../common/../ui/menu.h gtk/../common/../ui/toolkit.h gtk/list.h \
+ gtk/../ui/list.h gtk/window.h gtk/icon.h gtk/../ui/icons.h \
+ gtk/../common/document.h gtk/../common/context.h \
+ gtk/../common/properties.h gtk/../common/../ui/properties.h \
+ gtk/../common/menu.h gtk/../common/threadpool.h gtk/../common/app.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)webview.o: gtk/webview.c gtk/toolkit.h gtk/../ui/toolkit.h \
+ gtk/../common/context.h gtk/../common/../ui/toolkit.h \
+ gtk/../common/action.h gtk/../common/object.h gtk/container.h \
+ gtk/../ui/container.h gtk/../ui/toolkit.h gtk/webview.h \
+ gtk/../ui/webview.h gtk/widget.h gtk/../ui/widget.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)widget.o: gtk/widget.c gtk/widget.h gtk/../ui/widget.h \
+ gtk/../ui/toolkit.h gtk/container.h gtk/../ui/toolkit.h \
+ gtk/../ui/container.h gtk/toolkit.h gtk/../common/context.h \
+ gtk/../common/../ui/toolkit.h gtk/../common/action.h \
+ gtk/../common/object.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(GTK_OBJPRE)window.o: gtk/window.c gtk/../ui/window.h \
+ gtk/../ui/toolkit.h gtk/../ui/properties.h gtk/../common/context.h \
+ gtk/../common/../ui/toolkit.h gtk/../common/action.h \
+ gtk/../common/menu.h gtk/../common/../ui/menu.h \
+ gtk/../common/../ui/toolkit.h gtk/../common/toolbar.h \
+ gtk/../common/../ui/toolbar.h gtk/../common/menu.h gtk/../common/utils.h \
+ gtk/../common/../ui/text.h gtk/menu.h gtk/../ui/menu.h gtk/toolkit.h \
+ gtk/../ui/toolkit.h gtk/../common/object.h gtk/toolbar.h \
+ gtk/../ui/toolbar.h gtk/list.h gtk/../ui/list.h gtk/container.h \
+ gtk/../ui/container.h gtk/headerbar.h gtk/button.h gtk/../ui/button.h \
+ gtk/window.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
--- a/ui/motif/Makefile	Mon Jun 01 20:29:26 2026 +0200
+++ b/ui/motif/Makefile	Tue Jun 02 19:30:34 2026 +0200
@@ -26,11 +26,139 @@
 # POSSIBILITY OF SUCH DAMAGE.
 #
 
-$(MOTIF_OBJPRE)%.o: motif/%.c
-	$(CC) -o $@ -c -I../ucx $(CFLAGS) $(SHLIB_CFLAGS) $(TK_CFLAGS) $<
-
 $(UI_LIB): $(OBJ)
 	$(AR) $(ARFLAGS) $(UI_LIB) $(OBJ)	
 
 $(UI_SHLIB): $(OBJ)
 	$(CC) -o $(UI_SHLIB) $(LDFLAGS) $(SHLIB_LDFLAGS) $(TK_LDFLAGS) $(OBJ) -L../build/lib -lucx
+
+FORCE:
+
+$(MOTIF_OBJPRE)button.o: motif/button.c motif/button.h \
+ motif/../ui/button.h motif/../ui/toolkit.h motif/toolkit.h \
+ motif/../ui/toolkit.h motif/../common/context.h \
+ motif/../common/../ui/toolkit.h motif/../common/action.h \
+ motif/../common/object.h motif/container.h motif/../ui/container.h \
+ motif/../common/action.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)container.o: motif/container.c motif/container.h \
+ motif/../ui/toolkit.h motif/../ui/container.h motif/../ui/toolkit.h \
+ motif/../common/context.h motif/../common/../ui/toolkit.h \
+ motif/../common/action.h motif/../common/object.h \
+ motif/../common/container.h motif/../common/../ui/container.h \
+ motif/Grid.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)dnd.o: motif/dnd.c motif/dnd.h motif/../ui/dnd.h \
+ motif/../ui/toolkit.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)entry.o: motif/entry.c motif/entry.h motif/../ui/entry.h \
+ motif/../ui/toolkit.h motif/container.h motif/../ui/toolkit.h \
+ motif/../ui/container.h motif/toolkit.h motif/../common/context.h \
+ motif/../common/../ui/toolkit.h motif/../common/action.h \
+ motif/../common/object.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)Fsb.o: motif/Fsb.c motif/Fsb.h motif/FsbP.h \
+ motif/pathbar.h motif/../ui/text.h motif/../ui/toolkit.h \
+ motif/../common/utils.h motif/../common/../ui/toolkit.h \
+ motif/../common/../ui/text.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)graphics.o: motif/graphics.c motif/graphics.h \
+ motif/../ui/graphics.h motif/../ui/toolkit.h motif/toolkit.h \
+ motif/../ui/toolkit.h motif/../common/context.h \
+ motif/../common/../ui/toolkit.h motif/../common/action.h \
+ motif/../common/object.h motif/container.h motif/../ui/container.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)Grid.o: motif/Grid.c motif/Grid.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)image.o: motif/image.c motif/image.h motif/../ui/image.h \
+ motif/../ui/toolkit.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)label.o: motif/label.c motif/label.h motif/../ui/display.h \
+ motif/../ui/toolkit.h motif/../common/context.h \
+ motif/../common/../ui/toolkit.h motif/../common/action.h \
+ motif/container.h motif/../ui/toolkit.h motif/../ui/container.h \
+ motif/../common/object.h motif/Grid.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)list.o: motif/list.c motif/container.h \
+ motif/../ui/toolkit.h motif/../ui/container.h motif/../ui/toolkit.h \
+ motif/list.h motif/toolkit.h motif/../common/context.h \
+ motif/../common/../ui/toolkit.h motif/../common/action.h \
+ motif/../common/object.h motif/../ui/list.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)menu.o: motif/menu.c motif/menu.h motif/../ui/menu.h \
+ motif/../ui/toolkit.h motif/../common/menu.h \
+ motif/../common/../ui/menu.h motif/../common/context.h \
+ motif/../common/../ui/toolkit.h motif/../common/action.h motif/button.h \
+ motif/../ui/button.h motif/toolkit.h motif/../ui/toolkit.h \
+ motif/../common/object.h motif/container.h motif/../ui/container.h \
+ motif/../common/types.h motif/../ui/window.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)pathbar.o: motif/pathbar.c motif/pathbar.h \
+ motif/../ui/text.h motif/../ui/toolkit.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)range.o: motif/range.c motif/range.h motif/toolkit.h \
+ motif/../ui/toolkit.h motif/../common/context.h \
+ motif/../common/../ui/toolkit.h motif/../common/action.h \
+ motif/../common/object.h motif/../ui/range.h motif/../ui/toolkit.h \
+ motif/container.h motif/../ui/container.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)text.o: motif/text.c motif/text.h motif/../ui/text.h \
+ motif/../ui/toolkit.h motif/toolkit.h motif/../ui/toolkit.h \
+ motif/../common/context.h motif/../common/../ui/toolkit.h \
+ motif/../common/action.h motif/../common/object.h motif/container.h \
+ motif/../ui/container.h motif/pathbar.h motif/../common/utils.h \
+ motif/../common/../ui/text.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)toolbar.o: motif/toolbar.c motif/toolbar.h \
+ motif/../ui/toolbar.h motif/../ui/toolkit.h motif/button.h \
+ motif/../ui/button.h motif/toolkit.h motif/../ui/toolkit.h \
+ motif/../common/context.h motif/../common/../ui/toolkit.h \
+ motif/../common/action.h motif/../common/object.h motif/list.h \
+ motif/../ui/list.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)toolkit.o: motif/toolkit.c motif/toolkit.h \
+ motif/../ui/toolkit.h motif/../common/context.h \
+ motif/../common/../ui/toolkit.h motif/../common/action.h \
+ motif/../common/object.h motif/toolbar.h motif/../ui/toolbar.h \
+ motif/../ui/toolkit.h motif/container.h motif/../ui/container.h \
+ motif/../common/menu.h motif/../common/../ui/menu.h \
+ motif/../common/../ui/toolkit.h motif/../common/toolbar.h \
+ motif/../common/../ui/toolbar.h motif/../common/menu.h \
+ motif/../common/document.h motif/../common/context.h \
+ motif/../common/properties.h motif/../common/../ui/properties.h \
+ motif/../common/app.h motif/../common/threadpool.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)widget.o: motif/widget.c motif/../ui/widget.h \
+ motif/../ui/toolkit.h motif/container.h motif/../ui/toolkit.h \
+ motif/../ui/container.h motif/../common/context.h \
+ motif/../common/../ui/toolkit.h motif/../common/action.h \
+ motif/../common/object.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(MOTIF_OBJPRE)window.o: motif/window.c motif/window.h \
+ motif/../ui/window.h motif/../ui/toolkit.h motif/../ui/widget.h \
+ motif/toolkit.h motif/../ui/toolkit.h motif/../common/context.h \
+ motif/../common/../ui/toolkit.h motif/../common/action.h \
+ motif/../common/object.h motif/menu.h motif/../ui/menu.h \
+ motif/../common/menu.h motif/../common/../ui/menu.h motif/toolbar.h \
+ motif/../ui/toolbar.h motif/container.h motif/../ui/container.h \
+ motif/pathbar.h motif/../ui/text.h motif/../common/utils.h \
+ motif/../common/../ui/text.h motif/Grid.h motif/Fsb.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
--- a/ui/server/Makefile	Mon Jun 01 20:29:26 2026 +0200
+++ b/ui/server/Makefile	Tue Jun 02 19:30:34 2026 +0200
@@ -26,11 +26,69 @@
 # POSSIBILITY OF SUCH DAMAGE.
 #
 
-$(SERVER_OBJPRE)%.o: server/%.c
-	$(CC) -o $@ -c -I../ucx $(CFLAGS) $(SHLIB_CFLAGS) $(TK_CFLAGS) $<
-
 $(UI_LIB): $(OBJ)
-	$(AR) $(ARFLAGS) $(UI_LIB) $(OBJ)	
+	$(AR) $(ARFLAGS) $(UI_LIB) $(OBJ)
 
 $(UI_SHLIB): $(OBJ)
 	$(CC) -o $(UI_SHLIB) $(LDFLAGS) $(SHLIB_LDFLAGS) $(TK_LDFLAGS) $(OBJ) -L../build/lib -lucx
+
+FORCE:
+
+$(SERVER_OBJPRE)args.o: server/args.c server/args.h server/toolkit.h \
+ server/../ui/toolkit.h server/../common/context.h \
+ server/../common/../ui/toolkit.h server/../common/action.h \
+ server/../common/object.h server/../common/utils.h \
+ server/../common/../ui/text.h server/../common/../ui/toolkit.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(SERVER_OBJPRE)button.o: server/button.c server/button.h \
+ server/toolkit.h server/../ui/toolkit.h server/../common/context.h \
+ server/../common/../ui/toolkit.h server/../common/action.h \
+ server/../common/object.h server/../ui/button.h server/../ui/toolkit.h \
+ server/args.h server/container.h server/../common/container.h \
+ server/../common/../ui/container.h server/../common/../ui/toolkit.h \
+ server/widget.h server/../ui/widget.h server/var.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(SERVER_OBJPRE)container.o: server/container.c server/container.h \
+ server/toolkit.h server/../ui/toolkit.h server/../common/context.h \
+ server/../common/../ui/toolkit.h server/../common/action.h \
+ server/../common/object.h server/../common/container.h \
+ server/../common/../ui/container.h server/../common/../ui/toolkit.h \
+ server/widget.h server/../ui/widget.h server/../ui/toolkit.h \
+ server/args.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(SERVER_OBJPRE)image.o: server/image.c server/image.h \
+ server/../ui/image.h server/../ui/toolkit.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(SERVER_OBJPRE)toolkit.o: server/toolkit.c server/toolkit.h \
+ server/../ui/toolkit.h server/../common/context.h \
+ server/../common/../ui/toolkit.h server/../common/action.h \
+ server/../common/object.h server/../common/message.h \
+ server/../common/threadpool.h server/../common/app.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(SERVER_OBJPRE)var.o: server/var.c server/toolkit.h \
+ server/../ui/toolkit.h server/../common/context.h \
+ server/../common/../ui/toolkit.h server/../common/action.h \
+ server/../common/object.h server/var.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(SERVER_OBJPRE)widget.o: server/widget.c server/widget.h \
+ server/../ui/widget.h server/../ui/toolkit.h server/toolkit.h \
+ server/../ui/toolkit.h server/../common/context.h \
+ server/../common/../ui/toolkit.h server/../common/action.h \
+ server/../common/object.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+
+$(SERVER_OBJPRE)window.o: server/window.c server/window.h \
+ server/../ui/window.h server/../ui/toolkit.h server/toolkit.h \
+ server/../ui/toolkit.h server/../common/context.h \
+ server/../common/../ui/toolkit.h server/../common/action.h \
+ server/../common/object.h server/container.h \
+ server/../common/container.h server/../common/../ui/container.h \
+ server/../common/../ui/toolkit.h server/widget.h server/../ui/widget.h
+	$(CC) -o $@ $(CFLAGS) -I../ucx $(SHLIB_CFLAGS) $(TK_CFLAGS) -c $<
+

mercurial