ПО, ЭВМ и АСУ из Таможенного Союза

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » Проект "Виртуальные машины" » Установка Сказочной Колесницы в Gentoo


Установка Сказочной Колесницы в Gentoo

Сообщений 61 страница 80 из 80

61

Примерно такой подход и используется. Когда-то было потрачено много часов, чтобы заставить его работать, как надо.
Вложенные же Makefile удобы тем, что можно работать только с одним локальным проектом.

0

62

Лис написал(а):

может быть wildcard это не утилита командной строки, а какая-то встроенная команда то-ли bash, то-ли make?

Это команда make

Код:
MACHINES_OBJECTS = $(filter-out %main.o, $(wildcard $(MACHINES_DIR)*/bin/obj/*.o))
MACHINES_MAKEFILE := $(wildcard $(MACHINES_DIR)*)

0

63

Евгений написал(а):

такой подход и используется.

Точно? Где там в основном make-файле зависимость основных .c от .h-файлов во вложенных проектах?

Я не вижу:
https://tvoygit.ru/stein47/russian-virt … le.am#L200

Отредактировано Лис (2023-03-14 00:02:50)

0

64

Лис написал(а):

Где там в основном make-файле зависимость основных .c от .h-файлов во вложенных проектах?

Именно этого нет.

0

65

Евгений написал(а):

Именно этого нет.

Наверное надо дописать?

А всякие опции типа -j1 и установку переменной CC=
стереть...

0

66

Лис написал(а):

OBJS := $(foreach dir , $(SUBDIRS), $(wildcard $(dir)*.o))

А вот это работать не будет потому, что объектных файлов еще нет. На момент запуска есть только *.r файлы.
Но тут хотя бы одному r-файлу соответствует один о-файл. А как сделать зависимость от rh-файла? Чтобы узнать, что данный о-файл зависит еще от трех заголовочных, нужно или вручную это прописывать
или парсить текст.
Короче, есть над чем подумать...

Отредактировано Евгений (2023-03-14 00:10:59)

0

67

Евгений написал(а):

работать не будет потому, что ... файлов еще нет. На момент запуска

Значит надо прописать зависимость сразу от цели по сборке всех дочерних подпроектов.

Евгений написал(а):

Короче, есть над чем подумать..

Нет. Надо определить .PHONE цель
и в сборку .o-файлов добавить её как одну из зависимостей.

Тогда перед любой компиляцией любого .c файла из основного проекта сначала будут выполняться вызовы команды make для всех подпроектов.

то есть, вместо строки 200
$(OBJDIR)%.o : $(SRCDIR)%.c

написать
$(OBJDIR)%.o : subsystem $(SRCDIR)%.c

Отредактировано Лис (2023-03-14 00:50:04)

0

68

Лис написал(а):

то есть, вместо строки 200
$(OBJDIR)%.o : $(SRCDIR)%.c

написать
$(OBJDIR)%.o : subsystem $(SRCDIR)%.c

Будет ошибка выполнения, так как и правая и левая часть зависимости используется в команде компиляции. Но мысль уже появилась...

0

69

Евгений написал(а):

$(OBJDIR)%.o : subsystem $(SRCDIR)%.c

и правая и левая часть зависимости используется в команде компиляции. Но мысль уже появилась...

Неверно, что правая часть используется, если это был .PHONY target, как я предлагал. Мне так кажется, но проверять это я конечно не буду.

Отредактировано Лис (2023-03-14 09:01:33)

0

70

Я забыл спросить, а если перейти в папку вложенного проекта (evgeny)  и запустить make all, то сборка локального проекта проходит нормально или тоже падает?

0

71

Евгений написал(а):

Я забыл спросить, а если перейти в папку вложенного проекта (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

не падает.

0

72

Лис написал(а):

Откуда неуверенность такая. Мы же выяснили причину. Она в том, что не прописана зависимость основных .c-файлов от .h-файлов в поддиректориях.

Отсюда:

Код:
#Основная последовательность
build: $(TEMP_HDR)  $(TEMP_SRC)   $(OUT)

Теоретически вся последовательность справа может начать выполняться одновременно в нескольких потоках. И нет гарантии, что дерусификация пройдет раньше, чем начнется компиляция какого-нибудь .с-файла.

0

73

Евгений написал(а):

нет гарантии, что дерусификация пройдет раньше, чем начнется компиляция какого-нибудь .с-файла.

Если добавить .h-файлы в цель "$(OUT):",  где вызывается команда $(CC),
а не в цель "build:",
тогда .h-файлы будут собраны до вызова $(СС), потому что
до начала работы сниппета (внутри правила) должны уже существовать .h файлы.

Правило/цель сборки .h файлов обязательно будет выполнена раньше.
То есть до всех параллельных запусков сниппета.
Сниппет цели "$(OUT)" вообще не будет выполняться параллельно, потому что результат сборки/линковки - один файл.
Это будет единственный запуск.

Я думал, что цель "build:" занимается запуском компилятора, но это не так,
вместо этого она только копирует файлы и зависит от цели $(OUT).
Так что да, твоё опасение интересное, и может быть верным.

Можно создать цель по сборке заголовочных файлов,
и добавить её зависимостью в сборку .c-файлов.
Тогда все .h-файлы точно будут генерироваться раньше.
Но это не нужно, так как при дерусификации rc-файлов заголовочные файлы не используются.

Отредактировано Лис (2023-03-14 18:48:23)

0

74

На самом деле, как я понимаю, логика работы make, не совсем такая. Например: зависимость $(OUT), вовсе не означает, что в этот момент запустится сборка выходного файла. В этот момент начнется дальнейший спуск по цепочке зависимостей: выходной файл-> объектные файлы -> . с- файлы -> . r- файлы. А потом уже вновь вверх, но уже с вызовом команд, прописанных в зависимостях. Это, кстати, видно по листингу. Сначала . h- файлы, потом . с- файлы, а потом уже сборка.

0

75

Евгений написал(а):

не совсем такая

Я не увидел противоречий с написанным выше.

Ну да, make не запускает сниппет в тот же момент, как распарсит цель. Ну и что?

Зависимости из правой части всё равно будут отработаны раньше.

0

76

Обновил ветку. Пробуем вариант с .NOTPARALLEL. Если я правильно понимаю логику, то сначала должна отработать subsystem, а потом уже build.

Код:
all: begin subsystem build  

.NOTPARALLEL: all
.PHONY: all build clean reserve run test subsystem

У меня работает, правда всего на двух потоках. Но все же.

Отредактировано Евгений (2023-03-14 19:40:28)

0

77

Сделай, пожалуйста, в веб-интерфейсе репозитория на 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

0

78

Евгений написал(а):

У меня работает

Да, у меня тоже работает.

Что ты собираешься делать дальше?

Отредактировано Лис (2023-03-14 19:53:42)

0

79

Лис написал(а):

Сделай, пожалуйста, в веб-интерфейсе репозитория на tvoygit.ru ветку "devel-mult" веткой по-умолчанию.

Сделано.

Лис написал(а):

Было бы вообще идеально, если бы ты сразу писал SHA1 коммита.

Учту.  https://tvoygit.ru/stein47/russian-virt … d1c1ecb1e8

0

80

Спасибо.

0


Вы здесь » ПО, ЭВМ и АСУ из Таможенного Союза » Проект "Виртуальные машины" » Установка Сказочной Колесницы в Gentoo