DE1-SoC: A better Makefile

I created a new Makefile from scratch for compiling the Linux programs for the Cyclone V SoC. The Makefile is able to handle both C and C++ files.

The Makefile will create a dedicated build directory where all object and binary files are stored in order to keep the project directory clean. Furthermore, there is a target called upload which will upload the compiled binary to the DE1-SoC board using SCP. The corresponding settings (IP, user, …) can be set at the top section of the Makefile.

################################################################################
# Makefile for the DE1-SoC.                                                    #
# Tested with Quartus 15 / EDS SoC 15 on Windows 10 64-Bit                     #
#                                                                              #
# Copyright (C) 2015 by Joel Bodenmann <joel@embedded.pro>                     #
#                                                                              #
# Feel free to use this makefile without any warranty on your own risk.        #
################################################################################
 
# This is the name of the binaries that will be generated
TARGET                  = de1_soc_hps_binary
 
# The device family (soc_cv_av = Cyclone V   ;   soc_a10 = Aria 10)
ALT_DEVICE_FAMILY       = soc_cv_av
 
# Some paths (Default should work)
HWLIBS_ROOT             = ${SOCEDS_DEST_ROOT}/ip/altera/hps/altera_hps/hwlib
 
# Here we add all *.c files that we want to compile
CSRCS                   =
 
# Here we add all *.cpp files that we want to compile
CPPSRCS                 =
 
# Here we add the paths to all include directories
INCS                    =
 
# Parameters for SCP upload. Set up SSH keys to bypass password prompt
SCP_TARGET_IP           = 192.168.1.100
SCP_USER                = root
SCP_TARGET_PATH         = /home/root
SCP                     = SCP
SCP_FLAGS               =
 
# Compiler settings
ARCH                    = arm-linux-gnueabihf
LD                      = $(ARCH)-g++
CC                      = $(ARCH)-gcc
CPPC                    = $(ARCH)-g++
SIZE                    = $(ARCH)-size
CFLAGS                  = -g -std=gnu99 -Wall
CPPFLAGS                = -g -std=c++11 -Wall
LDFLAGS                 = -g -Wall
 
################################################################################
# Don't change anything below this line                                        #
################################################################################
 
# Some directory and file magic
BUILDDIR                = build
OBJDIR                  = $(BUILDDIR)/obj
 
# Generate the object names
OBJS                    = $(addprefix $(OBJDIR)/,$(addsuffix .o,$(basename $(CSRCS:%.c=%.o))))
OBJS                    += $(addprefix $(OBJDIR)/,$(addsuffix .o,$(basename $(CPPSRCS:%.cpp=%.o))))
 
# Add some paths
CFLAGS                  += $(INCS:%=-I%) -I$(HWLIBS_ROOT)/include -I$(HWLIBS_ROOT)/include/$(ALT_DEVICE_FAMILY) -D$(ALT_DEVICE_FAMILY)
CPPFLAGS                += $(INCS:%=-I%) -I$(HWLIBS_ROOT)/include -I$(HWLIBS_ROOT)/include/$(ALT_DEVICE_FAMILY) -D$(ALT_DEVICE_FAMILY)
LDFLAGS                 += $(INCS:%=-I%)
 
# This is the default target if the user does just calls 'make'
all: build size
 
# Build all the files
build: builddirs $(BUILDDIR)/$(TARGET)
 
# Create the required directories (if not already existing)
builddirs:
    @mkdir -p $(BUILDDIR)
    @mkdir -p $(OBJDIR)
 
# Link everything together
$(BUILDDIR)/$(TARGET): $(OBJS)
    @echo Linking $@
    @$(LD) $(LDFLAGS) -o $(BUILDDIR)/$(TARGET) $(OBJS)
 
# Compile c files
$(OBJDIR)/%.o: %.c
    @mkdir -p $(dir $@)
    @echo Compiling $^
    @$(CC) $(CFLAGS) -c -o $@ $^
 
# Compile cpp files
$(OBJDIR)/%.o: %.cpp
    @mkdir -p $(dir $@)
    @echo Compiling $^
    @$(CPPC) $(CPPFLAGS) -c -o $@ $^
 
# Print size information
size: $(BUILDDIR)/$(TARGET)
    @echo
    @echo
    $(SIZE) $^
 
# Clean up
clean:
    @rm -rf $(BUILDDIR) $(OBJS) $(TARGET) $(TARGET).* *.a *.o *~
    @echo Done
 
# Clean must be a phony target so make knows this never exists as a file
.PHONY: clean
 
# Upload to target
upload:
    $(SCP) $(SCP_FLAGS) $(BUILDDIR)/$(TARGET) $(SCP_USER)@$(SCP_TARGET_IP):$(SCP_TARGET_PATH)

4 Comments

 Add your comment
  1. Thanks. Just trying to get up and running with a DE0-Nano, and the demo makefiles that ship with the kit are out of date and don’t work with any remotely current set of tools. Your makefile works _and_ is more functional.

  2. hello,
    When i run the makefile I obtained this error message:
    build/obj/C:/altera/16.0/embedded/ip/altera/hps/altera_hps/hwlib/src/utils/alt_retarget_gnu.o, …) failed.
    make (e=2): Le fichier spécifié est introuvable.
    make: *** [builddirs] Error 2

    can you help me to overcome this error.
    many thanks!

  3. when i run the makefile i obtained this error message :
    Make : *** No rule to make target ‘/home/root’, needed by ‘build/BtB_LEDcontrol1’
    . Stop.

    would you give me solution for this error
    thank you

Leave a Comment

Your email address will not be published.

1 Trackback

  1. Csrcs Error (Pingback)