为什么我的makefile从未停止构建?

为什么我的makefile从未停止构建?,makefile,build,rebuild,Makefile,Build,Rebuild,我试图创建一个makefile来控制构建过程。我使用eclipse,我有很多项目,其中一些是共享库。因此,如果我构建了一个使用库的项目,那么如果库已经过时,我希望它能够被构建。这看起来很标准。我就是做不到。 我正在使链接依赖于库,并且我(尝试)提供了构建库的规则。但当我这样做的时候,它似乎在一次又一次地建造图书馆——而且它永远不会完工。我错过了什么 CPPUTEST_HOME = ... PROJECTROOT := ... SDKTARGETSYSROOT := /opt/fsl-imx-fb

我试图创建一个makefile来控制构建过程。我使用eclipse,我有很多项目,其中一些是共享库。因此,如果我构建了一个使用库的项目,那么如果库已经过时,我希望它能够被构建。这看起来很标准。我就是做不到。 我正在使链接依赖于库,并且我(尝试)提供了构建库的规则。但当我这样做的时候,它似乎在一次又一次地建造图书馆——而且它永远不会完工。我错过了什么

CPPUTEST_HOME = ...
PROJECTROOT := ...
SDKTARGETSYSROOT := /opt/fsl-imx-fb/4.14-sumo/sysroots/cortexa9hf-neon-poky-linux-gnueabi

COMPONENT_NAME := Jehova

USER_LIB := 

INCLUDE_DIRS := $(PROJECTROOT)/Log/source \
                $(PROJECTROOT)/Config/source \

LIBS :=         $(PROJECTROOT)/Log/bin/libLog.so \
                $(PROJECTROOT)/Config/bin/libConfig.so \

# Links to the commands to be used
REMOVE := rm -rf
COMPILER := arm-poky-linux-gnueabi-g++

# All of the sources participating in the build are defined here
SOURCEDIR = source
OBJECTDIR = objects
TEST_DIR = utest
PATH_TO_MAIN = source/main.cpp

