Почему мой make-файл никогда не останавливается? - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь создать make-файл для управления процессом сборки. Я использую 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

...