从makefile在构建目录中创建中间文件

问题描述 投票:0回答:1

我必须在Ubuntu终端中使用makefile创建一个XC8项目。目录结构是这样的

Project/lib/GPIO/gpio.c
Project/lib/GPIO/gpio.h
Project/main.c
Project/Makefile

Project/build/lib/GPIO

makefile在Project目录本身中生成中间文件。实际上,makefile将转到每个位置,并为每个.c文件生成中间文件。

喜欢这个

Project/gpio.d
Project/gpio.p1
Project/gpio.pre
Project/<other files>

但是我想改为在Project/build/lib/GPIO中生成它们。即

Project/build/lib/GPIO/gpio.d
Project/build/lib/GPIO/gpio.p1
Project/build/lib/GPIO/gpio.pre
Project/build/<other files>

Makefile:

CHIP := 18F4580
CC := xc8
INCLUDE_PATH := /opt/microchip/xc8/v2.10/include/
PROG := /usr/share/tinybldlin/tinybldlin.py
PORT := /dev/ttyUSB0
AR := libr

SRC_DIR := $(wildcard *.c)
INC_DIR := $(wildcard *.h)

LIB_DIR := \
. \
lib \
lib/GPIO

BUILD_DIR := \
build/ \
build/lib/GPIO

TARGET := pic${CHIP}
FLASH_REGION := 0-3000

ifeq (${SRCS},)
SRCS := $(foreach libdir, $(LIB_DIR),  $(wildcard $(libdir)/*.c))
endif
ifeq (${INCS},)
INCS := $(foreach libdir, $(LIB_DIR),  $(wildcard $(libdir)/*.h))
endif
ifeq (${OBJS},)
OBJS := $(SRCS:.c=.obj)
endif
ifeq (${P1},)
OBJS := $(SRCS:.c=.p1)
endif

MIN_CFLAGS := --chip=${CHIP} -I${INCLUDE_PATH} --ROM=${FLASH_REGION}
# The following MSG_CFLAGS controls the compiler messages
MSG_CFLAGS := -Q
# The following OPT_CFLAGS reduces the code size
OPT_CFLAGS := --opt=all
# The following OUT_CFLAGS controls the generated outputs
OUT_CFLAGS := --asmlist --summary=psect,mem -M${TARGET}.map 
EXTRA_CFLAGS += ${MSG_CFLAGS} ${OPT_CFLAGS} ${OUT_CFLAGS}
CFLAGS := ${MIN_CFLAGS} ${EXTRA_CFLAGS} -DCOMPILER=${COMPILER}
ARFLAGS := r

${TARGET}.hex: ${OBJS}
    ${CC} ${CFLAGS} -intel $^ -o$@
    ${MAKE} xclean

${TARGET}.bin: ${OBJS}
    ${CC} ${CFLAGS} -bin $^ -o$@
    ${MAKE} xclean

%.p1: %.c ${INC_DIR}
    ${CC} ${CPPFLAGS} ${CFLAGS} --pass1 $<

%.obj: %.c ${INC_DIR}
    ${CC} ${CPPFLAGS} ${CFLAGS} -C $<

%.as: %.c ${INC_DIR}
    ${CC} ${CPPFLAGS} ${CFLAGS} -S $<

%.lib: %.obj
    ${AR} ${ARFLAGS} $@ $<
makefile xc8
1个回答
0
投票

告诉编译器您想做什么

告诉您要做什么

    对于#1,默认情况下,编译器将生成输出,即输入文件名减去扩展名(例如.c)加上特定扩展名(例如.as)。由于您的输入文件为lib/GPIO/gpio.c,因此编译器将生成gpio.as。大多数编译器都支持-o选项,该选项可让您重命名输出:如果这不起作用,则必须检查编译器的文档。因此,您需要编写规则:
  • %.as: %.c ${INC_DIR} ${CC} ${CPPFLAGS} ${CFLAGS} -S -o $@ $<
  • (等)。现在,当您将lib/GPIO/gpio.c编译为lib/GPIO/gpio.as时,make会将$@设置为lib/GPIO/gpio.as并调用编译器,以使其创建lib/GPIO/gpio.as而不是gpio.as

    但是您想将输出文件放在build子目录中。现在,您已经说服编译器将文件写入make指示的位置,那么您必须告诉make将输出放置在何处。

    所以首先,当您生成要创建的输出文件时,必须使用正确的路径来创建它们:

    OBJS := $(SRCS:.c=.p1)

    lib/GPIO/gpio.c转换为lib/GPIO/gpio.p1,这不是您想要的。您需要这个:

    OBJS := $(SRCS:%.c=build/%.p1)

    现在,知道要构建build/lib/GPIO/gpio.p1。但是,现在您会得到一个错误,因为make不知道如何创建该文件。您已经告诉过它如何从%.p1构建%.c,但是%必须是目标和前提条件之间的精确文本匹配,此处目标%build/lib/GPIO/gpio匹配,但是没有build/lib/GPIO/gpio.c ],因此规则不匹配。您需要像这样重写规则:

    build/%.p1: %.c ${INC_DIR} ${CC} ${CPPFLAGS} ${CFLAGS} --pass1 -o $@ $<

    现在应该可以了。您可能还需要添加mkdir以确保目录存在:

    build/%.p1: %.c ${INC_DIR} @mkdir -p ${@D} ${CC} ${CPPFLAGS} ${CFLAGS} --pass1 -o $@ $<

  • © www.soinside.com 2019 - 2024. All rights reserved.