SOURCES = $(wildcard $(SOURCEDIR)/*.cpp)
OBJECTS = $(patsubst $(SOURCEDIR)/%.cpp, $(OBJECTDIR)/%.o, $(SOURCES))
DEPENDENCIES = $(patsubst $(SOURCEDIR)/%.cpp, $(OBJECTDIR)/%.d, $(SOURCES))

# Paths to the headerfiles
get_dirs_from_dirspec = $(wildcard $1)

INCLUDE_DIRS += $(USER_LIB) \
                $(SDKTARGETSYSROOT)/usr/include/ \
                $(SDKTARGETSYSROOT)/usr/include/c++/7.3.0/ \
                $(SDKTARGETSYSROOT)/usr/include/c++/7.3.0/arm-poky-linux-gnueabi/       

INCLUDE_DIR_EXPANDED = $(call get_dirs_from_dirspec, $(INCLUDE_DIRS))
COMPILE_INCLUDE = $(foreach dir, $(INCLUDE_DIR_EXPANDED), -I$(dir))
LINK_INCLUDE = $(foreach dir, $(INCLUDE_DIR_EXPANDED), -L$(dir))

# Compiler and linkerflags
COMPILER_FLAGS := -Wall -c -fmessage-length=0 -march=armv7-a -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 -Wno-unknown-pragmas --sysroot=$(SDKTARGETSYSROOT)
LINKER_FLAGS := -mfloat-abi=hard -lpthread

# If main.cpp does not exist the project is assumed to be a shared library
ifeq ("$(wildcard $(PATH_TO_MAIN))","")
    COMPILER_FLAGS += -fPIC
    LINKER_FLAGS += -shared -o
    BIN := ./bin/lib$(COMPONENT_NAME).so
else
    LINKER_FLAGS += -o
    BIN := ./bin/$(COMPONENT_NAME)
endif

# Optimization and debug levels
ifeq ($(MAKECMDGOALS),release)
    COMPILER_FLAGS += -O3
else
    COMPILER_FLAGS += -O0 -g3
endif

# Include dependencies
ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(DEPENDENCIES)),)
-include $(DEPENDENCIES)
endif
endif

# All Target
all: $(BIN) test
    -$(REMOVE) makeenv

# Compile source to create object files
./objects/%.o: ./source/%.cpp 
    @echo 'Building file: $<'
    @echo 'Invoking: Cross G++ Compiler'
    -$(COMPILER) $(COMPILE_INCLUDE) $(COMPILER_FLAGS) -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<"
    @echo 'Finished building: $<'
    @echo ' '

# Link objects to build target
$(BIN): $(OBJECTS) $(LIBS)
    @echo 'Building target: $@'
    @echo 'Invoking: Cross G++ Linker'
    -$(COMPILER)  $(LINK_INCLUDE) --sysroot=$(SDKTARGETSYSROOT) $(LINKER_FLAGS) $(BIN) $(OBJECTS) $(LIBS)
    @echo 'Finished building target: $@'
    @echo ' '

# All Target release build
release: clean $(BIN)
    -$(REMOVE) makeenv

# Run the test
test: $(BIN)
    make -C $(TEST_DIR)

# Other Targets
clean:
    -$(REMOVE) $(OBJECTS)$(DEPENDENCIES) $(BIN)
    make -C $(TEST_DIR) clean
    -$(REMOVE) makeenv
    -@echo ' '

$(LIBS):
    -cd $(PROJECTROOT)/Config && $(MAKE) clean all release
    -cd $(PROJECTROOT)/Log && $(MAKE) clean all release

CPPUTEST\u HOME=。。。
PROJECTROOT:=。。。
SDKTARGETSYSROOT:=/opt/fsl imx fb/4.14-sumo/sysroot/cortexa9hf-neon-poky-linux-gnueabi
组件名称:=Jehova
用户库:=
INCLUDE_DIRS:=$(PROJECTROOT)/日志/源\
$(PROJECTROOT)/Config/source\
LIBS:=$(PROJECTROOT)/Log/bin/libLog.so\
$(PROJECTROOT)/Config/bin/libConfig.so\
#指向要使用的命令的链接
移除:=rm-rf
编译器:=arm-poky-linux-gnueabi-g++
#这里定义了参与构建的所有源
SOURCEDIR=源
OBJECTDIR=对象
TEST_DIR=utest
路径\u到\u MAIN=source/MAIN.cpp
SOURCES=$(通配符$(SOURCEDIR)/*.cpp)
OBJECTS=$(patsubst$(SOURCEDIR)/%.cpp,$(OBJECTDIR)/%.o,$(SOURCES))
依赖项=$(patsubst$(SOURCEDIR)/%.cpp,$(OBJECTDIR)/%.d,$(SOURCES))
#通往车头文件的路径
从_dirspec获取_dirs_=$(通配符$1)
INCLUDE_DIRS+=$(用户库)\
$(SDKTARGETSYSROOT)/usr/include/\
$(SDKTARGETSYSROOT)/usr/include/c++/7.3.0/\
$(SDKTARGETSYSROOT)/usr/include/c++/7.3.0/arm-poky-linux-gnueabi/
INCLUDE_DIR_EXPANDED=$(从_dirspec,$(INCLUDE_dirs)调用get_dirs_)
COMPILE\u INCLUDE=$(foreach dir,$(INCLUDE\u dir\u EXPANDED),-I$(dir))
LINK\u INCLUDE=$(foreach dir,$(INCLUDE\u dir\u EXPANDED),-L$(dir))
#编译器和linkerflags
编译器_标志:=-Wall-c-fmessage length=0-march=armv7-a-mfloat abi=hard-mfpu=neon-mtune=cortex-a9-Wno未知pragmas--sysroot=$(SDKTARGETSYSROOT)
链接器_标志:=-mfloat abi=hard-lpthread
#如果main.cpp不存在,则假定该项目为共享库
ifeq($(通配符$(路径到主路径)),“”)
编译器标志+=-fPIC
链接器_标志+=-shared-o
BIN:=./BIN/lib$(组件名称)。所以
其他的
链接器_标志+=-o
BIN:=./BIN/$(组件名称)
恩迪夫
#优化和调试级别
ifeq($(MAKECMDGOALS),发布版)
编译器_标志+=-O3
其他的
编译器_标志+=-O0-g3
恩迪夫
#包含依赖项
ifneq($(MAKECMDGOALS),干净)
ifneq($(条$(依赖项)),)
-包括$(依赖项)
恩迪夫
恩迪夫
#所有目标
全部:$(BIN)测试
-$(删除)makeenv
#编译源代码以创建对象文件
./objects/%.o:./source/%.cpp

@echo“Building file:$与您的问题无关,但是(a)为什么您在所有行前面都加上
-
?这会导致make忽略您肯定不想做的错误(除了在
clean
中),以及(b)在调用sub make时始终使用
$(make)
,而从不使用
make
。您将不得不自己进行更多的调试。当你说“永不结束”时,你的意思是你调用make一次,它一遍又一遍地重建相同的目标,而不返回shell提示符?还是说每次调用make时,它都会重建相同的目标,然后停止?在这个生成文件中,我看不到任何会导致前一种行为的东西。可能是
TEST\u DIR
子目录makefile中的某些内容导致了它。试着用
-d
运行make,看看它为什么一直在重建(它将生成大量输出)。