2014-10-18 82 views
0

我想在OS X上使用GCC來編譯我的項目。 我只是修改Makefile.posix如下:海灣合作委員會makefile錯誤:使:***沒有規則,使目標

GNU_INSTALL_ROOT := /usr/local/gcc-arm-none-eabi-4_8-20143 
GNU_VERSION := 4.8.3 
GNU_PREFIX := arm-none-eabi 
GDB_PORT_NUMBER := 9992 

FLASH_START_ADDR = $(shell $(OBJDUMP) -h   $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out -j .text | grep .text | awk '{print $$4}') 

JLINK_OPTS = -device nrf51822 -if swd -speed 4000 
JLINK_GDB_OPTS = -noir 
JLINK = JLinkExe $(JLINK_OPTS) 
JLINKD_GDB = JLinkGDBServer $(JLINK_GDB_OPTS) 


flash-jlink: flash.jlink 
    $(JLINK) flash.jlink 

flash.jlink: 
    printf "loadbin $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin $(FLASH_START_ADDR)\nr\ng\nexit\n" > flash.jlink 

erase-all: erase-all.jlink 
    $(JLINK) erase-all.jlink 

erase-all.jlink: 
    # Write to NVMC to enable erase, do erase all, wait for completion. reset 
    printf "w4 4001e504 2\nw4 4001e50c 1\nsleep 100\nr\nexit\n" > erase-all.jlink 

run-debug: 
    $(JLINKD_GDB) $(JLINK_OPTS) $(JLINK_GDB_OPTS) -port $(GDB_PORT_NUMBER) 

.PHONY: flash-jlink flash.jlink erase-all erase-all.jlink run-debug 

當我試圖啓動與修改後的Makefile.posix服務器:

make -f ble_app_hrs.Makefile run-debug 

我得到這個錯誤:

Macintosh:gcc $ make -f ble_app_hrs.Makefile run-debug 
    /bin/sh: - : invalid option 
Usage: /bin/sh [GNU long option] [option] ... 
    /bin/sh [GNU long option] [option] script-file ... 
GNU long options: 
    --debug 
    --debugger 
    --dump-po-strings 
    --dump-strings 
    --help 
    --init-file 
    --login 
    --noediting 
    --noprofile 
    --norc 
    --posix 
    --protected 
    --rcfile 
    --restricted 
    --verbose 
    --version 
    --wordexp 
Shell options: 
    -irsD or -c command or -O shopt_option  (invocation only) 
    -abefhkmnptuvxBCHP or -o option 
make: *** No rule to make target `JLinkGDBServer', needed by `run-debug'. Stop. 

這裏文件ble_app_hrs.Makefile:

TARGET_CHIP := NRF51822_QFAA_CA 
BOARD := BOARD_PCA10001 

# application source 
C_SOURCE_FILES += main.c 
C_SOURCE_FILES += battery.c 
C_SOURCE_FILES += led.c 

C_SOURCE_FILES += ble_dis.c 
C_SOURCE_FILES += ble_bas.c 
C_SOURCE_FILES += ble_hrs.c 

C_SOURCE_FILES += ble_srv_common.c 
C_SOURCE_FILES += ble_sensorsim.c 
C_SOURCE_FILES += softdevice_handler.c 
C_SOURCE_FILES += ble_advdata.c 
C_SOURCE_FILES += ble_debug_assert_handler.c 
C_SOURCE_FILES += ble_error_log.c 
C_SOURCE_FILES += ble_conn_params.c 
C_SOURCE_FILES += app_timer.c 
C_SOURCE_FILES += pstorage.c 
C_SOURCE_FILES += crc16.c 
C_SOURCE_FILES += device_manager_peripheral.c 
C_SOURCE_FILES += app_trace.c 
C_SOURCE_FILES += simple_uart.c 
C_SOURCE_FILES += app_gpiote.c 
C_SOURCE_FILES += app_button.c 

SDK_PATH = ../../../../../ 

OUTPUT_FILENAME := ble_app_hrs 

