-# Usage: $(call program_template,<executable-name>,<bin|utils|test>)
-define program_template
-$(1)_OBJS += $$(patsubst %.c,%.o,$$(filter %.c,$$($(1)_SOURCES)))
-$(1)_OBJS := $$(addprefix $(USER_OBJS_DIR)/,$$(sort $$($(1)_OBJS:%/=%)))
-
-USER_OBJS += $$($(1)_OBJS)
-USER_SOURCES += $$($(1)_SOURCES)
-
-$(call prepare_rule_goal,\
- $(USER_BIN_DIR)/$(1)$(EXE_SUFFIX),\
- $$($(1)_OBJS) $$($(1)_LIBS),\
- "LINK ",\
- $(program_cmd))
-endef
-
-program_cmd = $(if $(filter %.cc,$$($(1)_SOURCES)),$(CXX),$(CC)) \
- $($(1)_OBJS) $($(1)_LIBS:%=-l%) $(LOADLIBES) $(LDFLAGS) -Wl,-rpath-link,$(USER_LIB_DIR) \
- -Wl,-Map,$(USER_OBJS_DIR)/$(1).exe.map -o $$@
-
-$(foreach prog,$(bin_PROGRAMS),$(eval $(call program_template,$(prog),bin)))
-#$(foreach prog,$(bin_PROGRAMS),$(info >>>$(call program_template,$(prog),bin)<<<))
-$(foreach src,$(filter %.c,$(USER_SOURCES)),\
- $(eval $(call prepare_rule,\
- $(USER_OBJS_DIR)/$(src:%.c=%.o),\
- $(SOURCES_DIR)/$(src),\
- "CC ",\
- $(c_o_cmd))))
-
-$(eval $(call prepare_rule_goal,\
- $(USER_OBJS_DIR)/test.X.o,\
- $(SOURCES_DIR)/test.c,\
- "CC ",\
- $(c_o_cmd)))
-
-# OUTPUT_DIR is not defined in Makefile.build so we has to pass it on
-# command-line. After this file will be merged with Makefile.rules, it
-# will not be necessary to pass it.
-default: check-dir prepare-pass
- -$(MAKE) -qp -f $(MAKERULES_DIR)/Makefile.rules build > make.db.build-pseudo-pass;
- +@echo "make[omk]: build"
- @$(MAKE) $(NO_PRINT_DIRECTORY) -f $(MAKERULES_DIR)/Makefile.rules build
+S_o_cmd = \
+ if $(S_o_COMPILE) -D__ASSEMBLY__ $(CC_DEPFLAGS) $($(1)_CFLAGS) -o $$@ -c $$< ; \
+ then mv -f "$$@.d.tmp" "$$@.d" ; \
+ else rm -f "$$@.d.tmp" ; exit 1; \
+ fi
+# TODO: Implement $($(1)_CFLAGS)
+
+# Default values for IDL_* variable are suitable for ORBit-like IDL compilers
+IDL_CLIENT_SOURCES ?= $(1:%.idl=%-stubs.c) $(1:%.idl=%-common.c)
+IDL_SERVER_SOURCES ?= $(1:%.idl=%-skels.c) $(1:%.idl=%-common.c)
+IDL_TARGETS ?= $(1:%.idl=%-stubs.c) $(1:%.idl=%-skels.c) $(1:%.idl=%-common.c) $(1:%.idl=%.h)
+IDL_FLAGS ?= --output-dir=$(USER_OBJS_DIR)
+
+idl_src_cmd = $(IDL_COMPILER) $(IDL_FLAGS) $($(1)_IDLFLAGS) $$<
+
+# TODO: Implement CMETRIC
+
+_linker = $(if $(call c++sources,$($(1)_SOURCES)),$(CXX),$(CC))
+_map_file = $(USER_OBJS_DIR)/$(1).exe.map
+_dep_file = $(USER_OBJS_DIR)/$(1).exe.d
+program_cmd = set -e; \
+ $(_linker) $($(1)_OBJS) $($(1)_LIBS:%=-l%) $(LOADLIBES) $(LDFLAGS) \
+ -Wl,-rpath-link,$(USER_LIB_DIR) -Wl,-Map,$(_map_file) -o $$@; \
+ echo "$$@: \\" >$(_dep_file); \
+ sed -n -e 's|^LOAD \(.*\)$$$$| \1 \&|p' $(_map_file)\
+ |tr '&' '\134' >>$(_dep_file); \
+ echo >>$(_dep_file)
+
+library_cmd = $(AR) rcs $$@ $$^
+
+solib_cmd = set -e; \
+ $(_linker) $($(1)_OBJS) $($(1)_LIBS:%=-l%) $(LOADLIBES) $(LDFLAGS) \
+ -Wl,-rpath-link,$(USER_LIB_DIR) -Wl,-Map,$(_map_file) -o $$@; \
+ echo "$$@: \\" >$(_dep_file); \
+ sed -n -e 's|^LOAD \(.*\)$$$$| \1 \&|p' $(_map_file)\
+ |tr '&' '\134' >>$(_dep_file); \
+ echo >>$(_dep_file)