Добавил новую ветку, в которой проект преобразован в мультипроект.
Подробного описания пока нет, расскажу в двух словах. В общем проекте-оболочке появилась папка /machines, в которой лежат отдельные
самостоятельные проекты вируальных машин. Сейчас там лежат проекты: evgeny и intel64.
Для создания еще одной виртуальной машины нужно проделать следующие: положить в папку /machines правильно сформированный проект и
добавить в файл main.r две строчки. Вернее одну строчку, но два раза. Пример:
#вставка "keywords.h" #вставка "ru_stdio.h" #вставка <string.h> #вставка "ansicode.h" #вставка <unistd.h> #include <stdlib.h> #include <getopt.h> //Эту строчку нужно добавить для подключения еще одной виртуальной машины //#вставка "../machines/ваша_вирт_машина/.src/interface.h" #вставка "../machines/evgeny/.src/interface.h" #вставка "../machines/intel64/.src/interface.h" // Задачи проекта пуст справка(симв *имя_программы) { пчф("использование: %s --machine=<nameVM> <filename_byte_code>\n\t-h это сообщение\n\t-m nameVM имя виртуальной машины\n", имя_программы); пчф("\t--help это сообщение\n\t--machine=nameVM имя виртуальной машины\n"); пчф("пример:\n\t%s --machine=kumir moj_bait_kod.bytes\n", имя_программы); пчф("\t%s -m kumir moj_bait_kod.bytes\n", имя_программы); вернуть; } цел main(цел argc, симв** argv) { симв* имя_ВМ = NULL; симв* имя_файла = NULL; цел c; // Если запуск программы без аргументов если(argc == 1){ справка(argv[0]); вернуть(-1); } пока (1){ статич структура option long_opt[] = { {"help", 0, 0, 'h'}, {"machine", 1, 0, 'm'}, {0,0,0,0} }; цел индекс_опции; если((c = getopt_long(argc, argv, "m:h:?", long_opt, &индекс_опции)) == -1) прервать; выбор( c ){ вариант 'h': справка(argv[0]); вернуть(-1); вариант 'm': имя_ВМ = optarg; прервать; прочее: справка(argv[0]); вернуть(-1); } } имя_файла = argv[argc-1]; если(имя_ВМ == 0){ справка(argv[0]); вернуть(-1); } //Эту строчку нужно добавить для подключения еще одной виртуальной машины //#вставка "../machines/ваша_вирт_машина/.src/interface.h" #вставка "../machines/evgeny/.src/interface.h" #вставка "../machines/intel64/.src/interface.h" пчф("Виртуальная машина %s не найдена\n", имя_ВМ); вернуть(-1); }
Что значит правильно сформированный проект?
1. Нельзя изменять структуру папок проекта, так как проект-оболочка будет искать объектные и заголовочные файлы на определенных местах.
2. Основная магия сшивки в общий проект находится в файле interface.rh
В нем находятся три макроса, которые должны иметь уникальные имена. Кроме того часть файла interface.rh вставляется в фунцию main всего проекта,
а значит, что все используемые фунции должны иметь уникальные имена.
3. Все функции, не объявленные, как статические, должны иметь уникальные имена. Все макросы, которые через цепочку включения попадут в файл
main.r проекта-оболочки, тоже должны иметь уникальные имена.
Каждый локальный проект можно запустить на исполнение по отдельности, из папки этого проекта, или из корневой папки мультипроекта запустить программу-оболочку
с определенными ключами командной строки. Пример:
sk -m evgeny byte_code.byte sk --machine=evgeny byte_code.byte sk -h
При запуске без ключей выводится краткое справочное сообщение.
Из-за возможного конфликта имен считаю этот вариант не очень удачным. Будем считать это временной экспериментальной веткой проекта.
Отредактировано Евгений (2023-03-13 19:21:53)