DEVICE_VARIANT := xxaa 
#DEVICE_VARIANT := xxab 

USE_SOFTDEVICE := S110 
#USE_SOFTDEVICE := S210 

CFLAGS := -DDEBUG_NRF_USER -DBLE_STACK_SUPPORT_REQD 

# we do not use heap in this app 
ASMFLAGS := -D__HEAP_SIZE=0 

# keep every function in separate section. This will allow linker to dump unused functions 
CFLAGS += -ffunction-sections 

# let linker to dump unused sections 
#LDFLAGS := -Wl,--gc-sections 

INCLUDEPATHS += -I"$(SDK_PATH)Include/s110" 
INCLUDEPATHS += -I"$(SDK_PATH)Include/ble" 
INCLUDEPATHS += -I"$(SDK_PATH)Include/ble/device_manager" 
INCLUDEPATHS += -I"$(SDK_PATH)Include/ble/ble_services" 
INCLUDEPATHS += -I"$(SDK_PATH)Include/app_common" 
INCLUDEPATHS += -I"$(SDK_PATH)Include/sd_common" 
INCLUDEPATHS += -I"$(SDK_PATH)Include/sdk" 

C_SOURCE_PATHS += $(SDK_PATH)Source/ble 
C_SOURCE_PATHS += $(SDK_PATH)Source/ble/device_manager 
C_SOURCE_PATHS += $(SDK_PATH)Source/app_common 
C_SOURCE_PATHS += $(SDK_PATH)Source/sd_common 

include $(SDK_PATH)Source/templates/gcc/Makefile.common 

這裏使用Makefile.posix文件Makefile.common:

DEVICE := NRF51 
DEVICESERIES := nrf51 

SDK_INCLUDE_PATH = $(SDK_PATH)/Include/ 
SDK_SOURCE_PATH = $(SDK_PATH)/Source/ 
TEMPLATE_PATH += $(SDK_SOURCE_PATH)/templates/gcc/ 
OUTPUT_BINARY_DIRECTORY := _build 

ifeq ($(OS),Windows_NT) 
include $(TEMPLATE_PATH)Makefile.windows 
else 
include $(TEMPLATE_PATH)Makefile.posix 
endif 

ifeq ($(LINKER_SCRIPT),) 
    ifeq ($(USE_SOFTDEVICE), S110) 
     LINKER_SCRIPT = gcc_$(DEVICESERIES)_s110_$(DEVICE_VARIANT).ld 
     OUTPUT_FILENAME := $(OUTPUT_FILENAME)_s110_$(DEVICE_VARIANT) 
    else 
     ifeq ($(USE_SOFTDEVICE), S210) 
      LINKER_SCRIPT = gcc_$(DEVICESERIES)_s210_$(DEVICE_VARIANT).ld 
      OUTPUT_FILENAME := $(OUTPUT_FILENAME)_s210_$(DEVICE_VARIANT) 
     else 
      LINKER_SCRIPT = gcc_$(DEVICESERIES)_blank_$(DEVICE_VARIANT).ld 
      OUTPUT_FILENAME := $(OUTPUT_FILENAME)_$(DEVICE_VARIANT) 
     endif 
    endif 
else 
# Use externally defined settings 
endif 

CPU := cortex-m0 

# Toolchain commands 
CC    := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-gcc" 
AS    := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-as" 
AR    := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ar" -r 
LD    := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ld" 
NM    := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-nm" 
OBJDUMP   := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objdump" 
OBJCOPY   := "$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objcopy" 

MK    := mkdir 
RM    := rm -rf 

OBJECT_DIRECTORY := _build 
LISTING_DIRECTORY := _build 

C_SOURCE_FILES += system_$(DEVICESERIES).c 
ASSEMBLER_SOURCE_FILES += gcc_startup_$(DEVICESERIES).s 

