$(Q)$(CC) --shared -Xlinker -soname=lib$(1).$(SOLIB_EXT) -o $$@ $$($(1)_objslo) $$(LOADLIBES) $$($(1)_libs:%=-l%)
endef
--include $(shell true; find $(USER_BUILD_DIR) -name 'lib*.omkvar') # `true' is a hack for MinGW
+# Syntax: $(call program_link_template,<executable-name>,<dest-dir>)
+define program_link_template
+$(2)/$(1)$(EXE_SUFFIX): dir=$(LINK_BUILD_DIR)/$$(notdir $(2))
+$(2)/$(1)$(EXE_SUFFIX): $$($(1)_objs)
+ @$(QUIET_CMD_ECHO) " LINK $$@"
+ $(Q) $$($(1)_linker) \
+ $$($(1)_objs) $$($(1)_libs:%=-l%) $$(LOADLIBES) $$(LDFLAGS) -Wl,-Map,$$(dir)/$(1).exe.map -o $$@
+ @echo "$$@: \\" >$$(dir)/$(1).exe.d
+ @sed -n -e 's|^LOAD \(.*\)$$$$| \1 \&|p' $$(dir)/$(1).exe.map|tr '&' '\134' >>$$(dir)/$(1).exe.d
+ @echo >>$$(dir)/$(1).exe.d
+endef
+
- -include $(shell find $(USER_BUILD_DIR) -name '*.omkvar')
++-include $(shell true; find $(USER_BUILD_DIR) -name '*.omkvar') # `true' is a hack for MinGW
#$(warning $(shared_libs))
$(foreach lib,$(shared_libs),$(eval $(call solib_link_template,$(lib))))
+$(foreach prg,$(bin_programs),$(eval $(call program_link_template,$(prg),$(USER_BIN_DIR))))
+$(foreach prg,$(utils_programs),$(eval $(call program_link_template,$(prg),$(USER_UTILS_DIR))))
+$(foreach prg,$(test_programs),$(eval $(call program_link_template,$(prg),$(USER_TESTS_DIR))))
-.PHONY: link-shared-libs
-link-shared-libs: $(shared_libs:%=$(USER_LIB_DIR)/lib%.$(SOLIB_EXT))
+.PHONY: link-pseudo-pass
+link-pseudo-pass: $(shared_libs:%=$(USER_LIB_DIR)/lib%.$(SOLIB_EXT)) \
+ $(bin_programs:%=$(USER_BIN_DIR)/%$(EXE_SUFFIX)) \
+ $(utils_programs:%=$(USER_UTILS_DIR)/%$(EXE_SUFFIX)) \
+ $(tests_programs:%=$(USER_TESTS_DIR)/%$(EXE_SUFFIX))
endif # link-shared-libs
#=====================================================================