TOP_DIR?=../..
ML_SETUP_DISABLE_USER_CONFIGS=y
ML_SETUP_EXTENSION=modules
include $(TOP_DIR)/Makefile.setup
# should we define a platform for modules? for now use 'all' platform
PLATFORM_INC=$(TOP_DIR)/platform/all
CFLAGS += -DMODULE -DMODULE_NAME=$(MODULE_NAME) -DCONFIG_MAGICLANTERN $(MODULE_CFLAGS) -I.
MODULE_SRC = $(MODULE_NAME).c
MODULE_OUTPUT = $(MODULE_NAME).mo
MODULE_SYM = $(MODULE_NAME).sym
MODULE_DEP = $(MODULE_NAME).dep
MODULE_DEPS = $(MODULE_NAME).d
MODULE_ZIP = $(MODULE_NAME).zip
MODULE_STRINGS = module_strings.h
HGDIFF_OBJS = hgdiff.tmp
all:: $(MODULE_OUTPUT) $(MODULE_SYM) $(MODULE_DEP)
nodep:: $(MODULE_OUTPUT) $(MODULE_SYM)
delete_if_failed:
@echo ""
@echo "Building module $(MODULE_NAME)..."
@$(MAKE) all --no-print-directory || { \
echo ""; \
echo "********************************************************"; \
echo "WARNING: module $(MODULE_NAME) failed to build, deleting"; \
echo "********************************************************"; \
echo ""; \
$(MAKE) clean; \
}
-include $(MODULE_DEPS)
clean::
$(call rm_files, $(MODULE_OBJS) $(MODULE_OUTPUT) $(MODULE_SYM) $(MODULE_DEP) $(MODULE_ZIP) $(MODULE_STRINGS) $(HGDIFF_OBJS) *.o *.d *.i *.s *.dep *.sym hgstamp)
module_strings.h: README.rst hgstamp
$(call build,README, $(PYTHON) ../readme2modulestrings.py > $@ || rm -f $@)
README.rst:
$(call build,README,printf "$(MODULE_NAME)\n========\n\nPlease write a one-page description for your module here.\n\nYou may also add some metadata:\n\n:Author: <your name here>\n:License: <your license here>\n:Website: <your website here>\n\n" > $@)
$(MODULE_OBJS): $(MODULE_STRINGS)
$(MODULE_OUTPUT): $(MODULE_OBJS) $(HGDIFF_OBJS)
$(call build,MODULE,$(LD) -r -o $@ $(MODULE_OBJS))
$(call build,STRIP,$(STRIP) --strip-debug --strip-unneeded --discard-all --discard-locals $@)
$(call build,OBJCOPY,$(OBJCOPY) --add-section .module_hgdiff=hgdiff.tmp $@)
$(call rm_files, $(HGDIFF_OBJS))
#~ $(call build,OBJCOPY,$(OBJCOPY) --add-section .module_hginfo=hginfo.tmp $@)
# tag any function with DUMP_ASM, then run "make dump_asm" from module directory
dump_asm: all
$(OBJDUMP) -d -M reg-names-raw --section=.dump_asm $(MODULE_OBJS)
hginfo.tmp: FORCE
$(call build,HGDIFF,(\
echo "Repo path:"; hg root; \
echo "\nSource:"; hg paths; \
echo "\nDir state:"; hg log --limit 1\
) | gzip > $@)
hgdiff.tmp: FORCE
$(call build,HGDIFF,(\
hg locate --include . \
&& hg diff --nodates . \
|| (\
hg add -I "*.[chS]" -I Makefile -I README.rst -X module_strings.h > /dev/null; \
hg diff --nodates .; \
hg forget "set:added()" > /dev/null \
) \
) | gzip > $@)
%.sym: %.mo
$(call build,EXPORTS,$(READELF) -sW $< | grep GLOBAL | grep -v UND | grep -v COM | grep -v "__module_.*$(MODULE_NAME)" | $(AWK) "{print \$$2 \" \" \$$8;}" | sort > $@ && cat $@)
%.dep: %.mo
$(call build,DEPENDS,$(READELF) -sW $< | $(GREP) GLOBAL | $(GREP) 00000000 | $(GREP) UND | $(AWK) "{print \$$8;}" | sort > $@ && cd $(MODULES_DIR) && $(PYTHON) checkdep.py $(MODULE_NAME))
modules_install_dir: install_prepare
$(call build,MKDIR,$(MKDIR) -p $(INSTALL_MODULES_DIR))
# redefine this in module makefile to install additional data along with your module
install_user_data:: | modules_install_dir
install:: modules_install_dir all install_user_data
$(call build,$(MODULE_OUTPUT),$(CP) $(PWD_DIR)/$(MODULE_OUTPUT) $(INSTALL_MODULES_DIR)/)
$(INSTALL_FINISH)
# fixme: duplicate code
prepare_zip: FORCE
$(eval INSTALL_DIR = $(PWD_DIR)/zip)
$(eval INSTALL_PREPARE = )
$(eval INSTALL_FINISH = )
$(eval WIFI_SD = )
$(eval export INSTALL_DIR)
$(eval export INSTALL_MODULES_DIR)
$(eval export INSTALL_PREPARE)
$(eval export INSTALL_FINISH)
$(eval export WIFI_SD)
$(call rm_dir, $(INSTALL_DIR)/)
mkdir -p $(INSTALL_DIR)
$(MODULE_ZIP): install
-$(call rm_files, $@)
cd $(INSTALL_DIR); zip -z ../$@ < \
../$(SRC_DIR)/zip.txt -r .
$(call rm_dir, $(INSTALL_DIR)/)
zip:: | prepare_zip
zip:: $(MODULE_ZIP)
# fixme: duplicate code
install_qemu:: | prepare_zip
install_qemu:: install
$(call build,MTOOLS,cd $(QEMU_PATH)/; ./mtools_copy_ml.sh $(INSTALL_DIR))
FORCE:
include $(TOP_DIR)/Makefile.filerules
# force recompiling whenever hg history changes (for autogenerated strings)
# http://mercurial.selenic.com/wiki/VersioningWithMake
HGVERSION = $(shell hg log . -r 'reverse(ancestors(.))' -l 1 --template 'hgid: {node|short}')
hgstamp: FORCE
@[ -f $@ ] || touch $@
@echo $(HGVERSION) | cmp -s $@ - || ( echo $(HGVERSION) > $@ ; echo "Updated HGVERSION" )
FORCE: ;
# Allow using qprintf and friends for debugging,
# to print at the QEMU console.
#
# If you want to use them, compile your module with:
#
# make clean; make CONFIG_QEMU=y
#
# There's no need to enable CONFIG_QEMU in ML core
# (the QEMU debugging API is header-only).
ifeq ($(CONFIG_QEMU),y)
CFLAGS += -DCONFIG_QEMU
endif # CONFIG_QEMU