Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # ***********************************************************************************
- #
- # makefile_profile.mak Version 1.0 Date: SEPT-29-2008
- #
- # Revisions:
- # - (v0.80) First "standard" GNU makefile for DaVinci Workshop
- # used in workshop versions 1.30 (beta's 1 & 2)
- # - (v1.00) Used for DaVinci Workshop (production version 1.30)
- #
- # Use:
- # - Called by parent makefile named "makefile"
- # - Can be called directly using gMake's -f option; refer to the syntax used
- # by the "parent" makefile to invoke this make file
- # - Currently builds for ARM9 target, however other targets can be supported.
- # - User can specify PROFILE (either debug
- # or release or all) when invoking the parent makefile
- # - All dependencies (e.g. header files) are handled by the dependency rule
- # - Uses Configuro to consume packages delivered by TI
- # - All tools paths are specified in setpaths.mak located two levels above /app
- #
- # ***********************************************************************************
- # *****************************************************************************
- #
- # (Early) Include files
- #
- # *****************************************************************************
- # ---------------------------------------------------------------------
- # setpaths.mak includes all absolute paths for DaVinci tools
- # and is located two levels above the /app directory.
- # ---------------------------------------------------------------------
- -include ../../setpaths.mak
- # *****************************************************************************
- #
- # User-defined vars
- #
- # *****************************************************************************
- # ---------------------------------------------------------------------
- # AT: - Used for debug, it hides commands for a prettier output
- # - When debugging, you may want to set this variable to nothing by
- # setting it to "" below, or on the command line
- # ---------------------------------------------------------------------
- AT := #@
- # ---------------------------------------------------------------------
- # Location and build option flags for gcc build tools
- # - MONTAVISTA_DEVKIT is defined in setpaths.mak
- # - CC_ROOT is passed to configuro for building with gcc
- # - CC is used to invoke gcc compiler
- # - CFLAGS, LINKER_FLAGS are generic gcc build options
- # - DEBUG/RELEASE FLAGS are profile specific options
- # ---------------------------------------------------------------------
- # For angstrom compiler
- #CC_ROOT := $(DEVKIT)/armv7a
- #CC := $(CC_ROOT)/bin/arm-angstrom-linux-gnueabi-gcc
- #CFLAGS := -Wall -fno-strict-aliasing -march=armv7-a -D_REENTRANT -I$(DEVKIT)/armv7a/lib/gcc/arm-angstrom-linux-gnueabi/4.3.1/include
- # For CodeSourcery compiler
- CC_ROOT := $(DEVKIT)
- CC := $(CC_ROOT)/bin/arm-none-linux-gnueabi-gcc
- CFLAGS := -Wall -fno-strict-aliasing -march=armv7-a -D_REENTRANT -I$(DEVKIT)/lib/gcc/arm-none-linux-gnueabi/4.3.3/include
- LINKER_FLAGS := -lpthread
- DEBUG_CFLAGS := -g -D_DEBUG_
- RELEASE_CFLAGS := -O2
- # ---------------------------------------------------------------------
- # C_SRCS used to build two arrays:
- # - C_OBJS is used as dependencies for executable build rule
- # - C_DEPS is '-included' below; .d files are build in rule #3 below
- #
- # Three functions are used to create these arrays
- # - Wildcard
- # - Substitution
- # - Add prefix
- # ---------------------------------------------------------------------
- C_SRCS := $(wildcard *.c)
- OBJS := $(subst .c,.o,$(C_SRCS))
- C_OBJS = $(addprefix $(PROFILE)/,$(OBJS))
- DEPS := $(subst .c,.d,$(C_SRCS))
- C_DEPS = $(addprefix $(PROFILE)/,$(DEPS))
- # ---------------------------------------------------------------------
- # Configuro related variables
- # ---------------------------
- # - XDCROOT is defined in setpaths.mak
- # - CONFIGURO is where the XDC configuration tool is located
- # - Configuro searches for packages (i.e. smart libraries) along the
- # path specified in XDCPATH; it is exported so that it's available
- # when Configuro runs
- # - Configuro requires that the TARGET and PLATFORM are specified
- # - Here are some additional target/platform choices
- # TARGET := ti.targets.C64
- # PLATFORM := ti.platforms.evmEM6446
- # TARGET := gnu.targets.Linux86
- # PLATFORM := host.platforms.PC
- # ---------------------------------------------------------------------
- #XDCROOT := $(XDC_INSTALL_DIR)
- #CONFIGURO := $(XDCROOT)/xs xdc.tools.configuro
- #export XDCPATH:=/home/user/rtsc_primer/examples;$(XDCROOT)
- #TARGET := gnu.targets.MVArm9
- #PLATFORM := ti.platforms.evmDM6446
- # ---------------------------------------------------------------------
- # Project related variables
- # -------------------------
- # PROGNAME defines the name of the program to be built
- # CONFIG: - defines the name of the configuration file
- # - the actual config file name would be $(CONFIG).cfg
- # - also defines the name of the folder Configuro outputs to
- # PROFILE: - defines which set of build flags to use (debug or release)
- # - output files are put into a $(PROFILE) subdirectory
- # - set to "debug" by default; override via the command line
- # ---------------------------------------------------------------------
- PROGNAME := app
- #CONFIG := app_cfg
- PROFILE := DEBUG
- # -------------------------------------------------
- # ----- always keep these intermediate files ------
- # -------------------------------------------------
- .PRECIOUS : $(C_OBJS)
- #.PRECIOUS : $(PROFILE)/$(CONFIG)/linker.cmd $(PROFILE)/$(CONFIG)/compiler.opt
- # -------------------------------------------------
- # --- delete the implicit rules for object files --
- # -------------------------------------------------
- %.o : %.c
- # *****************************************************************************
- #
- # Targets and Build Rules
- #
- # *****************************************************************************
- # ---------------------------------------------------------------------
- # Default Rule
- # ------------
- # - When called by the "parent" makefile, being the first rule in this
- # file, this rule always runs
- # - Depends upon ARM executable program
- # - Echo's linefeed when complete; this target was added to
- # prevent the parent makefile from generating an error if the
- # ARM executable is already built and nothing needs to be done
- # ---------------------------------------------------------------------
- Default_Rule : $(PROGNAME)_$(PROFILE).Beagle
- @echo
- # ---------------------------------------------------------------------
- # 1. Build Executable Rule (.x)
- # ------------------------------
- # - For reading convenience, we called this rule #1
- # - The actual ARM executable to be built
- # - Built using the object files compiled from all the C files in
- # the current directory
- # - linker.cmd is the other dependency, built by Configuro
- # ---------------------------------------------------------------------
- $(PROGNAME)_$(PROFILE).Beagle : $(C_OBJS)
- @echo; echo "1. ----- Need to generate executable file: $@ "
- $(AT) $(CC) $(CFLAGS) $(LINKER_FLAGS) $^ -o $@
- @echo " Successfully created executable : $@ "
- # ---------------------------------------------------------------------
- # 2. Object File Rule (.o)
- # ------------------------
- # - This was called rule #2
- # - Pattern matching rule builds .o file from it's associated .c file
- # - Since .o file is placed in $(PROFILE) directory, the rule includes
- # a command to make the directory, just in case it doesn't exist
- # - Unlike the TI DSP Compiler, gcc does not accept build options via
- # a file; therefore, the options created by Configuro (in .opt file)
- # must be included into the build command via the shell's 'cat' command
- # ---------------------------------------------------------------------
- $(PROFILE)/%.o : %.c
- @echo "2. ----- Need to generate: $@ (due to: $(wordlist 1,1,$?) ...)"
- $(AT) mkdir -p $(dir $@)
- $(AT) $(CC) $(CFLAGS) $($(PROFILE)_CFLAGS) -c $< -o $@
- @echo " Successfully created: $@ "
- # ---------------------------------------------------------------------
- # 3. Dependency Rule (.d)
- # -----------------------
- # - Called rule #3 since it runs between rules 2 and 4
- # - Created by the gcc compiler when using the -MM option
- # - Lists all files that the .c file depends upon; most often, these
- # are the header files #included into the .c file
- # - Once again, we make the subdirectory it will be written to, just
- # in case it doesn't already exist
- # - For ease of use, the output of the -MM option is piped into the
- # .d file, then formatted, and finally included (along with all
- # the .d files) into this make script
- # - We put the formatting commands into a make file macro, which is
- # found towards the end of this file
- # ---------------------------------------------------------------------
- $(PROFILE)/%.d : %.c
- @echo "3. ----- Need to generate dep info for: $< "
- @echo " Generating dependency file : $@ "
- $(AT) mkdir -p $(PROFILE)
- $(AT) $(CC) -MM $(CFLAGS) $($(PROFILE)_CFLAGS) $< > $@
- @echo " Formatting dependency file: $@ "
- $(AT) $(call format_d ,$@,$(PROFILE)/)
- @echo " Dependency file successfully created: $@ " ; echo
- # ---------------------------------------------------------------------
- # 4. Configuro Rule (.cfg)
- # ------------------------
- # - The TI configuro tool can read (i.e. consume) RTSC packages
- # - Many TI and 3rd Party libraries are packaged as Real Time Software
- # Components (RTSC) - which includes metadata along with the library
- # - To improve readability of this scripts feedback, the Configuro's
- # feedback is piped into a a results log file
- # - In the case where no .cfg file exists, this script makes an empty
- # one using the shell's 'touch' command; in the case where this
- # occurs, gMake will delete the file when the build is complete as
- # is the case for all intermediate build files (note, we used the
- # precious command earlier to keep certain intermediate files from
- # being removed - this allows us to review them after the build)
- # ---------------------------------------------------------------------
- #$(PROFILE)/%/linker.cmd $(PROFILE)/%/compiler.opt : %.cfg
- # @echo "4. ----- Starting Configuro for $^ (note, this may take a minute)"
- # ifdef DUMP
- # $(AT) $(CONFIGURO) -c $(CC_ROOT) -t $(TARGET) -p $(PLATFORM) -r $(PROFILE) -o $(PROFILE)/$(CONFIG) $<
- # else
- # $(AT) mkdir -p $(PROFILE)/$(CONFIG)
- # $(AT) $(CONFIGURO) -c $(CC_ROOT) -t $(TARGET) -p $(PLATFORM) -r $(PROFILE) -o $(PROFILE)/$(CONFIG) $< \
- # > $(PROFILE)/$(CONFIG)_results.log
- # endif
- # @echo " Configuro has completed; it's results are in $(CONFIG) " ; echo
- # ---------------------------------------------------------------------
- # The "no" .cfg rule
- # ------------------
- # - This additional rule creates an empty config file if one doesn't
- # already exist
- # - See the Configuro rule comments above for more details
- # ---------------------------------------------------------------------
- #%.cfg :
- # $(AT) touch $(CONFIG).cfg
- # *****************************************************************************
- #
- # "Phony" Rules
- #
- # *****************************************************************************
- # ---------------------------------------------------------------------
- # "all" Rule
- # -----------
- # - Provided in case the a user calls the commonly found "all" target
- # - Called a Phony rule since the target (i.e. "all") doesn't exist
- # and shouldn't be searched for by gMake
- # ---------------------------------------------------------------------
- .PHONY : all
- all : $(PROGNAME)_$(PROFILE).Beagle
- @echo ; echo "The target ($<) has been built."
- @echo
- # ---------------------------------------------------------------------
- # "clean" Rule
- # -------------
- # - Cleans all files associated with the $(PROFILE) specified above or
- # via the command line
- # - Cleans the associated files in the containing folder, as well as
- # the ARM executable files copied by the "install" rule
- # - EXEC_DIR is specified in the included 'setpaths.mak' file
- # - Called a Phony rule since the target (i.e. "clean") doesn't exist
- # and shouldn't be searched for by gMake
- # ---------------------------------------------------------------------
- .PHONY : clean
- clean :
- @echo ; echo "--------- Cleaning up files for $(PROFILE) -----"
- rm -rf $(PROFILE)
- rm -rf $(PROGNAME)_$(PROFILE).Beagle
- # rm -rf $(EXEC_DIR)/$(PROGNAME)_$(PROFILE).Beagle
- rm -rf $(C_DEPS)
- rm -rf $(C_OBJS)
- @echo
- # ---------------------------------------------------------------------
- # "install" Rule
- # ---------------
- # - The install target is a common name for the rule used to copy the
- # executable file from the build directory, to the location it is
- # to be executed from
- # - Once again, a phony rule since we don't have an actual target file
- # named 'install' -- so, we don't want gMake searching for one
- # - This rule depends upon the ARM executable file (what we need to
- # copy), therefore, it is the rule's dependency
- # - We make the execute directory just in case it doesn't already
- # exist (otherwise we might get an error)
- # - EXEC_DIR is specified in the included 'setpaths.mak' file; in our
- # target system (i.e. the DVEVM board), we will use /opt/workshop as
- # the directory we'll run our programs from
- # ---------------------------------------------------------------------
- .PHONY : install
- install : $(PROGNAME)_$(PROFILE).Beagle
- @echo
- @echo "0. ----- Installing $(PROGNAME)_$(PROFILE).Beagle to 'Execution Directory' -----"
- @echo " Execution Directory: $(EXEC_DIR)"
- # $(AT) mkdir -p $(EXEC_DIR)
- # $(AT) cp $^ $(EXEC_DIR)
- cp $^ ${HOME}/Desktop
- @echo " Install (i.e. copy) has completed" ; echo
- # *****************************************************************************
- #
- # Macros
- #
- # *****************************************************************************
- # format_d
- # --------
- # - This macro is called by the Dependency (.d) file rule (rule #3)
- # - The macro copies the dependency information into a temp file,
- # then reformats the data via SED commands
- # - Two variations of the rule are provided
- # (a) If DUMP was specified on the command line (and thus exists),
- # then a warning command is embed into the top of the .d file;
- # this warning just lets us know when/if this .d file is read
- # (b) If DUMP doesn't exist, then we build the .d file without
- # the extra make file debug information
- # ---------------------------------------------------------------------
- ifdef DUMP
- define format_d
- @# echo " Formatting dependency file: $@ "
- @# echo " This macro has two parameters: "
- @# echo " Dependency File (.d): $1 "
- @# echo " Profile: $2 "
- @mv -f $1 $1.tmp
- @echo '$$(warning --- Reading from included file: $1 ---)' > $1
- @sed -e 's|.*:|$2$*.o:|' < $1.tmp >> $1
- @rm -f $1.tmp
- endef
- else
- define format_d
- @# echo " Formatting dependency file: $@ "
- @# echo " This macro has two parameters: "
- @# echo " Dependency File (.d): $1 "
- @# echo " Profile: $2 "
- @mv -f $1 $1.tmp
- @sed -e 's|.*:|$2$*.o:|' < $1.tmp > $1
- @rm -f $1.tmp
- endef
- endif
- # *****************************************************************************
- #
- # (Late) Include files
- #
- # *****************************************************************************
- # Include dependency files
- # -------------------------
- # - Only include the dependency (.d) files if "clean" is not specified
- # as a target -- this avoids an unnecessary warning from gMake
- # - C_DEPS, which was created near the top of this script, includes a
- # .d file for every .c file in the project folder
- # - With C_DEPS being defined recursively via the "=" operator, this
- # command iterates over the entire array of .d files
- # ---------------------------------------------------------------------
- ifneq ($(filter clean,$(MAKECMDGOALS)),clean)
- -include $(C_DEPS)
- endif
- # *****************************************************************************
- #
- # Additional Debug Information
- #
- # *****************************************************************************
- # Prints out build & variable definitions
- # ----------------------------------------
- # - While not exhaustive, these commands print out a number of
- # variables created by gMake, or within this script
- # - Can be useful information when debugging script errors
- # - As described in the 2nd warning below, set DUMP=1 on the command
- # line to have this debug info printed out for you
- # - The $(warning ) gMake function is used for this rule; this allows
- # almost anything to be printed out - in our case, variables
- # ---------------------------------------------------------------------
- ifdef DUMP
- $(warning To view build commands, invoke make with argument 'AT= ')
- $(warning To view build variables, invoke make with 'DUMP=1')
- $(warning Source Files: $(C_SRCS))
- $(warning Object Files: $(C_OBJS))
- $(warning Depend Files: $(C_DEPS))
- $(warning Base program name : $(PROGNAME))
- $(warning Configuration file: $(CONFIG))
- $(warning Make Goals : $(MAKECMDGOALS))
- $(warning Xdcpath : $(XDCPATH))
- $(warning Target : $(TARGET))
- $(warning Platform: $(PLATFORM))
- endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement