# # %CopyrightBegin% # # Copyright Ericsson AB 2010-2011. All Rights Reserved. # # The contents of this file are subject to the Erlang Public License, # Version 1.1, (the "License"); you may not use this file except in # compliance with the License. You should have received a copy of the # Erlang Public License along with this software. If not, it can be # retrieved online at http://www.erlang.org/. # # Software distributed under the License is distributed on an "AS IS" # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See # the License for the specific language governing rights and limitations # under the License. # # %CopyrightEnd% ifeq ($(ERL_TOP),) include $(DIAMETER_TOP)/make/target.mk include $(DIAMETER_TOP)/make/$(TARGET)/rules.mk else include $(ERL_TOP)/make/target.mk include $(ERL_TOP)/make/$(TARGET)/otp.mk endif # ---------------------------------------------------- # Application version # ---------------------------------------------------- include ../vsn.mk VSN = $(DIAMETER_VSN) # ---------------------------------------------------- # Release directory specification # ---------------------------------------------------- RELSYSDIR = $(RELEASE_PATH)/lib/diameter-$(VSN) # Where to put/find things. EBIN = ../ebin INCDIR = ../include # Where make should look for dependencies. VPATH = .:base:compiler:transport:gen # ---------------------------------------------------- # Target Specs # ---------------------------------------------------- include modules.mk DICT_FILES = $(RT_DICTS:%=dict/%.dia) DICT_MODULES = $(RT_DICTS:%=gen/diameter_gen_%) DICT_ERL_FILES = $(DICT_MODULES:%=%.erl) DICT_HRL_FILES = $(DICT_MODULES:%=%.hrl) # Modules to build before compiling dictionaries. COMPILER_MODULES = $(filter compiler/%, $(CT_MODULES)) # All handwritten modules. MODULES = \ $(RT_MODULES) \ $(CT_MODULES) # Modules whose names are inserted into the app file. APP_MODULES = \ $(RT_MODULES) \ $(DICT_MODULES) # Modules for which to build beams. TARGET_MODULES = \ $(APP_MODULES) \ $(CT_MODULES) # What to build for the 'opt' target. TARGET_FILES = \ $(patsubst %,$(EBIN)/%.$(EMULATOR),$(notdir $(TARGET_MODULES))) \ $(APP_TARGET) \ $(APPUP_TARGET) # Subdirectories of src to release modules into. TARGET_DIRS = $(sort $(dir $(TARGET_MODULES))) APP_FILE = diameter.app APP_SRC = $(APP_FILE).src APP_TARGET = $(EBIN)/$(APP_FILE) APPUP_FILE = diameter.appup APPUP_SRC = $(APPUP_FILE).src APPUP_TARGET = $(EBIN)/$(APPUP_FILE) EXAMPLE_FILES = $(EXAMPLES:%=../examples/%) BIN_FILES = $(BINS:%=../bin/%) # ---------------------------------------------------- # FLAGS # ---------------------------------------------------- ifeq ($(TYPE),debug) ERL_COMPILE_FLAGS += -Ddebug endif ERL_COMPILE_FLAGS += \ +'{parse_transform,sys_pre_attributes}' \ +'{attribute,insert,app_vsn,$(APP_VSN)}' \ +warn_unused_vars \ -pa $(realpath $(EBIN)) \ -I $(INCDIR) \ -I gen # -pa is so that we can include_lib from our include directory. The # path has to be absolute to contain the application name. # ---------------------------------------------------- # Targets # ---------------------------------------------------- debug: @$(MAKE) TYPE=debug opt opt: $(TARGET_FILES) clean: rm -f $(TARGET_FILES) $(DICT_ERL_FILES) $(DICT_HRL_FILES) rm -f $(APP_TARGET) $(APPUP_TARGET) rm -f errs core *~ gen/diameter_gen_*.forms gen/diameter_gen_*.spec rm -f depend.mk docs: list = echo $(1):; echo $($(1)) | tr ' ' '\n' | sort | sed 's@^@ @' info: @echo ======================================== @$(call list,RT_DICTS) @echo @$(call list,RT_MODULES) @echo @$(call list,CT_MODULES) @echo @$(call list,TARGET_MODULES) @echo @$(call list,TARGET_DIRS) @echo @$(call list,EXTERNAL_HRL_FILES) @echo @$(call list,INTERNAL_HRL_FILES) @echo @$(call list,EXAMPLE_FILES) @echo @$(call list,BIN_FILES) @echo ======================================== # ---------------------------------------------------- # Special Build Targets # ---------------------------------------------------- # erl/hrl from dictionary file. gen/diameter_gen_%.erl gen/diameter_gen_%.hrl: dict/%.dia ../bin/diameterc -o gen -i $(EBIN) $< # Generate the app file. $(APP_TARGET): $(APP_SRC) ../vsn.mk modules.mk M=`echo $(notdir $(APP_MODULES)) | tr ' ' ,`; \ sed -e 's;%VSN%;$(VSN);' \ -e "s;%MODULES%;$$M;" \ $< > $@ $(APPUP_TARGET): $(APPUP_SRC) ../vsn.mk sed -e 's;%VSN%;$(VSN);' $< > $@ app: $(APP_TARGET) $(APPUP_TARGET) dict: $(DICT_ERL_FILES) # ---------------------------------------------------- # Release Target # ---------------------------------------------------- ifeq ($(ERL_TOP),) include $(DIAMETER_TOP)/make/release_targets.mk else include $(ERL_TOP)/make/otp_release_targets.mk endif release_spec: opt $(INSTALL_DIR) $(RELSYSDIR)/bin \ $(RELSYSDIR)/ebin \ $(RELSYSDIR)/src/dict \ $(TARGET_DIRS:%=$(RELSYSDIR)/src/%) \ $(RELSYSDIR)/include \ $(RELSYSDIR)/examples $(INSTALL_SCRIPT) $(BIN_FILES) $(RELSYSDIR)/bin $(INSTALL_DATA) $(TARGET_FILES) $(RELSYSDIR)/ebin $(INSTALL_DATA) $(DICT_FILES) $(RELSYSDIR)/src/dict $(INSTALL_DATA) $(EXTERNAL_HRL_FILES) $(DICT_HRL_FILES) \ $(RELSYSDIR)/include $(INSTALL_DATA) $(EXAMPLE_FILES) $(RELSYSDIR)/examples $(MAKE) $(TARGET_DIRS:%/=release_src_%) $(TARGET_DIRS:%/=release_src_%): release_src_%: $(INSTALL_DATA) $(filter $*/%,$(TARGET_MODULES:%=%.erl) \ $(INTERNAL_HRL_FILES)) \ $(RELSYSDIR)/src/$* release_docs_spec: # ---------------------------------------------------- # Dependencies # ---------------------------------------------------- gen/diameter_gen_base_accounting.erl gen/diameter_gen_relay.erl \ gen/diameter_gen_base_accounting.hrl gen/diameter_gen_relay.hrl: \ $(EBIN)/diameter_gen_base_rfc3588.$(EMULATOR) gen/diameter_gen_base_rfc3588.erl gen/diameter_gen_base_rfc3588.hrl: \ $(COMPILER_MODULES:compiler/%=$(EBIN)/%.$(EMULATOR)) $(DICT_MODULES:%=$(EBIN)/%.$(EMULATOR)): \ $(INCDIR)/diameter.hrl \ $(INCDIR)/diameter_gen.hrl depend: depend.mk # Generate dependencies makefile. depend.mk: depend.sed $(MODULES:%=%.erl) Makefile (for f in $(MODULES); do \ (echo $$f; cat $$f.erl) | sed -f $<; \ done) \ > $@ -include depend.mk .PRECIOUS: $(DICT_ERL_FILES) $(DICT_HRL_FILES) .PHONY: app clean depend dict info release_subdir .PHONY: debug opt release_docs_spec release_spec .PHONY: $(TARGET_DIRS:%/=%) $(TARGET_DIRS:%/=release_src_%) .SECONDEXPANSION: # Make the modules from a subdirectory. $(TARGET_DIRS:%/=%): \ $$(patsubst $$@/%,$(EBIN)/%.$(EMULATOR),$$(filter $$@/%,$(TARGET_MODULES)))