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: \n:License: \n:Website: \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