Понимание и изменение этого make-файла - PullRequest
0 голосов
/ 02 февраля 2019

Я редактировал этот make-файл, но в основном это метод проб и ошибок.

В основном у меня есть n .c файлы в той же директории.Я хочу, чтобы первый (с фиксированным именем) был скомпилирован и скомпонован с использованием моих хаков make-файлов, которые включают в себя различные файлы .o на этапе компоновки, а все остальные скомпилированы и скомпонованы с использованием только LIBS (без других файлов .o).

Это основной make-файл:

MAKEFILE_BASE = ./Build-Assets/Makefile
MAKEFILE_CONTROLLERS = ./Controllers/Makefile

.PHONY: default clean release release-clean

default: release

clean: release-clean

release:
    $(MAKE) -f $(MAKEFILE_CONTROLLERS) # This generates the .o files, and it works well
    $(MAKE) -f $(MAKEFILE_BASE).Release

release-clean:
    $(MAKE) -f $(MAKEFILE_BASE).Release clean

И это Makefile.Release, который обрабатывает компиляцию / компоновку этих .cfiles.

TARGET = $(notdir $(shell pwd))

LIBS = -lm -lev3dev-c -pthread
D_BIN = Build-Assets

ifeq ($(OS),Windows_NT)
LIBS := $(LIBS) -lws2_32
D_BIN := $(D_BIN)/mingw
endif

D_H = ../../source/ev3
CFLAGS = $(addprefix -I, $(D_H)) -O2 -std=gnu99 -W -Wall -Wno-comment

ifeq ($(OS),Windows_NT)
CC = gcc
else
CC = arm-linux-gnueabi-gcc
endif

ifeq ($(OS),Windows_NT)
E_BIN = .exe
else
E_BIN =
endif

F_BIN = $(TARGET)$(E_BIN)

OBJECTS = $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard *.c))) $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard Controllers/*.c)))

.PHONY: default all clean

default: $(F_BIN)
all: default

$(OBJECTS): $(D_BIN)/%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

.PRECIOUS: $(F_BIN) $(OBJECTS)

$(F_BIN): $(OBJECTS)
    $(info    VAR is $@)
    $(CC) $(OBJECTS) -Wall $(LIBS) -o $@

clean:
    -rm -f $(D_BIN)/*.o
    -rm -f $(F_BIN)

Это также дает выходному файлу имя главной папки (хотя я не понимаю, где он это делает?).

При связывании это приводит к ошибке «несколько основных» (у меня нет устройства ARM под рукой, поэтому я не могу предоставить полную ошибку).

Это иерархия папок, так что, надеюсь, я смогу решить все ваши сомнения ..

# Main folder (This is the name that the compiled exe has) 
## Controllers
-- .c & .h files
-- Makefile
## Build-Assets
-- all .o go here to clean up the folders
- Makefile (The one I call)
- main.c (this needs to be compiled with the .o in build-assets, name can be either main or main folder)
- gcheck.c (this needs to be compiled with only the LIBS, name of executable should be filename) 
- ... other .c files, same as gcheck.c 

1 Ответ

0 голосов
/ 02 февраля 2019

Относительно того, «откуда происходит имя цели как имя каталога», оно здесь:

TARGET = $(notdir $(shell pwd))

При этом запускается команда оболочки pwd, чтобы получить полный путь к текущему каталогу, затемиспользует notdir для удаления родительского каталога.Тогда правило для связывания исполняемого файла использует это:

F_BIN = $(TARGET)$(E_BIN)
  ...
$(F_BIN): $(OBJECTS)

Относительно того, почему вы получаете несколько основных ошибок, это потому, что вы добавили новый файл .c с новым main в тот же каталог, а неmake-файл, перечисляющий определенный набор исходных файлов для компиляции и компоновки, он использует wildcard для захвата всех исходных файлов:

OBJECTS = $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard *.c))) $(addprefix $(D_BIN)/, $(patsubst %.c, %.o, $(wildcard Controllers/*.c)))

Эти функции $(wildcard *.c) будут расширены для всех*.c файлы в этих каталогах, включая любые новые, которые вы добавили.Затем они все будут связаны с целью, что даст вам два разных объектных файла, содержащих main.

. Вам нужно будет изменить это, чтобы перечислять только те файлы, которые вы хотите, или поместить ваши файлы в другое место,или удалите ваши файлы из списка, используя функцию make filter-out, или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...