#----------------------------------------------- # Make command: # make build= all # : debug or release, release by default. #----------------------------------------------- #----------------------------------------------- # setup variables # ---------------------------------------------- BOOT_ROOT := $(abspath ../../..) OUTPUT_ROOT := $(abspath ./) APP_NAME = blhost #----------------------------------------------- # Debug or Release # Release by default #----------------------------------------------- build ?= release include $(BOOT_ROOT)/mk/common.mk #----------------------------------------------- # Include path. Add the include paths like this: # INCLUDES += ./include/ #----------------------------------------------- INCLUDES += $(BOOT_ROOT)/validation/blhost/src \ $(BOOT_ROOT)/src \ $(BOOT_ROOT)/src/include \ $(BOOT_ROOT)/src/blfwk \ $(BOOT_ROOT)/src/sbloader \ $(BOOT_ROOT)/src/bootloader \ $(BOOT_ROOT)/src/crc \ $(BOOT_ROOT)/src/packet \ $(BOOT_ROOT)/src/property \ $(BOOT_ROOT)/src/drivers/common \ $(BOOT_ROOT)/src/bm_usb CXXFLAGS := -D LINUX -D BOOTLOADER_HOST -std=c++11 -march=x86-64 -mtune=generic CFLAGS := -std=c99 -D LINUX -D BOOTLOADER_HOST -D _GNU_SOURCE -mtune=generic -march=x86-64 LD := g++ SOURCES := $(BOOT_ROOT)/validation/blhost/src/blhost.cpp \ $(BOOT_ROOT)/src/blfwk/src/Blob.cpp \ $(BOOT_ROOT)/src/blfwk/src/Bootloader.cpp \ $(BOOT_ROOT)/src/blfwk/src/BusPal.cpp \ $(BOOT_ROOT)/src/blfwk/src/BusPalPeripheral.cpp \ $(BOOT_ROOT)/src/blfwk/src/Command.cpp \ $(BOOT_ROOT)/src/blfwk/src/DataSource.cpp \ $(BOOT_ROOT)/src/blfwk/src/DataSourceImager.cpp \ $(BOOT_ROOT)/src/blfwk/src/DataTarget.cpp \ $(BOOT_ROOT)/src/blfwk/src/ELFSourceFile.cpp \ $(BOOT_ROOT)/src/blfwk/src/ExcludesListMatcher.cpp \ $(BOOT_ROOT)/src/blfwk/src/format_string.cpp \ $(BOOT_ROOT)/src/blfwk/src/GHSSecInfo.cpp \ $(BOOT_ROOT)/src/blfwk/src/GlobMatcher.cpp \ $(BOOT_ROOT)/src/blfwk/src/hid-linux.c \ $(BOOT_ROOT)/src/blfwk/src/jsoncpp.cpp \ $(BOOT_ROOT)/src/blfwk/src/Logging.cpp \ $(BOOT_ROOT)/src/blfwk/src/options.cpp \ $(BOOT_ROOT)/src/blfwk/src/SBSourceFile.cpp \ $(BOOT_ROOT)/src/blfwk/src/SearchPath.cpp \ $(BOOT_ROOT)/src/blfwk/src/serial.c \ $(BOOT_ROOT)/src/blfwk/src/SerialPacketizer.cpp \ $(BOOT_ROOT)/src/blfwk/src/SourceFile.cpp \ $(BOOT_ROOT)/src/blfwk/src/SRecordSourceFile.cpp \ $(BOOT_ROOT)/src/blfwk/src/IntelHexSourceFile.cpp \ $(BOOT_ROOT)/src/blfwk/src/StELFFile.cpp \ $(BOOT_ROOT)/src/blfwk/src/StExecutableImage.cpp \ $(BOOT_ROOT)/src/blfwk/src/StSRecordFile.cpp \ $(BOOT_ROOT)/src/blfwk/src/StIntelHexFile.cpp \ $(BOOT_ROOT)/src/blfwk/src/Updater.cpp \ $(BOOT_ROOT)/src/blfwk/src/UartPeripheral.cpp \ $(BOOT_ROOT)/src/blfwk/src/UsbHidPacketizer.cpp \ $(BOOT_ROOT)/src/blfwk/src/UsbHidPeripheral.cpp \ $(BOOT_ROOT)/src/blfwk/src/utils.cpp \ $(BOOT_ROOT)/src/blfwk/src/Value.cpp \ $(BOOT_ROOT)/src/crc/src/crc16.c \ $(BOOT_ROOT)/src/crc/src/crc32.c \ #$(BOOT_ROOT)/src/blfwk/src/Simulator.cpp #$(BOOT_ROOT)/src/blfwk/src/SimulatorMemory.cpp #$(BOOT_ROOT)/src/blfwk/src/SimPacketizer.cpp #$(BOOT_ROOT)/src/blfwk/src/SimPeripheral.cpp #$(BOOT_ROOT)/src/bootloader/src/command.cpp #$(BOOT_ROOT)/src/sbloader/src/sbloader.c #$(BOOT_ROOT)/src/property/src/property.c #$(BOOT_ROOT)/src/memory/src/memory.c #$(BOOT_ROOT)/src/bootloader/src/bootloader_context.cpp INCLUDES := $(foreach includes, $(INCLUDES), -I $(includes)) ifeq "$(build)" "debug" DEBUG_OR_RELEASE := Debug CFLAGS += -g CXXFLAGS += -g LDFLAGS += -g else DEBUG_OR_RELEASE := Release endif TARGET_OUTPUT_ROOT := $(OUTPUT_ROOT)/$(DEBUG_OR_RELEASE) MAKE_TARGET := $(TARGET_OUTPUT_ROOT)/$(APP_NAME) OBJS_ROOT = $(TARGET_OUTPUT_ROOT)/obj # Strip sources. SOURCES := $(strip $(SOURCES)) # Convert sources list to absolute paths and root-relative paths. SOURCES_ABS := $(foreach s,$(SOURCES),$(abspath $(s))) SOURCES_REL := $(subst $(BOOT_ROOT)/,,$(SOURCES_ABS)) # Get a list of unique directories containing the source files. SOURCE_DIRS_ABS := $(sort $(foreach f,$(SOURCES_ABS),$(dir $(f)))) SOURCE_DIRS_REL := $(subst $(BOOT_ROOT)/,,$(SOURCE_DIRS_ABS)) OBJECTS_DIRS := $(addprefix $(OBJS_ROOT)/,$(SOURCE_DIRS_REL)) # Filter source files list into separate source types. C_SOURCES = $(filter %.c,$(SOURCES_REL)) CXX_SOURCES = $(filter %.cpp,$(SOURCES_REL)) ASM_s_SOURCES = $(filter %.s,$(SOURCES_REL)) ASM_S_SOURCES = $(filter %.S,$(SOURCES_REL)) # Convert sources to objects. OBJECTS_C := $(addprefix $(OBJS_ROOT)/,$(C_SOURCES:.c=.o)) OBJECTS_CXX := $(addprefix $(OBJS_ROOT)/,$(CXX_SOURCES:.cpp=.o)) OBJECTS_ASM := $(addprefix $(OBJS_ROOT)/,$(ASM_s_SOURCES:.s=.o)) OBJECTS_ASM_S := $(addprefix $(OBJS_ROOT)/,$(ASM_S_SOURCES:.S=.o)) # Complete list of all object files. OBJECTS_ALL := $(sort $(OBJECTS_C) $(OBJECTS_CXX) $(OBJECTS_ASM) $(OBJECTS_ASM_S)) #------------------------------------------------------------------------------- # Default target #------------------------------------------------------------------------------- # Note that prerequisite order is important here. The subdirectories must be built first, or you # may end up with files in the current directory not getting added to libraries. This would happen # if subdirs modified the library file after local files were compiled but before they were added # to the library. .PHONY: all all: $(MAKE_TARGET) ## Recipe to create the output object file directories. $(OBJECTS_DIRS) : $(at)mkdir -p $@ # Object files depend on the directories where they will be created. # # The dirs are made order-only prerequisites (by being listed after the '|') so they won't cause # the objects to be rebuilt, as the modification date on a directory changes whenver its contents # change. This would cause the objects to always be rebuilt if the dirs were normal prerequisites. $(OBJECTS_ALL): | $(OBJECTS_DIRS) #------------------------------------------------------------------------------- # Pattern rules for compilation #------------------------------------------------------------------------------- # We cd into the source directory before calling the appropriate compiler. This must be done # on a single command line since make calls individual recipe lines in separate shells, so # '&&' is used to chain the commands. # # Generate make dependencies while compiling using the -MMD option, which excludes system headers. # If system headers are included, there are path problems on cygwin. The -MP option creates empty # targets for each header file so that a rebuild will be forced if the file goes missing, but # no error will occur. # Compile C sources. $(OBJS_ROOT)/%.o: $(BOOT_ROOT)/%.c @$(call printmessage,c,Compiling, $(subst $(BOOT_ROOT)/,,$<)) $(at)$(CC) $(CFLAGS) $(SYSTEM_INC) $(INCLUDES) $(DEFINES) -MMD -MF $(basename $@).d -MP -o $@ -c $< # Compile C++ sources. $(OBJS_ROOT)/%.o: $(BOOT_ROOT)/%.cpp @$(call printmessage,cxx,Compiling, $(subst $(BOOT_ROOT)/,,$<)) $(at)$(CXX) $(CXXFLAGS) $(SYSTEM_INC) $(INCLUDES) $(DEFINES) -MMD -MF $(basename $@).d -MP -o $@ -c $< # For .S assembly files, first run through the C preprocessor then assemble. $(OBJS_ROOT)/%.o: $(BOOT_ROOT)/%.S @$(call printmessage,asm,Assembling, $(subst $(BOOT_ROOT)/,,$<)) $(at)$(CPP) -D__LANGUAGE_ASM__ $(INCLUDES) $(DEFINES) -o $(basename $@).s $< \ && $(AS) $(ASFLAGS) $(INCLUDES) -MD $(OBJS_ROOT)/$*.d -o $@ $(basename $@).s # Assembler sources. $(OBJS_ROOT)/%.o: $(BOOT_ROOT)/%.s @$(call printmessage,asm,Assembling, $(subst $(BOOT_ROOT)/,,$<)) $(at)$(AS) $(ASFLAGS) $(INCLUDES) -MD $(basename $@).d -o $@ $< #------------------------------------------------------------------------ # Build the tagrget #------------------------------------------------------------------------ # Wrap the link objects in start/end group so that ld re-checks each # file for dependencies. Otherwise linking static libs can be a pain # since order matters. $(MAKE_TARGET): $(OBJECTS_ALL) @$(call printmessage,link,Linking, $(APP_NAME)) $(at)$(LD) $(LDFLAGS) \ $(OBJECTS_ALL) \ -static -lc -lstdc++ -lm -ludev -lrt \ -o $@ @echo "Output binary:" ; echo " $(APP_NAME)" #------------------------------------------------------------------------------- # Clean #------------------------------------------------------------------------------- .PHONY: clean cleanall cleanall: clean clean: $(at)rm -rf $(OBJECTS_ALL) $(OBJECTS_DIRS) $(MAKE_TARGET) $(APP_NAME) # Include dependency files. -include $(OBJECTS_ALL:.o=.d)