From: Thomas Walker Lynch Date: Wed, 22 Oct 2025 13:51:10 +0000 (+0000) Subject: . X-Git-Url: https://git.reasoningtechnology.com/fossil/%7Bstyle.link%7D?a=commitdiff_plain;h=0230fa34271747478a75173e9bf9d70d8dbb16e0;p=RT-project-share . --- diff --git a/developer/make/environment_RT_1.mk b/developer/make/environment_RT_1.mk index af850d4..151eeff 100644 --- a/developer/make/environment_RT_1.mk +++ b/developer/make/environment_RT_1.mk @@ -1,3 +1,4 @@ +# enviroment_RT_1.mk # makefile environment variable defaults. # cc is the name of the C compiler, a file called .c is C source code. # RT uses header integrated C source files, i.e. the source and the header are the same file @@ -18,13 +19,13 @@ CFLAGS += -I $(C_SOURCE_DIR) KMOD_CCFLAGS := -I $(KMOD_SOURCE_DIR) -LIBNAME := $(PROJECT) -LIBNAME := $(subst -,_,$(LIBNAME)) +LIBRARY_NAME := $(PROJECT) +LIBRARY_NAME := $(subst -,_,$(LIBRARY_NAME)) -LIBDIR := scratchpad -LIBFILE := $(LIBDIR)/lib$(LIBNAME).a +LIBRARY_DIR := scratchpad +LIBRARY_FILE := $(LIBRARY_DIR)/lib$(LIBRARY_NAME).a -LINKFLAGS := -L$(LIBDIR) -L/lib64 -L/lib +LN_FLAGS := -L$(LIBRARY_DIR) -L/lib64 -L/lib -EXECDIR := scratchpad +MACHINE_DIR := scratchpad diff --git a/developer/make/target_kmod.mk b/developer/make/target_kmod.mk index 6fc30e3..7ca2fc8 100644 --- a/developer/make/target_kmod.mk +++ b/developer/make/target_kmod.mk @@ -62,9 +62,11 @@ endif $(OUTPUT_DIR): @mkdir -p "$(OUTPUT_DIR)" +# generate the Kbuild control Makefile # generate the Kbuild control Makefile $(OUTPUT_DIR)/Makefile: | $(OUTPUT_DIR) @{ \ + printf "ccflags-y += %s\n" "$(KMOD_CCFLAGS)"; \ printf "obj-m := %s\n" "$(foreach m,$(BASE_LIST),$(m).o)"; \ for m in $(BASE_LIST); do \ printf "%s-objs := %s.kmod.o" "$$m" "$$m"; \ diff --git a/developer/make/target_library_CLI.mk b/developer/make/target_library_CLI.mk new file mode 100644 index 0000000..0b52842 --- /dev/null +++ b/developer/make/target_library_CLI.mk @@ -0,0 +1,109 @@ +# make/target_lib_CLI.mk — build *.lib.c and *.CLI.c +# written for the Harmony skeleton, always invoked from cwd $REPO_HOME/ +# files have two suffixes by convention, e.g.: X.lib.c or Y.CLI.c + +.SUFFIXES: +.EXPORT_ALL_VARIABLES: +.DELETE_ON_ERROR: + +#-------------------------------------------------------------------------------- +# defaults for environment variables + +C ?= gcc +CFLAGS ?= +C_SOURCE_DIR ?= cc +LIBRARY_FILE ?= +MACHINE_DIR ?= scratchpad +LN_FLAGS ?= + +ifeq ($(strip $(C)),) + $(error target_lib_CLI.mk: no C compiler specified) +endif + +#-------------------------------------------------------------------------------- +# derived variables + +# source discovery (single dir) +C_SOURCE_LIB := $(wildcard $(C_SOURCE_DIR)/*.lib.c) +C_SOURCE_EXEC := $(wildcard $(C_SOURCE_DIR)/*.CLI.c) + +# remove suffix to get base name +C_BASE_LIB := $(sort $(patsubst %.lib.c,%, $(notdir $(C_SOURCE_LIB)))) +C_BASE_EXEC := $(sort $(patsubst %.CLI.c,%, $(notdir $(C_SOURCE_EXEC)))) + +# two sets of object files, one for the lib, and one for the CLI programs +OBJECT_LIB := $(patsubst %, scratchpad/%.lib.o, $(C_BASE_LIB)) +OBJECT_EXEC := $(patsubst %, scratchpad/%.CLI.o, $(C_BASE_EXEC)) + +# executables are made from EXEC sources +EXEC := $(patsubst %, $(MACHINE_DIR)/%, $(C_BASE_EXEC)) + +#-------------------------------------------------------------------------------- +# pull in dependencies + +-include $(OBJECT_LIB:.o=.d) $(OBJECT_EXEC:.o=.d) + + +#-------------------------------------------------------------------------------- +# targets + +# when no target is given make uses the first target, this one +.PHONY: usage +usage: + @echo example usage: make clean + @echo example usage: make library + @echo example usage: make CLI + @echo example usage: make library CLI + +.PHONY: version +version: + @echo makefile version 7.1 + if [ ! -z "$(C)" ]; then $(C) -v; fi + /bin/make -v + +.PHONY: information +information: + @printf "· → Unicode middle dot — visible: [%b]\n" "·" + @echo "C_SOURCE_DIR: " $(C_SOURCE_DIR) + @echo "C_SOURCE_LIB: " $(C_SOURCE_LIB) + @echo "C_SOURCE_EXEC: " $(C_SOURCE_EXEC) + @echo "C_BASE_LIB: " $(C_BASE_LIB) + @echo "C_BASE_EXEC: " $(C_BASE_EXEC) + @echo "OBJECT_LIB: " $(OBJECT_LIB) + @echo "OBJECT_EXEC: " $(OBJECT_EXEC) + @echo "EXEC: " $(EXEC) + +.PHONY: library +library: $(LIBRARY_FILE) + +$(LIBRARY_FILE): $(OBJECT_LIB) + @if [ -s "$@" ] || [ -n "$(OBJECT_LIB)" ]; then \ + echo "ar rcs $@ $^"; \ + ar rcs $@ $^; \ + else \ + rm -f "$@"; \ + fi + +#.PHONY: CLI +#CLI: $(LIBRARY_FILE) $(EXEC) + +.PHONY: CLI +CLI: library $(EXEC) + + +# generally better to use the project local clean scripts, but this will make it so that the make targets can be run again + +.PHONY: clean +clean: + rm -f $(LIBRARY_FILE) + for obj in $(OBJECT_LIB) $(OBJECT_EXEC); do rm -f $$obj $${obj%.o}.d || true; done + for i in $(EXEC); do [ -e $$i ] && rm $$i || true; done + + +# recipes +scratchpad/%.o: $(C_SOURCE_DIR)/%.c + $(C) $(CFLAGS) -o $@ -c $< + +$(MACHINE_DIR)/%: scratchpad/%.CLI.o + $(C) -o $@ $< $(LN_FLAGS) + diff --git a/developer/make/target_library_cli.mk b/developer/make/target_library_cli.mk deleted file mode 100644 index 5ef8770..0000000 --- a/developer/make/target_library_cli.mk +++ /dev/null @@ -1,109 +0,0 @@ -# make/target_lib_cli.mk — build *.lib.c and *.cli.c -# written for the Harmony skeleton, always invoked from cwd $REPO_HOME/ - -.SUFFIXES: -.EXPORT_ALL_VARIABLES: -.DELETE_ON_ERROR: - -#-------------------------------------------------------------------------------- -# files have two suffixes by convention, e.g.: X.lib.c or Y.cli.c -# - -ifeq ($(strip $(C)),) - $(error target_lib_cli.mk: no C compiler specified) -endif - -# single source directory -C_SOURCE_DIR ?= cc -C_SOURCE_DIR_OK := $(wildcard $(C_SOURCE_DIR)) - -ifeq ($(strip $(C_SOURCE_DIR_OK)),) - $(warning target_lib_cli.mk: C_SOURCE_DIR '$(C_SOURCE_DIR)' not found or empty) -endif - -# RT uses header integrated C source files -CFLAGS ?= -I $(C_SOURCE_DIR) - -# source discovery (single dir) -C_SOURCE_LIB := $(wildcard $(C_SOURCE_DIR)/*.lib.c) -C_SOURCE_EXEC := $(wildcard $(C_SOURCE_DIR)/*.cli.c) - -# remove suffix to get base name -C_BASE_LIB := $(sort $(patsubst %.lib.c,%, $(notdir $(C_SOURCE_LIB)))) -C_BASE_EXEC := $(sort $(patsubst %.cli.c,%, $(notdir $(C_SOURCE_EXEC)))) - - -# two sets of object files, one for the lib, and one for the CLI programs -OBJECT_LIB := $(patsubst %, scratchpad/%.lib.o, $(C_BASE_LIB)) -OBJECT_EXEC := $(patsubst %, scratchpad/%.cli.o, $(C_BASE_EXEC)) - --include $(OBJECT_LIB:.o=.d) $(OBJECT_EXEC:.o=.d) - -# executables are made from EXEC sources -EXEC := $(patsubst %, $(EXECDIR)/%, $(C_BASE_EXEC)) - - -#-------------------------------------------------------------------------------- -# targets - -# when no target is given make uses the first target, this one -.PHONY: usage -usage: - @echo example usage: make clean - @echo example usage: make library - @echo example usage: make cli - @echo example usage: make library cli - -.PHONY: version -version: - @echo makefile version 7.1 - if [ ! -z "$(C)" ]; then $(C) -v; fi - /bin/make -v - -.PHONY: information -information: - @printf "· → Unicode middle dot — visible: [%b]\n" "·" - @echo "C_SOURCE_DIR: " $(C_SOURCE_DIR) - @echo "C_SOURCE_LIB: " $(C_SOURCE_LIB) - @echo "C_SOURCE_EXEC: " $(C_SOURCE_EXEC) - @echo "C_BASE_LIB: " $(C_BASE_LIB) - @echo "C_BASE_EXEC: " $(C_BASE_EXEC) - @echo "OBJECT_LIB: " $(OBJECT_LIB) - @echo "OBJECT_EXEC: " $(OBJECT_EXEC) - @echo "EXEC: " $(EXEC) - @echo "INCFLAG_List: " $(INCFLAG_List) - -.PHONY: library -library: $(LIBFILE) - -$(LIBFILE): $(OBJECT_LIB) - @if [ -s "$@" ] || [ -n "$(OBJECT_LIB)" ]; then \ - echo "ar rcs $@ $^"; \ - ar rcs $@ $^; \ - else \ - rm -f "$@"; \ - fi - -#.PHONY: cli -#cli: $(LIBFILE) $(EXEC) - -.PHONY: cli -cli: library $(EXEC) - - -# generally better to use the project local clean scripts, but this will make it so that the make targets can be run again - -.PHONY: clean -clean: - rm -f $(LIBFILE) - for obj in $(OBJECT_LIB) $(OBJECT_EXEC); do rm -f $$obj $${obj%.o}.d || true; done - for i in $(EXEC); do [ -e $$i ] && rm $$i || true; done - - -# recipes -scratchpad/%.o: $(C_SOURCE_DIR)/%.c - $(C) $(CFLAGS) -o $@ -c $< - -$(EXECDIR)/%: scratchpad/%.cli.o - $(C) -o $@ $< $(LIB_ARG) $(LINKFLAGS) - diff --git a/developer/make/temp.sh b/developer/make/temp.sh new file mode 100644 index 0000000..4e0e27b --- /dev/null +++ b/developer/make/temp.sh @@ -0,0 +1,10 @@ +sed -E ' +s/\bC_SOURCE_DIR_OK\b/c_source_dir_ok/g; +s/\bC_SOURCE_LIB\b/c_source_lib/g; +s/\bC_SOURCE_EXEC\b/c_source_exec/g; +s/\bC_BASE_LIB\b/c_base_lib/g; +s/\bC_BASE_EXEC\b/c_base_exec/g; +s/\bOBJECT_LIB\b/object_lib/g; +s/\bOBJECT_EXEC\b/object_exec/g; +s/\bEXEC\b/exec_/g +' target_library_CLI.mk > target_library_CLI.new.mk