Makefile_woes в нескольких каталогах - PullRequest
0 голосов
/ 26 марта 2020

Я воскрешаю проект (Z80 sim с GTK GUI - GPL) и переставляю источник. Проблема в том, что мои навыки создания слабые, и у меня проблемы даже с онлайн-документами. Кто-нибудь может дать мне несколько указателей?

Каталог выглядит так:

obj    src    z80
 |      |      |
 ------------------- z80sim.glade z80sim Makefile main.c

Где sr c для GUI sr c, z80 для симулятора sr c и obj содержит все объектные файлы. С Makefile я хочу, чтобы он скомпилировал все файлы C и .h в sr c и z80, поместив все файлы .o в obj. Затем, чтобы скомпилировать main. c, свяжите его со всеми файлами .o и поместите исполняемый файл в z80sim.

Я сделал удар в Makefile, так что вы можете посмеяться:

z80_srcs = disas.c  iosim.c  sim0.c  sim1.c  sim2.c  sim3.c  sim4.c  sim5.c  sim6.c  sim7.c  simctl.c  simfun.c  simglb.c  simglb.h  sim.h  simint.c
z80_objs = disas.o  iosim.o  sim0.o  sim1.o  sim2.o  sim3.o  sim4.o  sim5.o  sim6.o  sim7.o  simctl.o  simfun.o  simglb.o  simint.o
z80_dir = ./z80

VPATH = $(z80_dir)

EXE = z80sim

all:    $(EXE)

$(EXE): $(z80_objs)
        gcc -o z80em main.c -Wall `pkg-config --cflags --libs gtk+-3.0` -export-dynamic

clean:
        rm -f $(EXE) *.o $(z80_dir)/*.o

$(z80_objs): $(z80_srcs)

        gcc -c -Wall $^

Что совсем не порезается!

Буду очень признателен за любую помощь.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Благодаря чрезвычайно полезному совету от Beta (и GM), я думаю, что он сломан. Вот новый Makefile:

z80_srcs = disas.c iosim.c sim0.c sim1.c sim2.c sim3.c sim4.c sim5.c sim6.c sim7.c simctl.c simfun.c simglb.c simint.c
z80_hdrs = simglb.h sim.h 
gui_srcs = callbacks.c code.c guiglb.c  interface.c iosim.c memory.c support.c flags.c interface.h log.c ports.c registers.c
gui_hdrs = prototypes.h callbacks.h guiglb.h interface.h support.h

z80_objs = $(patsubst %.c,obj/%.o,$(z80_srcs))
gui_objs = $(patsubst %.c,obj/%.o,$(gui_srcs))

EXE = z80sim

vpath %.c gui z80

obj/%.o: %.c
        gcc -c -Wall $< `pkg-config --cflags gtk+-3.0` -Igui -Iz80 -o $@

all: $(EXE)

$(EXE): $(z80_objs) $(gui_objs)
        gcc -o $@ main.c -Wall -Iz80 -Igui `pkg-config --cflags --libs gtk+-3.0` -export-dynamic $^

clean:
        rm -f $(EXE) *.o obj/*.o

Меня беспокоит только то, что заголовочные файлы не проверяются make. Должен ли я добавить% .h после%. c?

Тогда все, что мне нужно сделать, это привести в порядок код и перенести его с GTK2 на GTK3 (всхлип!)

0 голосов
/ 26 марта 2020

Я видел хуже. Давайте рассмотрим это немного за один раз.

z80_srcs = disas.c iosim.c sim0.c sim1.c sim2.c sim3.c sim4.c sim5.c sim6.c sim7.c simctl.c simfun.c simglb.c simglb.h sim.h simint.c

Как правило, не рекомендуется объединять исходные файлы и файлы заголовков. Давайте разделим их:

z80_srcs = disas.c iosim.c sim0.c sim1.c sim2.c sim3.c sim4.c sim5.c sim6.c sim7.c simctl.c simfun.c simglb.c simint.c
z80_hdrs = simglb.h sim.h

Я одобряю перечисление их в явном виде, но, как вы знаете, вы можете сделать Make fine их с помощью функции wildcard :

z80_srcs = $(wildcard src/*.c z80/*.c)

(Но они будут идти с прикрепленными путями, так что вам придется с этим справиться.) Также, как мимолетное примечание, имя z80_srcs неоднозначно, поскольку оно может ссылаться на источники в z80. Аналогично, имя src/ вводит в заблуждение, поскольку оно не содержит всех источников. Но я думаю, что знаю, что вы имеете в виду.

z80_objs = disas.o  iosim.o  ...

В этом нет необходимости. Используйте функцию patsubst :

z80_objs = $(patsubst %.c,%.o,$(z80_srcs))

Но disas.o iosim.o ... не так полезен, как obj/disas.o obj/iosim.o ..., поэтому давайте настроим строку:

z80_objs = $(patsubst %.c,obj/%.o,$(z80_srcs))

Теперь, чтобы построить объекты.

$(z80_objs): $(z80_srcs)
    gcc -c -Wall $^

Это работает, но не так, как вы думаете. Это одно правило, которое строит все объекты, независимо от того, устарели они или нет, за одну операцию. Эффективно, но грубо. И он не помещает объекты туда, куда вы хотите.

Давайте создадим один объектный файл из командной строки:

gcc -c -Wall disas.c

Это не сработает по нескольким причинам. , 1) Компилятор не может найти disas.c, 2) он также не может найти sim.h, что требуется disas.c, и 3) он попытается создать объектный файл в рабочем каталоге. Вот решение, и вам следует изучить и понять его, а не просто скопировать и вставить:

gcc -c -Wall src/disas.c -Isrc -o obj/disas.o

Итак, мы можем написать правило:

obj/disas.o: src/disas.c
    gcc -c -Wall src/disas.c -Isrc -o obj/disas.o

Этот ответ становится длинным так что я прыгну прямо к правилу шаблона. Еще раз призываю вас учиться и понимать, , а не попугай.

vpath %.c src z80

obj/%.o: %.c
    gcc -c -Wall $< -Isrc -o $@

И исполняемый файл:

obj/$(EXE): $(z80_objs)
    gcc -o $@ main.c -Wall `pkg-config --cflags --libs gtk+-3.0` -export-dynamic $^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...