# Linker flags 
#LDFLAGS += -L"$(GNU_INSTALL_ROOT)/arm-none-eabi/lib/armv6-m" 
#LDFLAGS += -L"$(GNU_INSTALL_ROOT)/lib/gcc/arm-none-eabi/$(GNU_VERSION)/armv6-m" 
LDFLAGS += -Xlinker -Map=$(LISTING_DIRECTORY)/$(OUTPUT_FILENAME).map 
LDFLAGS += -mcpu=$(CPU) -mthumb -mabi=aapcs -L $(TEMPLATE_PATH) -T$(LINKER_SCRIPT) 

# Compiler flags 
CFLAGS += -mcpu=$(CPU) -mthumb -mabi=aapcs -D$(DEVICE) -D$(BOARD) -D$(TARGET_CHIP) --std=gnu99 
CFLAGS += -Wall -Werror 
CFLAGS += -mfloat-abi=soft 

# Assembler flags 
ASMFLAGS += -x assembler-with-cpp 

INCLUDEPATHS += -I"../" 
INCLUDEPATHS += -I"$(SDK_PATH)Include" 
INCLUDEPATHS += -I"$(SDK_PATH)Include/gcc" 
INCLUDEPATHS += -I"$(SDK_PATH)Include/ext_sensors" 

# Sorting removes duplicates 
BUILD_DIRECTORIES := $(sort $(OBJECT_DIRECTORY) $(OUTPUT_BINARY_DIRECTORY) $(LISTING_DIRECTORY)) 

#################################################################### 
# Rules               # 
#################################################################### 

C_SOURCE_FILENAMES = $(notdir $(C_SOURCE_FILES)) 
ASSEMBLER_SOURCE_FILENAMES = $(notdir $(ASSEMBLER_SOURCE_FILES)) 

# Make a list of source paths 
C_SOURCE_PATHS += ../ $(SDK_SOURCE_PATH) $(TEMPLATE_PATH) $(wildcard $(SDK_SOURCE_PATH)*/) $(wildcard $(SDK_SOURCE_PATH)ext_sensors/*/) $(wildcard $(SDK_SOURCE_PATH)ble/*/) 
ASSEMBLER_SOURCE_PATHS = ../ $(SDK_SOURCE_PATH) $(TEMPLATE_PATH) $(wildcard $(SDK_SOURCE_PATH)*/) 

C_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILENAMES:.c=.o)) 
ASSEMBLER_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(ASSEMBLER_SOURCE_FILENAMES:.s=.o)) 

# Set source lookup paths 
vpath %.c $(C_SOURCE_PATHS) 
vpath %.s $(ASSEMBLER_SOURCE_PATHS) 

# Include automatically previously generated dependencies 
-include $(addprefix $(OBJECT_DIRECTORY)/, $(COBJS:.o=.d)) 

### Targets 
debug: CFLAGS += -DDEBUG -g3 -O0 
debug: ASMFLAGS += -DDEBUG -g3 -O0 
debug: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex 

.PHONY: release 
release: clean 
release: CFLAGS += -DNDEBUG -O3 
release: ASMFLAGS += -DNDEBUG -O3 
release: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex 

echostuff: 
    @echo C_OBJECTS: [$(C_OBJECTS)] 
    @echo C_SOURCE_FILES: [$(C_SOURCE_FILES)] 
    @echo C_SOURCE_PATHS: [$(C_SOURCE_PATHS)] 

## Create build directories 
$(BUILD_DIRECTORIES): 
    $(MK) [email protected] 

## Create objects from C source files 
$(OBJECT_DIRECTORY)/%.o: %.c 
# Build header dependencies 
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -M $< -MF "$(@:.o=.d)" -MT [email protected] 
# Do the actual compilation 
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -c -o [email protected] $< 

## Assemble .s files 
$(OBJECT_DIRECTORY)/%.o: %.s 
    $(CC) $(ASMFLAGS) $(INCLUDEPATHS) -c -o [email protected] $< 

## Link C and assembler objects to an .out file 
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out: $(BUILD_DIRECTORIES) $(C_OBJECTS) $(ASSEMBLER_OBJECTS) $(LIBRARIES) 
    $(CC) $(LDFLAGS) $(C_OBJECTS) $(ASSEMBLER_OBJECTS) $(LIBRARIES) -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 

