diff options
Diffstat (limited to 'trunk/Makefile.moddir_rules')
-rw-r--r-- | trunk/Makefile.moddir_rules | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/trunk/Makefile.moddir_rules b/trunk/Makefile.moddir_rules new file mode 100644 index 000000000..9258e8d63 --- /dev/null +++ b/trunk/Makefile.moddir_rules @@ -0,0 +1,166 @@ +# +# Asterisk -- A telephony toolkit for Linux. +# +# Makefile rules for subdirectories containing modules +# +# Copyright (C) 2006, Digium, Inc. +# +# Kevin P. Fleming <kpfleming@digium.com> +# +# This program is free software, distributed under the terms of +# the GNU General Public License +# + +# Makefile rules for building modules. + +# In most cases, we set target-specific variables for certain targets +# (remember that they apply recursively to prerequisites). +# Also note that we can only set one variable per rule, so we have to +# repeat the left hand side to set multiple variables. + +ifneq ($(findstring MALLOC_DEBUG,$(MENUSELECT_CFLAGS)),) + ifeq ($(findstring astmm.h,$(ASTCFLAGS)),) + ASTCFLAGS+=-include $(ASTTOPDIR)/include/asterisk/astmm.h + endif +endif + +ifeq ($(findstring LOADABLE_MODULES,$(MENUSELECT_CFLAGS)),) + ASTCFLAGS+=${GC_CFLAGS} +endif + +ifneq ($(findstring STATIC_BUILD,$(MENUSELECT_CFLAGS)),) + STATIC_BUILD=-static +endif + +include $(ASTTOPDIR)/Makefile.rules + +# If MODULE_PREFIX is defined, use it to run the standard functions to set +# C_MODS, CC_MODS, LOADABLE_MODS and EMBEDDED_MODS. +# Each word of MODULE_PREFIX is a prefix for filenames that we consider +# valid C or CC modules (eg. app, func ...). Note that the underscore +# is added here, and does not need to be in MODULE_PREFIX +# +# Use MODULE_EXCLUDE to specify additional modules to exclude. + +ifneq ($(MODULE_PREFIX),) + ALL_C_MODS:= + ALL_C_MODS+=$(foreach p,$(MODULE_PREFIX),$(patsubst %.c,%,$(wildcard $(p)_*.c))) + ALL_CC_MODS:= + ALL_CC_MODS+=$(foreach p,$(MODULE_PREFIX),$(patsubst %.cc,%,$(wildcard $(p)_*.cc))) + + C_MODS:=$(filter-out $(MENUSELECT_$(MENUSELECT_CATEGORY)),$(ALL_C_MODS)) + CC_MODS:=$(filter-out $(MENUSELECT_$(MENUSELECT_CATEGORY)),$(ALL_CC_MODS)) + + # and store in the list of embedded or loadable modules + ifneq ($(findstring $(MENUSELECT_CATEGORY),$(MENUSELECT_EMBED)),) + EMBEDDED_MODS:=$(C_MODS) $(CC_MODS) + else + LOADABLE_MODS:=$(C_MODS) $(CC_MODS) + endif +endif + +# Both C++ and C++ sources need their module name in AST_MODULE +# We also pass whatever _INCLUDE list is generated by menuselect +# (they are stored in file 'makeopts') + +$(addsuffix .oo,$(CC_MODS)) $(addsuffix .o,$(C_MODS)): \ + ASTCFLAGS+= -DAST_MODULE=\"$*\" $(MENUSELECT_OPTS_$*:%=-D%) $(foreach dep,$(MENUSELECT_DEPENDS_$*),$(value $(dep)_INCLUDE)) + +ifeq ($(findstring $(OSARCH), mingw32 cygwin ),) + # don't define -fPIC on mingw32 and cygwin, it is the default + $(LOADABLE_MODS:%=%.so): ASTCFLAGS+=-fPIC +endif + +# For loadable modules, pass _LIB and _LDFLAGS from menuselect. +$(LOADABLE_MODS:%=%.so): LIBS+=$(foreach dep,$(MENUSELECT_DEPENDS_$*),$(value $(dep)_LIB)) +$(LOADABLE_MODS:%=%.so): ASTLDFLAGS+=$(foreach dep,$(MENUSELECT_DEPENDS_$*),$(value $(dep)_LDFLAGS)) + +$(EMBEDDED_MODS:%=%.o): ASTCFLAGS+=-DEMBEDDED_MODULE=$* + +$(addsuffix .so,$(filter $(LOADABLE_MODS),$(C_MODS))): %.so: %.o +$(addsuffix .so,$(filter $(LOADABLE_MODS),$(CC_MODS))): %.so: %.oo + +modules.link: $(addsuffix .eo,$(filter $(EMBEDDED_MODS),$(C_MODS))) + +.PHONY: clean uninstall _all moduleinfo makeopts + +ifneq ($(LOADABLE_MODS),) +_all: $(LOADABLE_MODS:%=%.so) +ifneq ($(findstring $(OSARCH), mingw32 cygwin ),) + # linker options and extra libraries for cygwin + SOLINK=-Wl,--out-implib=lib$@.a -shared + LIBS+=-L$(ASTTOPDIR)/main -lasterisk -L$(ASTTOPDIR)/res $($@_LIBS) + # additional libraries in res/ +endif +endif + +ifneq ($(EMBEDDED_MODS),) +_all: modules.link +__embed_ldscript: + @echo "../$(SUBDIR)/modules.link" +__embed_ldflags: + @echo "$(foreach mod,$(filter $(EMBEDDED_MODS),$(C_MODS)),$(foreach dep,$(MENUSELECT_DEPENDS_$(mod)),$(dep)_LDFLAGS))" + @echo "$(foreach mod,$(filter $(EMBEDDED_MODS),$(CC_MODS)),$(foreach dep,$(MENUSELECT_DEPENDS_$(mod)),$(dep)_LDFLAGS))" +__embed_libs: + @echo "$(foreach mod,$(filter $(EMBEDDED_MODS),$(C_MODS)),$(foreach dep,$(MENUSELECT_DEPENDS_$(mod)),$(dep)_LIB))" + @echo "$(foreach mod,$(filter $(EMBEDDED_MODS),$(CC_MODS)),$(foreach dep,$(MENUSELECT_DEPENDS_$(mod)),$(dep)_LIB))" +else +__embed_ldscript: +__embed_ldflags: +__embed_libs: +endif + +modules.link: + @rm -f $@ + @for file in $(patsubst %,$(SUBDIR)/%,$(filter %.eo,$^)); do echo "INPUT (../$${file})" >> $@; done + @for file in $(patsubst %,$(SUBDIR)/%,$(filter-out %.eo,$^)); do echo "INPUT (../$${file})" >> $@; done + +clean:: + rm -f *.so *.o *.oo *.eo + rm -f .*.o.d .*.oo.d + rm -f *.s *.i + rm -f modules.link + +install:: all + @echo "Installing modules from `basename $(CURDIR)`..." + @for x in $(LOADABLE_MODS:%=%.so); do $(INSTALL) -m 755 $$x $(DESTDIR)$(MODULES_DIR) ; done + +uninstall:: + +dist-clean:: + rm -f .*.moduleinfo .moduleinfo + rm -f .*.makeopts .makeopts + +.%.moduleinfo: %.c + @echo "<member name=\"$*\" displayname=\"$(shell $(GREP) -e AST_MODULE_INFO $< | head -n 1 | cut -d '"' -f 2)\" remove_on_change=\"$(SUBDIR)/$*.o $(SUBDIR)/$*.so\">" > $@ + $(AWK) -f $(ASTTOPDIR)/build_tools/get_moduleinfo $< >> $@ + echo "</member>" >> $@ + +.%.moduleinfo: %.cc + @echo "<member name=\"$*\" displayname=\"$(shell $(GREP) -e AST_MODULE_INFO $< | head -n 1 | cut -d '"' -f 2)\" remove_on_change=\"$(SUBDIR)/$*.oo $(SUBDIR)/$*.so\">" > $@ + $(AWK) -f $(ASTTOPDIR)/build_tools/get_moduleinfo $< >> $@ + echo "</member>" >> $@ + +.moduleinfo:: $(addsuffix .moduleinfo,$(addprefix .,$(ALL_C_MODS) $(ALL_CC_MODS))) + @echo "<category name=\"MENUSELECT_$(MENUSELECT_CATEGORY)\" displayname=\"$(MENUSELECT_DESCRIPTION)\" remove_on_change=\"$(SUBDIR)/modules.link\">" > $@ + @cat $^ >> $@ + @echo "</category>" >> $@ + +moduleinfo: .moduleinfo + @cat $< + +.%.makeopts: %.c + @$(AWK) -f $(ASTTOPDIR)/build_tools/get_makeopts $< > $@ + +.%.makeopts: %.cc + @$(AWK) -f $(ASTTOPDIR)/build_tools/get_makeopts $< > $@ + +.makeopts:: $(addsuffix .makeopts,$(addprefix .,$(ALL_C_MODS) $(ALL_CC_MODS))) + @cat $^ > $@ + +makeopts: .makeopts + @cat $< + +ifneq ($(wildcard .*.d),) + include .*.d +endif |