|
2762 | 2762 | «рантайм заголовок»: строка |
2763 | 2763 | «рантайм исходник»: строка |
2764 | 2764 | «исходник прогонщика»: строка |
| 2765 | + «оболочка»: признак |
| 2766 | + «исходник оболочки»: строка |
2765 | 2767 |
|
2766 | 2768 | объект «Итог печати» |
2767 | 2769 | «файлы»: список «Файл» |
|
3180 | 3182 | соединить [(«Без перевода в конце» от «шапка»), "\n\n", («Склеить тела» от «тела»), "\n"] по "" |
3181 | 3183 |
|
3182 | 3184 | тотальная функция «Печать Makefile» |
3183 | | - принимает «файл»: строка, «прогонщик»: признак |
| 3185 | + принимает «файл»: строка, «прогонщик»: признак, «оболочка»: признак |
3184 | 3186 | возвращает строка |
3185 | 3187 | пусть «цель» равно (если «прогонщик» то " flang_cli" иначе "") |
3186 | | - пусть «правило» равно (если «прогонщик» то (соединить ["\nflang_cli: flang_cli.o $(OBJECTS)\n\t$(CC) $(CFLAGS) -o $@ flang_cli.o $(OBJECTS) $(LDLIBS)\n"] по "") иначе "") |
3187 | | - соединить ["# Сгенерировано flang (бэкенд C). Флаги здесь — часть контракта бэкенда:\n", "# сгенерированный код обязан собираться без единого предупреждения.\n", "CC ?= cc\n", "CFLAGS ?= -std=c99 -Wall -Wextra -Werror -pedantic -O2\n", "LDLIBS ?= -lm\n", "\n", "OBJECTS = flang_runtime.o ", «файл», ".o\n", "\n", "all: lib", «файл», ".a", «цель», "\n", "\n", "lib", «файл», ".a: $(OBJECTS)\n", "\tar rcs $@ $(OBJECTS)\n", «правило», "\n", "clean:\n", "\trm -f $(OBJECTS) flang_cli.o flang_cli lib", «файл», ".a\n", "\n", ".PHONY: all clean\n"] по "" |
| 3188 | + пусть «объект оболочки» равно (если «оболочка» то " flang_repl.o" иначе "") |
| 3189 | + пусть «правило» равно (если «прогонщик» то (соединить ["\nflang_cli: flang_cli.o", «объект оболочки», " $(OBJECTS)\n\t$(CC) $(CFLAGS) -o $@ flang_cli.o", «объект оболочки», " $(OBJECTS) $(LDLIBS)\n"] по "") иначе "") |
| 3190 | + соединить ["# Сгенерировано flang (бэкенд C). Флаги здесь — часть контракта бэкенда:\n", "# сгенерированный код обязан собираться без единого предупреждения.\n", "CC ?= cc\n", "CFLAGS ?= -std=c99 -Wall -Wextra -Werror -pedantic -O2\n", "LDLIBS ?= -lm\n", "\n", "OBJECTS = flang_runtime.o ", «файл», ".o\n", "\n", "all: lib", «файл», ".a", «цель», "\n", "\n", "lib", «файл», ".a: $(OBJECTS)\n", "\tar rcs $@ $(OBJECTS)\n", «правило», "\n", "clean:\n", "\trm -f $(OBJECTS) flang_cli.o", «объект оболочки», " flang_cli lib", «файл», ".a\n", "\n", ".PHONY: all clean\n"] по "" |
3188 | 3191 |
|
3189 | 3192 | // ═══════════════════════════ печать программы ═══════════════════════════ |
3190 | 3193 |
|
|
3316 | 3319 | пусть «файлы рантайма» равно [(запись «Файл» с «путь» равным "flang_runtime.h" и «содержимое» равным «заголовок рантайма»), (запись «Файл» с «путь» равным "flang_runtime.c" и «содержимое» равным «исходник рантайма»)] |
3317 | 3320 | пусть «файлы модуля» равно [(запись «Файл» с «путь» равным (соединить «файл» с ".h") и «содержимое» равным («Заголовок модуля» от «файл» и «есть модуль» и «модуль» и «общее»)), (запись «Файл» с «путь» равным (соединить «файл» с ".c") и «содержимое» равным («Исходник модуля» от «файл» и «есть модуль» и «модуль» и «общее» и «состояние» и («тела».«части»)))] |
3318 | 3321 | пусть «с модулем» равно («Слить файлы» от «файлы рантайма» и «файлы модуля») |
| 3322 | + // Оболочка живёт только рядом с прогонщиком: звать её больше неоткуда. |
| 3323 | + пусть «нужна оболочка» равно (если («настройки».«прогонщик») то («настройки».«оболочка») иначе нет) |
3319 | 3324 | пусть «с прогонщиком» равно (если («настройки».«прогонщик») то («Слить файлы» от «с модулем» и [(«Файл прогонщика» от «есть модуль» и «модуль» и «общее» и «настройки»)]) иначе «с модулем») |
3320 | | - пусть «все» равно (добавить (запись «Файл» с «путь» равным "Makefile" и «содержимое» равным («Печать Makefile» от «файл» и («настройки».«прогонщик»))) к «с прогонщиком») |
| 3325 | + пусть «с оболочкой» равно (если «нужна оболочка» то («Слить файлы» от «с прогонщиком» и [(«Файл оболочки» от «есть модуль» и «модуль» и «общее» и «настройки»)]) иначе «с прогонщиком») |
| 3326 | + пусть «все» равно (добавить (запись «Файл» с «путь» равным "Makefile" и «содержимое» равным («Печать Makefile» от «файл» и («настройки».«прогонщик») и «нужна оболочка»)) к «с оболочкой») |
3321 | 3327 | запись «Итог печати» с «файлы» равным «все» и «ошибка» равным («состояние».«ошибка») |
3322 | 3328 |
|
3323 | 3329 | тотальная функция «Слить файлы» |
|
3328 | 3334 | тотальная функция «Файл прогонщика» |
3329 | 3335 | принимает «есть модуль»: признак, «модуль»: строка, «общее»: «Общее», «настройки»: «Настройки» |
3330 | 3336 | возвращает «Файл» |
3331 | | - пусть «содержимое» равно (соединить [(«Шапка файла» от «есть модуль» и «модуль» и "прогонщик: JSON на входе, JSON на выходе"), "\n#define FL_PROGRAM_CALL ", («общее».«префикс»), "_call\n\n", («настройки».«исходник прогонщика»)] по "") |
| 3337 | + пусть «просьба» равно (если («настройки».«оболочка») то "#define FL_WITH_REPL 1\n" иначе "") |
| 3338 | + пусть «содержимое» равно (соединить [(«Шапка файла» от «есть модуль» и «модуль» и "прогонщик: JSON на входе, JSON на выходе"), "\n#define FL_PROGRAM_CALL ", («общее».«префикс»), "_call\n", «просьба», "\n", («настройки».«исходник прогонщика»)] по "") |
3332 | 3339 | запись «Файл» с «путь» равным "flang_cli.c" и «содержимое» равным «содержимое» |
3333 | 3340 |
|
| 3341 | +// Оболочка печатается рядом с прогонщиком, а не внутри него, и линкуется с ним |
| 3342 | +// в один бинарник. Порознь они потому, что обещания у них разные: прогонщик — |
| 3343 | +// переносимый C99, который ни от чего не зависит и ничего не спрашивает у мира; |
| 3344 | +// оболочка обязана спросить, где `cc` и где каталоги установки. И печатается |
| 3345 | +// она по просьбе: осмысленна она ровно у одной программы — у самого компилятора |
| 3346 | +// flang, потому что только у него есть точки входа, которые она зовёт. |
| 3347 | +тотальная функция «Файл оболочки» |
| 3348 | + принимает «есть модуль»: признак, «модуль»: строка, «общее»: «Общее», «настройки»: «Настройки» |
| 3349 | + возвращает «Файл» |
| 3350 | + пусть «содержимое» равно (соединить [(«Шапка файла» от «есть модуль» и «модуль» и "оболочка: «flang repl» для человека"), "\n#define FL_PROGRAM_CALL ", («общее».«префикс»), "_call\n\n", («настройки».«исходник оболочки»)] по "") |
| 3351 | + запись «Файл» с «путь» равным "flang_repl.c" и «содержимое» равным «содержимое» |
| 3352 | + |
3334 | 3353 | тотальная функция «Блок настроек» |
3335 | 3354 | принимает «настройки»: «Настройки», «общее»: «Общее» |
3336 | 3355 | возвращает строка |
|
0 commit comments