## Create binary .bin file from the .out file 
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 
    $(OBJCOPY) -O binary $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin 

## Create binary .hex file from the .out file 
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 
    $(OBJCOPY) -O ihex $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex 

## Default build target 
.PHONY: all 
all: clean release 

clean: 
    $(RM) $(OUTPUT_BINARY_DIRECTORY) 

## Program device 
.PHONY: flash 
flash: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex 
    nrfjprog --reset --program $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex 

.PHONY: reset 
reset: 
    nrfjprog --reset 

.PHONY: erase 
erase: 
    nrfjprog --erase 

任何幫助將不勝感激

+0

您對此有何看法?在Makefile中沒有目標'run-debugpwd',只有'run-debug'。 – Matthias 2014-10-18 19:30:10

+0

'make -f ble_app_hrs.Makefile'指示make讀取一個叫做'ble_app_hrs.Makefile'的makefile,但是你說你編輯了'Makefile.posix'?您向我們顯示的文件不包含目標'run-debugpwd' – fvu 2014-10-18 19:31:06

+0

抱歉,這是一個複製和粘貼錯誤。編輯 – Baldrick 2014-10-18 19:32:14

回答

1

括號編輯器中的製表符被替換爲4個空格(sp sp sp sp)。 更改爲其他編輯器(TextMate)解決了問題

0

所有這些線接錯:

flash-jlink: flash.jlink $(JLINK) flash.jlink 

flash.jlink: printf "loadbin $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin $(FLASH_START_ADDR)\nr\ng\nexit\n" >flash.jlink 

erase-all: erase-all.jlink $(JLINK) erase-all.jlink 

# Write to NVMC to enable erase, do erase all, wait for completion. reset 
erase-all.jlink: printf "w4 4001e504 2\nw4 4001e50c 1\nsleep 100\nr\nexit\n" > erase-all.jlink 

run-debug: $(JLINKD_GDB) $(JLINK_OPTS) $(JLINK_GDB_OPTS) -port $(GDB_PORT_NUMBER) 

我不知道你只是粗心剪切和粘貼,但在命令前必須在下一行或分號上有換行符和TAB。像這樣:

flash-jlink: flash.jlink 
     $(JLINK) flash.jlink 

flash.jlink: 
     printf "loadbin $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin $(FLASH_START_ADDR)\nr\ng\nexit\n" >flash.jlink 

erase-all: erase-all.jlink 
     $(JLINK) erase-all.jlink 

# Write to NVMC to enable erase, do erase all, wait for completion. reset 
erase-all.jlink: 
     printf "w4 4001e504 2\nw4 4001e50c 1\nsleep 100\nr\nexit\n" > erase-all.jlink 

run-debug: 
     $(JLINKD_GDB) $(JLINK_OPTS) $(JLINK_GDB_OPTS) -port $(GDB_PORT_NUMBER) 
+0

嗨,如果我在命令($(JLINK)flash.jlink)之前添加一個新行和一個TAB,我得到這個錯誤:Makefile .posix:15:***在命令前缺少規則。停止 – Baldrick 2014-10-18 21:12:44

+1

嗯,如果你忠實地粘貼你正在使用的makefile,就不會發生這種情況。但是,您使用的是GNU make的一個非常舊的版本,這很明顯。你說你在MacOSX上;當你保存這個文件時,你是使用UNIX風格的行尾(即LF字符還是十進制10還是十六進制0x0a),還是使用老式的Mac行結尾(CR字符)?如果你運行'od -a Makefile.posix |更少「,並看看字符編碼,你看到換行符應該在哪裏的令牌'nl',或者你看到'cr'?較早版本的GNU make沒有正確處理非UNIX行尾。 – MadScientist 2014-10-18 21:26:03

+0

我在k之後和新行的$之前看到了這一點:cr nl sp sp sp sp。順便說一句,我用支架進行編輯 – Baldrick 2014-10-18 21:40:34