Skip to content
Snippets Groups Projects
Select Git revision
  • cdc2c5bf2442a2c397d0e9de86292711d37510b1
  • master default protected
2 results

COMPONENTS.md

Blame
  • Makefile 6.97 KiB
    
    PROJECT_NAME=klee
    TARGET=$(PROJECT_NAME).hex
    EXECUTABLE=$(PROJECT_NAME).elf
    EXECOBJ=$(PROJECT_NAME).o
    IROUT=$(PROJECT_NAME).bc
    
    ifeq "$(MAKECMDGOALS)" "gcc"
    # GCC
    CC=arm-none-eabi-gcc
    LD=arm-none-eabi-ld
    AR=arm-none-eabi-ar
    AS=arm-none-eabi-as
    CP=arm-none-eabi-objcopy
    OD=arm-none-eabi-objdump
    
    else
    # CLANG
    CC=clang 
    LD=llvm-link
    CC-native=arm-none-eabi-gcc
    #LD-native=arm-none-eabi-ld
    AR=llvm-ar
    AS=arm-none-eabi-as
    CP=arm-none-eabi-objcopy
    OD=arm-none-eabi-objdump
    
    endif
    
    BIN=$(CP) -O ihex
    
    # Debugging with OpenOCD
    GDB = arm-none-eabi-gdb
    OOCD = openocd
    # General case, but now we need specifics
    #OOCDFLAsyscalls = -f interface/stlink-v2-1.cfg -f board/stm32f7discovery.cfg
    #OOCDFLAGS = -f interface/stlink-v2-1.cfg -f ocd_stm32f4.cfg
    
    OOCDFLAGS = -f interface/stlink-v2-1.cfg -f stm32f4x.cfg
    
    #DEFS = -DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DMANGUSTA_DISCOVERY -DUSE_USB_OTG_FS -DHSE_VALUE=8000000
    #DEFS = -DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DSTM32F40XX -DHSE_VALUE=8000000
    
    # STM32F4x7 custom
    #DEFS = -DUSE_STDPERIPH_DRIVER -DSTM32F40XX -DSTM32F4XX -DHSE_VALUE=16000000
    
    # STM32F401
    ifeq "$(MAKECMDGOALS)" "rel"
    DEFS = -DSTM32F40XX -DHSE_VALUE=8000000 -DTRACE -DOS_USE_TRACE_ITM 
    else ifeq "$(MAKECMDGOALS)" "wcet"
    DEFS = -DSTM32F40XX -DHSE_VALUE=8000000 -DTRACE -DOS_USE_TRACE_ITM -DKLEE_WCET
    else
    DEFS = -DSTM32F40XX -DHSE_VALUE=8000000 -DKLEE
    endif
    
    # Definitions
    #ifeq "$(MAKECMDGOALS)" "debug"
    #DEFS = -DnoUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -DOS_USE_TRACE_ITM -DDEBUG -DxOS_USE_SEMIHOSTING -DTRACE -DxOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F746xx
    #else
    #DEFS = -DnoUSE_STDPERIPH_DRIVER -DHSE_VALUE=8000000 -DxOS_USE_SEMIHOSTING -DxOS_USE_TRACE_SEMIHOSTING_DEBUG -DSTM32F746xx
    #endif
    
    # Optimize for size
    #OPTIMIZE       = -Os
    # No optimization at all
    OPTIMIZE       = -O0
    
    #INCSEARCH = include
    #SRCIGNORE =! -iname 'tiny_printf.c'
    #INCLUDES := $(shell find $(INCSEARCH) -name '*.h' -exec dirname {} \; | uniq)
    INCLUDES = -I"include" \
    		   -I"system" \
    		   -I"system/include/cmsis" \
    		   -I"system/include/cmsis/stm32f4-hal"
    		   #-I"Libraries/stm32f4-hal" \
    		   #-I"Libraries/STM32F4xx_StdPeriph_Driver/inc"\
    		   #-I"Libraries/CMSIS/Include"\
    		   #-I"Libraries/Device/STM32F4xx/Include"
    
    MCU = cortex-m4
    
    ifeq "$(MAKECMDGOALS)" "gcc"
    # GCC
    
    include Makefile_gcc
    
    # End of the GCC block
    else
    # Start of the CLANG block
    
    # CLANG
    CLANGMCFLAGS =-target arm-none-eabi -fno-integrated-as
    # MCU Specific flags
    MCFLAGS = -mcpu=$(MCU) -mlittle-endian -mthumb -ffreestanding \
    	-fmessage-length=0 -fsigned-char -ffunction-sections -fdata-sections -mfpu=fpv4-sp-d16 -mfloat-abi=hard -fshort-enums \
    	-g3 -std=gnu11 -Wall -Wextra 
    
    # For creating object file from LLVM IR
    LLCFLAGS = -mtriple=arm-none-eabi -march=thumb -mcpu=$(MCU) -filetype=obj -float-abi=hard
    
    # Assembler flags
    ASFLAGS = -mcpu=$(MCU) -mlittle-endian -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard
    
    
    # Linking options with -nostartfiles
    #LDFLAGS = -T ldscripts/stm32f4_flash.ld  -nostdlib -nostartfiles -nostartupfiles  -gc-sections -print-gc-sections  -Map objects/$(EXECUTABLE).map
    LDFLAGS = --specs=nosys.specs  -Wl,-T "ldscripts/flash.ld" -nostartfiles -Wl,-nostdlib,-print-gc-sections -Wl,-Map,objects/$(EXECUTABLE).map
    # Not used:
    #--specs=nano.specs --specs=nosys.specs  -lc -lnosys 
    
    CLANGLDFLAGS = -flto -target arm-none-eabi -mfloat-abi=hard # -save-temps=obj
    #or if you want .bc in objects -save-temps=obj
    
    # Build the compile command
    CFLAGS	= $(CLANGMCFLAGS) $(MCFLAGS)  $(OPTIMIZE)  $(DEFS)
    
    
    # Recursively add all .c files
    #SRC := $(shell find $(SOURCEDIR) -name '*.c')
    
    SRCSEARCH = src
    SRCIGNORE =! -iname 'tiny_printf.c' ! -iname 'fsdata.c' ! -iname 'stm32f4xx_spi.c' ! -iname 'stm32f4xx_iwdg.c'
    # Include the heap_4 RTOS_heap while excluding the other *_{1-5}
    # Everything in src will be compiled
    SRC := $(shell find $(SRCSEARCH) -name '*.c' $(SRCIGNORE) )
    
    # Create dependency folders for object files
    SRCDIRS := $(shell find $(SRCSEARCH) -name '*.c' $(SRCIGNORE) )
    #SRCDIRS += $(shell find libs/dw1000/src -maxdepth 1 -name '*.c' -exec dirname {} \; | uniq)
    SRCDIRS += startup
    
    # Startup files
    #STARTUP = startup/startup_stm32f40xx.s
    #STARTUP = startup/startup_stm32f407xx.s
    STARTUP = startup/startup_stm32f4.c
    
    # Assembler file to facilitate printing of stack in case of hardfault
    #HARDFAULT = startup/hardfault.s
    
    # Create folder for storing all object files
    OBJDIR = objects
    
    OBJ    := $(patsubst %.c,$(OBJDIR)/%.bc,$(SRC))
    #OBJASM := $(patsubst %.s,$(OBJDIR)/%.o,$(HARDFAULT))
    OBJSTART := $(patsubst %.c,$(OBJDIR)/%.o,$(STARTUP))
    
    DEPS    := $(patsubst %.bc,%.d,$(OBJ))
    DEPS    += $(patsubst %.o,%.d,$(OBJASM))
    
    DEPENDS  = -MT $@ -MD -MP -MF $(subst .o,.d,$@)
    SHELL    = /bin/bash
    
    .PHONY: all clean distclean
    
    
    debugbuild: buildrepo $(EXECUTABLE)
    
    all: buildrepo $(EXECUTABLE)
    
    rel: buildrepo $(EXECUTABLE)
    
    wcet: buildrepo $(EXECUTABLE)
    
    # Link native code into final executable
    #$(EXECUTABLE): $(EXECOBJ) $(OBJASM)
    ifeq "$(MAKECMDGOALS)" "rel"
    $(EXECUTABLE): $(EXECOBJ) $(OBJSTART)
    	$(CC-native) $(INCLUDES) $(MCFLAGS) $(LDFLAGS) $^ -o $@
    else ifeq "$(MAKECMDGOALS)" "wcet"
    $(EXECUTABLE): $(EXECOBJ) $(OBJSTART)
    	$(CC-native) $(INCLUDES) $(MCFLAGS) $(LDFLAGS) $^ -o $@
    else
    $(EXECUTABLE): $(EXECOBJ)
    	echo "Not doing final ARM linking."
    endif
    
    # Specially compile the startup code with GCC since CLANG does not understand linker scripts
    $(OBJSTART):
    	$(CC-native) $(MCFLAGS) $(OPTIMIZE) $(DEFS) $(DEPENDS) -c $(STARTUP) $^ -o $@ $(INCLUDES) 
    
    # Link LLVM-code into native code
    $(EXECOBJ): $(IROUT)
    	llc $(LLCFLAGS) $(IROUT) -o $@
    
    $(IROUT): $(OBJ)
    	llvm-link $^ -o $@
    
    # Source files "-c" is to not link
    $(OBJDIR)/%.bc: %.c
    	$(CC) $(CFLAGS) -c $(CLANGLDFLAGS) $(DEPENDS) $< -o $@ $(INCLUDES)
    
    # Assembler files "-c" is to not link
    # Clang assembler files
    #$(OBJDIR)/%.o: %.s
    #	$(CC) $(CLANGMCFLAGS) -c $(CLANGLDFLAGS) $< -o $@ $(INCLUDES)
    
    $(OBJDIR)/%.o: %.s
    	$(CC-native) $(MCFLAGS) $(OPTIMIZE) $(DEFS) $(DEPENDS) $(STARTUP) $< -o $@ $(INCLUDES) 
    
    # End of the CLANG block
    endif
    
    clean:
    	$(RM) -r $(OBJDIR) $(EXECOBJ) $(IR) $(IROUT)
    
    cleanall:
    	$(RM) -r $(OBJDIR) $(EXECOBJ) $(IR) $(IROUT) klee-last klee-out* $(EXECUTABLE)
    
    distclean: clean
    	$(RM) $(EXECUTABLE)
    
    buildrepo:
    	@$(call make-repo)
    
    flash: $(EXECUTABLE)
    	$(OOCD) $(OOCDFLAGS) \
    	  -c "init" -c "targets" -c "reset halt" \
    	  -c "flash write_image erase $<" -c "verify_image $<" \
    	  -c "reset run" -c "shutdown"
    
    debug: $(EXECUTABLE)
    	$(GDB) -n -iex 'target extended | $(OOCD) $(OOCDFLAGS) -c "gdb_port pipe"' \
    	-iex 'mon halt' $<
    
    klee: buildrepo $(EXECUTABLE)
    	klee -emit-all-errors $(IROUT)
    
    run: buildrepo $(EXECUTABLE)
    	arm-none-eabi-gdb -q -x klee_stm_gdb.py $(EXECUTABLE)
    
    bench: buildrepo $(EXECUTABLE)
    	make clean; make; make klee; make clean; make wcet; make run; python profiling_db_parser.py klee_profiling.db
    
    define make-repo
       for dir in $(SRCDIRS); \
       do \
        mkdir -p $(OBJDIR)/$$dir; \
       done
    endef
    
    ifneq "$(MAKECMDGOALS)" "distclean"
    ifneq "$(MAKECMDGOALS)" "clean"
    -include $(DEPS)
    endif
    endif
    
    cleanold:
    	rm -f Startup.lst  $(TARGET)  $(TARGET).lst $(OBJ) $(AUTOGEN)  $(TARGET).out  $(TARGET).hex  $(TARGET).map  $(TARGET).dmp  $(TARGET).elf