Примерно такой подход и используется. Когда-то было потрачено много часов, чтобы заставить его работать, как надо.
Вложенные же Makefile удобы тем, что можно работать только с одним локальным проектом.
Установка Сказочной Колесницы в Gentoo
Сообщений 61 страница 80 из 80
Поделиться612023-03-13 23:52:45
Поделиться622023-03-13 23:54:48
может быть wildcard это не утилита командной строки, а какая-то встроенная команда то-ли bash, то-ли make?
Это команда make
MACHINES_OBJECTS = $(filter-out %main.o, $(wildcard $(MACHINES_DIR)*/bin/obj/*.o)) MACHINES_MAKEFILE := $(wildcard $(MACHINES_DIR)*)
Поделиться632023-03-13 23:56:57
такой подход и используется.
Точно? Где там в основном make-файле зависимость основных .c от .h-файлов во вложенных проектах?
Я не вижу:
https://tvoygit.ru/stein47/russian-virt … le.am#L200
Отредактировано Лис (2023-03-14 00:02:50)
Поделиться642023-03-14 00:03:29
Где там в основном make-файле зависимость основных .c от .h-файлов во вложенных проектах?
Именно этого нет.
Поделиться652023-03-14 00:06:47
Именно этого нет.
Наверное надо дописать?
А всякие опции типа -j1 и установку переменной CC=
стереть...
Поделиться662023-03-14 00:09:05
OBJS := $(foreach dir , $(SUBDIRS), $(wildcard $(dir)*.o))
А вот это работать не будет потому, что объектных файлов еще нет. На момент запуска есть только *.r файлы.
Но тут хотя бы одному r-файлу соответствует один о-файл. А как сделать зависимость от rh-файла? Чтобы узнать, что данный о-файл зависит еще от трех заголовочных, нужно или вручную это прописывать
или парсить текст.
Короче, есть над чем подумать...
Отредактировано Евгений (2023-03-14 00:10:59)
Поделиться672023-03-14 00:10:22
работать не будет потому, что ... файлов еще нет. На момент запуска
Значит надо прописать зависимость сразу от цели по сборке всех дочерних подпроектов.
Короче, есть над чем подумать..
Нет. Надо определить .PHONE цель
и в сборку .o-файлов добавить её как одну из зависимостей.
Тогда перед любой компиляцией любого .c файла из основного проекта сначала будут выполняться вызовы команды make для всех подпроектов.
то есть, вместо строки 200
$(OBJDIR)%.o : $(SRCDIR)%.c
написать
$(OBJDIR)%.o : subsystem $(SRCDIR)%.c
Отредактировано Лис (2023-03-14 00:50:04)
Поделиться682023-03-14 07:09:38
то есть, вместо строки 200
$(OBJDIR)%.o : $(SRCDIR)%.cнаписать
$(OBJDIR)%.o : subsystem $(SRCDIR)%.c
Будет ошибка выполнения, так как и правая и левая часть зависимости используется в команде компиляции. Но мысль уже появилась...
Поделиться692023-03-14 07:54:05
$(OBJDIR)%.o : subsystem $(SRCDIR)%.c
и правая и левая часть зависимости используется в команде компиляции. Но мысль уже появилась...
Неверно, что правая часть используется, если это был .PHONY target, как я предлагал. Мне так кажется, но проверять это я конечно не буду.
Отредактировано Лис (2023-03-14 09:01:33)
Поделиться702023-03-14 10:10:56
Я забыл спросить, а если перейти в папку вложенного проекта (evgeny) и запустить make all, то сборка локального проекта проходит нормально или тоже падает?
Поделиться712023-03-14 15:25:07
Я забыл спросить, а если перейти в папку вложенного проекта (evgeny) и запустить make all, то сборка локального проекта проходит нормально или тоже падает?
Откуда неуверенность такая. Мы же выяснили причину. Она в том, что не прописана зависимость основных .c-файлов от .h-файлов в поддиректориях.
Но я проверил:
machines/intel64 # make -j4 all -------- Начало --------- Русский в C/C++: sed '1s/^/#line 1 "src_rus\/ansicode.rh"\n/' src_rus/ansicode.rh | sed -f ru-to-c > .src/ansicode.h Русский в C/C++: sed '1s/^/#line 1 "src_rus\/debug.rh"\n/' src_rus/debug.rh | sed -f ru-to-c > .src/debug.h Русский в C/C++: sed '1s/^/#line 1 "src_rus\/interface.rh"\n/' src_rus/interface.rh | sed -f ru-to-c > .src/interface.h Русский в C/C++: sed '1s/^/#line 1 "src_rus\/opcode.rh"\n/' src_rus/opcode.rh | sed -f ru-to-c > .src/opcode.h Русский в C/C++: sed '1s/^/#line 1 "src_rus\/vm.rh"\n/' src_rus/vm.rh | sed -f ru-to-c > .src/vm.h Русский в C/C++: sed '1s/^/#line 1 "src_rus\/vm_core.rh"\n/' src_rus/vm_core.rh | sed -f ru-to-c > .src/vm_core.h Русский в C/C++: sed '1s/^/#line 1 "src_rus\/main.r"\n/' src_rus/main.r | sed -f ru-to-c > .src/main.c Русский в C/C++: sed '1s/^/#line 1 "src_rus\/vm.r"\n/' src_rus/vm.r | sed -f ru-to-c > .src/vm.c Компиляция C/C++: .src/vm.c Компиляция C/C++: .src/main.c gcc -c -Os -Wall -MD -MF bin/.dep/vm.o.d -I./include -o bin/obj/vm.o .src/vm.c gcc -c -Os -Wall -MD -MF bin/.dep/main.o.d -I./include -o bin/obj/main.o .src/main.c src_rus/main.r: В функции «main»: src_rus/main.r:23:7: предупреждение: переменная «имя_файла» определена, но не используется [-Wunused-but-set-variable] 23 | симв* имя_файла = NULL; | ^~~~~~~~~ Сборка: proba gcc -o proba bin/obj/main.o bin/obj/vm.o
не падает.
Поделиться722023-03-14 17:03:16
Откуда неуверенность такая. Мы же выяснили причину. Она в том, что не прописана зависимость основных .c-файлов от .h-файлов в поддиректориях.
Отсюда:
#Основная последовательность build: $(TEMP_HDR) $(TEMP_SRC) $(OUT)
Теоретически вся последовательность справа может начать выполняться одновременно в нескольких потоках. И нет гарантии, что дерусификация пройдет раньше, чем начнется компиляция какого-нибудь .с-файла.
Поделиться732023-03-14 17:07:30
нет гарантии, что дерусификация пройдет раньше, чем начнется компиляция какого-нибудь .с-файла.
Если добавить .h-файлы в цель "$(OUT):", где вызывается команда $(CC),
а не в цель "build:",
тогда .h-файлы будут собраны до вызова $(СС), потому что
до начала работы сниппета (внутри правила) должны уже существовать .h файлы.
Правило/цель сборки .h файлов обязательно будет выполнена раньше.
То есть до всех параллельных запусков сниппета.
Сниппет цели "$(OUT)" вообще не будет выполняться параллельно, потому что результат сборки/линковки - один файл.
Это будет единственный запуск.
Я думал, что цель "build:" занимается запуском компилятора, но это не так,
вместо этого она только копирует файлы и зависит от цели $(OUT).
Так что да, твоё опасение интересное, и может быть верным.
Можно создать цель по сборке заголовочных файлов,
и добавить её зависимостью в сборку .c-файлов.
Тогда все .h-файлы точно будут генерироваться раньше.
Но это не нужно, так как при дерусификации rc-файлов заголовочные файлы не используются.
Отредактировано Лис (2023-03-14 18:48:23)
Поделиться742023-03-14 19:06:35
На самом деле, как я понимаю, логика работы make, не совсем такая. Например: зависимость $(OUT), вовсе не означает, что в этот момент запустится сборка выходного файла. В этот момент начнется дальнейший спуск по цепочке зависимостей: выходной файл-> объектные файлы -> . с- файлы -> . r- файлы. А потом уже вновь вверх, но уже с вызовом команд, прописанных в зависимостях. Это, кстати, видно по листингу. Сначала . h- файлы, потом . с- файлы, а потом уже сборка.
Поделиться752023-03-14 19:17:07
не совсем такая
Я не увидел противоречий с написанным выше.
Ну да, make не запускает сниппет в тот же момент, как распарсит цель. Ну и что?
Зависимости из правой части всё равно будут отработаны раньше.
Поделиться762023-03-14 19:34:12
Обновил ветку. Пробуем вариант с .NOTPARALLEL. Если я правильно понимаю логику, то сначала должна отработать subsystem, а потом уже build.
all: begin subsystem build .NOTPARALLEL: all .PHONY: all build clean reserve run test subsystem
У меня работает, правда всего на двух потоках. Но все же.
Отредактировано Евгений (2023-03-14 19:40:28)
Поделиться772023-03-14 19:50:27
Сделай, пожалуйста, в веб-интерфейсе репозитория на tvoygit.ru ветку "devel-mult" веткой по-умолчанию.
Было бы вообще идеально, если бы ты сразу писал SHA1 коммита. Тогда я бы его сразу копировал из сообщения на форуме,
а не лез бы сначала на форум, чтобы посмотреть URL репозитория, затем в репозиторий, чтобы выбрать ветку и скопировать его оттуда.
И на форуме было понятно в будущем, про что идёт речь. Это сейчас коммит последний, а позже станет непонятно, какой был.
Коммит 91fc7dfa63764b763b7690fa50b570d1c1ecb1e8
собирается:
>>> Merging app-emulation/sk-1.0.0 to /
--- /usr/
--- /usr/share/
--- /usr/share/doc/
--- /usr/share/doc/sk-1.0.0/
>>> /usr/share/doc/sk-1.0.0/AUTHORS
--- /usr/lib/
--- /usr/lib/debug/
--- /usr/lib/debug/usr/
--- /usr/lib/debug/usr/bin/
>>> /usr/lib/debug/usr/bin/sk.debug
--- /usr/bin/
>>> /usr/bin/sk
Поделиться782023-03-14 19:51:49
У меня работает
Да, у меня тоже работает.
Что ты собираешься делать дальше?
Отредактировано Лис (2023-03-14 19:53:42)
Поделиться792023-03-14 20:16:39
Сделай, пожалуйста, в веб-интерфейсе репозитория на tvoygit.ru ветку "devel-mult" веткой по-умолчанию.
Сделано.
Было бы вообще идеально, если бы ты сразу писал SHA1 коммита.
Поделиться802023-03-14 20:23:02
Спасибо.