For anyone that wanted the functions also, here's what I settle with along with what outputs what:
Code:
equal=$(if $(filter "$1","$2"),1)
noteq=$(if $(filter "$1","$2"),,1)
_TRY:=src/try/sub/file
TRY:=$(_TRY)$(ext)_debug.c
variant=$(patsubst .$(_ext)_%,%,$(suffix $(basename $1)))
#$(dir ...) returns ./ if nothing is extracted so we have to force the empty
#result ourselves with an alternate function
dotdir=$(patsubst %/,%,$(dir $1))
folder=$(patsubst .,,$(call dotdir,$1))
paths=$(if $(call folder,$1),$(call paths,$(call folder,$1))) $1
__dirs=$(filter-out $1,$2) $(if $(suffix $1),,$1)
_dirs=$(call __dirs,$(lastword $1),$1)
dirs=$(call _dirs,$(call paths,$1))
Code:
make info
...
equal a,b=
noteq a,b=1
dir bin=./
folder bin=
folder bin/obj=bin
dirs src/try/sub/file=src src/try src/try/sub src/try/sub/file
dirs src/try/sub/file._x86_64_linux_cc_debug.c=src src/try src/try/sub
uptwice src/try/sub/file._x86_64_linux_cc_debug.c=src/try
variant src/try/sub/file._x86_64_linux_cc_debug.c=debug
lastdir src/try/sub/file._x86_64_linux_cc_debug.c=sub
initdir src/try/sub/file._x86_64_linux_cc_debug.c=src
project src/try/sub/file._x86_64_linux_cc_debug.c=try
Edit: Here's some other useful functions I'm experimenting with along with example usage:
Code:
mkdir=$(if $(wildcard $1),echo,mkdir $1)
mkdirs=$(foreach i,$(call dirs,$1),$(call mkdir,$i))
command=$(foreach i,$3,$(if $(filter @%,$i),$($1@$2$i),$i))
create=$(call command,$(call project,$1),$(call variant,$1),$2)
precompile=$(call create,$1,$(CC) @options -E $1 -c $2)
$(OBJ_DIR)/%_debug.c: $(SRC_DIR)%.c
$(call mkdirs,$@)
$(call precompile,$@,$<)
$(OBJ_DIR)/%_quick.c: $(SRC_DIR)%.c
$(call mkdirs,$@)
$(call precompile,$@,$<)
$(OBJ_DIR)/%_timed.c: $(SRC_DIR)%.c
$(call mkdirs,$@)
$(call precompile,$@,$<)
$(OBJ_DIR)/%_trace.c: $(SRC_DIR)%.c
$(call mkdirs,$@)
$(call precompile,$@,$<)