Добавил новую ветку, в которой проект преобразован в мультипроект.
Подробного описания пока нет, расскажу в двух словах. В общем проекте-оболочке появилась папка /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)