Instead of using eval and introducing complex makefile spells,
I'd have computed the app files in the foreach loop, here:
  https://github.com/yurenju/gaia/blob/stage4/Makefile#L521

Something like:
```
$(foreach appdir,$(GAIA_APPDIRS), \
  TARGET=$(STAGE_DIR)$(SEP)$(notdir $(appdir)) \
  DEPS=$(call rwildcard,$(appdir),*)) \
  # do the ":" workaround here #
  $(eval $(call app-makefile-template,$(TARGET),$(appdir),$(DEPS)) \
)
```

Also I'm wondering if we should use find instead of rwildcard.
Wouldn't `$(rwildcard,$(2),*)` be equivalent to `$(shell find $(2) -type f)` ?
We can then do powerful filter with find if we need to.