The build process overall should do some simple things:
- Build the ROM images from source.
- Clean old ROM images and build remnants out of the repository.
- Run a static code analysis of the source that makes up the ROM images.
I am using Linux as my development platform, specifically Linux Mint 17.1 Rebecca. I created my project directory to isolate as much of the hardware specifics as possible from the main firmware application code.
My directory structure looks as so:
Build ROM images from source
The master makefile is contained in the firmware folder, and it utilizes platform specific makefiles contained in the makefiles directory. The master makefile has targets to build a specific platform's ROM image, or all ROM images.
###############################################################################
# Target Definitions
###############################################################################
#
# NOTE: Usage of @ prior to the command will quiet the output of the command.
#
###############################################################################
###############################################################################
# Build the firmware image that runs on the chipKIT Pro MX4 Board
###############################################################################
mx4:
@make -f makefiles/Make_Chipkit_Pro_Mx4.mk
Building the mx4 target results in output as follows.
cmartin@mega ~/source/AlphaBot/source/firmware $ make mx4
make[1]: Entering directory `/home/cmartin/source/AlphaBot/source/firmware'
[CC ] main
[CC ] board
[LNK] AlphaBot
[HEX] AlphaBot
text rodata data bss dec hex filename
0 0 1644 0 1644 66c build/debug/chipkit_pro_mx4/AlphaBot.hex
make[1]: Leaving directory `/home/cmartin/source/AlphaBot/source/firmware'
The specifics of building code, generating ROM hex images and cleaning up the build directories are contained in each platform makefile. This provides flexibility that will be needed in the future when the STM32 and Zynq boards are used as targets also.
The platform specific makefiles are very similar to each other since they use the same compiler and processor. There are several issues that you can run into trying to use the xc32 compiler from the command line only. The following makefile excerpts are used to build the object files for modules.
###############################################################################
# Board Specific Definitions:
###############################################################################
BOARD=PRO_MX4
IMAGE_NAME=AlphaBot
PROCESSOR=32MX460F512L
###############################################################################
# Tools:
###############################################################################
TOOL_PATH=/opt/microchip/xc32/v1.34/bin
CC=$(TOOL_PATH)/xc32-gcc
SIZE=$(TOOL_PATH)/xc32-size
HEX=$(TOOL_PATH)/xc32-bin2hex
###############################################################################
# Compiler:
###############################################################################
PROCESSOR_FLAG=-mprocessor=$(PROCESSOR)
CC_OBJECT_CFLAGS=-g -c $(PROCESSOR_FLAG) -D$(BOARD) -MMD -MF
CC_IMAGE_CFLAGS= $(PROCESSOR_FLAG) -Wl, --defsym=__MPLAB_BUILD=1
###############################################################################
# Build all objects in the project.
###############################################################################
all: main board
@echo [LNK] $(IMAGE_NAME)
@$(CC) $(CC_IMAGE_CFLAGS) $(BUILD_PATH)/main.o $(BUILD_PATH)/board.o -o $(BUILD_PATH)/$(IMAGE_NAME).elf
main: $(SOURCE_MAIN)/main.c
@echo [CC ] $@
@$(CC) $(CC_OBJECT_CFLAGS) $(SOURCE_MAIN)/main.d $(SOURCE_MAIN)/main.c -o $(BUILD_PATH)/main.o
board: $(SOURCE_PATH)/board.c $(HEADER_PATH)/board.h
@echo [CC ] $@
@$(CC) $(CC_OBJECT_CFLAGS) $(SOURCE_PATH)/board.d $(SOURCE_PATH)/board.c -o $(BUILD_PATH)/board.o
Cleaning the Build remnants
The master makefile also contains targets to clean out the build remnants. Here is the excerpt that accomplishes that goal.
###############################################################################
# Clean all firmware image trees
###############################################################################
.PHONY: clean
clean:
@make -f makefiles/Make_Chipkit_Pro_Mx4.mk clean
@make -f makefiles/Make_Clicker2_Pic32mx.mk clean
@make -f makefiles/Make_Mikromedia_Pic32.mk clean
###############################################################################
As before, each platform specific makefile is responsible for cleaning it's build remnants up after a build. The platform files are all very similar as I said before, so I will include an excerpt from the mx4 file.
###############################################################################
# Clean the firmware image tree
###############################################################################
.PHONY: clean
clean:
@rm -rf $(BUILD_PATH)/*.o
@rm -rf $(BUILD_PATH)/*.hex
@rm -rf $(BUILD_PATH)/*.elf
@rm -rf $(SOURCE_MAIN)/*.d
@rm -rf $(SOURCE_MAIN)/*.o
@rm -rf $(SOURCE_PATH)/*.d
###############################################################################
Static code Analysis
I chose to use two utilities to do static code analysis on the firmware code base.
The first utility is called splint, it is a free version similar to the lint that was included in Unix installations. I was able to use apt-get to install this and use the documentation to configure this to work for my project.
The second utility I chose is cppcheck, which I had some difficulties getting to work. I tried to specify some include directories during the check of the code and cppcheck couldn't find the xc32 includes. The problem that I ran into had been fixed in newer version of the utility, however Linux Mint installed 1.61 by default. I was able to fix my issues by retrieving the latest code for cppcheck ( version 1.68 ) and building it from the source. After that I had no issues running the utility.
The makefile excerpts for this are shown below.
###############################################################################
# Static Code Analysis of all source trees
###############################################################################
.PHONY: check
check:
@echo
@echo [SPLINT ]
@splint -strict -noparams -exporttype -typeuse -nolib \
-I/opt/microchip/xc32/v1.34/pic32mx/include/ -Iinclude/ source/*.c
@echo
@echo [CPPCHECK]
@../tools/cppcheck-1.68/cppcheck --template '{file}:{line}, {severity}, {id}, {message}' \
--force --enable=all -q -I/opt/microchip/xc32/v1.34/pic32mx/include/ -Iinclude/ .
I am sure there will be adjustments as I find issues and continue to build upon this code base. I hope this was helpful in some way or another.