Многоцелевой make-файл с подпапками - PullRequest
0 голосов
/ 15 апреля 2020

Мой проект имеет следующую структуру:

\---Project
    +   Makefile
    |
    +---source
    |   +---target1
    |   |       t1_lib.c
    |   |       t1_main.c
    |   |       
    |   +---target2
    |   |       t2_lib.c
    |   |       t2_main.c
    |   |       
    |   \---common
    |           common_lib.c
    |
    +---headers
        +---target1
        |       t1_lib.h
        |       
        +---target2
        |       t2_lib.h
        |       
        \---common
                common_lib.h

Я пытаюсь написать make-файл, который позволяет мне запустить 'make target1' или 'make target2' и скомпилировать исходный код target1 с общим исходным кодом или скомпилируйте исходный код target2 с общим исходным кодом соответственно.

В моем проекте target1 - это вызов 'ue', а target2 - это вызов 'enb'. Вот что у меня есть в моем текущем make-файле:

# Author: j0lama

# COMPILER
CC = gcc

#FLAGS
CFLAGS = -c -Wall -ansi -g -std=c99 -D_DEBUG

#LIB FLAGS
LIBFLAGS = -lgc -rdynamic -lcrypto -lpthread

#LINK FLAGS
LINKFLAGS = -lsctp

# PATHS
UE_SOURCE_DIRECTORY = source/ue/
UE_INCLUDE_DIRECTORY = headers/ue/
ENB_SOURCE_DIRECTORY = source/enb/
ENB_INCLUDE_DIRECTORY = headers/enb/
COMMON_SRC_DIRECTORY = source/common/
COMMON_HDR_DIRECTORY = headers/common/

OBJECT_DIRECTORY = objects/
BUILD_DIRECTORY = build/

COMMON_CFILES= $(wildcard $(COMMON_SRC_DIRECTORY)*.c)
COMMON_OBJECTS= $(patsubst $(COMMON_SRC_DIRECTORY)%.c, $(OBJECT_DIRECTORY)%.o, $(COMMON_CFILES))

CFILES = $(COMMON_CFILES)
OBJECTS = $(COMMON_OBJECTS)

all: clean ue enb

ue: setup_ue $(OBJECT_DIRECTORY) $(TARGET) ue_emulator

enb: setup_enb $(OBJECT_DIRECTORY) $(TARGET) enb_emulator

setup_ue:
    $(eval CFILES += $(wildcard $(UE_SOURCE_DIRECTORY)*.c))
    $(eval OBJECTS += $(patsubst $(UE_SOURCE_DIRECTORY)%.c, $(OBJECT_DIRECTORY)%.o, $(wildcard $(UE_SOURCE_DIRECTORY)*.c)))
    $(eval INCLUDE_DIRECTORY = $(UE_INCLUDE_DIRECTORY))

setup_enb:
    $(eval CFILES += $(wildcard $(ENB_SOURCE_DIRECTORY)*.c))
    $(eval OBJECTS += $(patsubst $(ENB_SOURCE_DIRECTORY)%.c, $(OBJECT_DIRECTORY)%.o, $(wildcard $(ENB_SOURCE_DIRECTORY)*.c)))
    $(eval INCLUDE_DIRECTORY = $(ENB_INCLUDE_DIRECTORY))


$(OBJECT_DIRECTORY):
    @mkdir $(OBJECT_DIRECTORY)
    @echo "Building objects directory..."

ue_emulator: $(OBJECTS)
    @echo "Building $@..."
    @$(CC) $(OBJECTS) $(LIBFLAGS) $(LINKFLAGS) -o $@

enb_emulator: $(OBJECTS)
    @echo "Building $@..."
    @$(CC) $(OBJECTS) $(LIBFLAGS) $(LINKFLAGS) -o $@

$(OBJECT_DIRECTORY)%.o: $(SOURCE_DIRECTORY)%.c $(COMMON_SRC_DIRECTORY)%.c
    @echo "Building $@..."
    @$(CC) -I $(COMMON_HDR_DIRECTORY) -I $(INCLUDE_DIRECTORY) $(CFLAGS) $(LIBFLAGS) $< -o $@

.PHONY: clean
clean:
    @echo "Removing objects files"
    @rm -rf $(OBJECT_DIRECTORY) $(TARGET)

Каким-то образом этот make-файл не компилирует ни один файл.

...