-
Notifications
You must be signed in to change notification settings - Fork 35
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Создание отдельного репозитория для релизов #9
Comments
Исходные тексты компилятора и утилит располагаются в папке src, исполнимые файлы располагаются в каталоге /bin, скомпилированные файлы библиотек — в каталоге /srlib, скомпилированные в C++ исходные тексты компилятора и утилит — в каталоге /build. Для обновления дистрибутива (подмодуль distrib) необходимо в подмодуле удалить папки /compiler, /lexgen, /srlib и /srmake, на их место скопировать папку /srlib и содержимое папки /build.
Задача выполнена почти полностью (см. сообщение коммита 567e5d5), осталось сделать следующий заявленный пункт:
Репозитории дистрибутива размещён по адресу https://github.com/Mazdaywik/simple-refal-distrib.git. В принципе, дистрибутив получился самостоятельным проектом, который можно использовать в качестве дистрибутива: склонировать без репозитория
В этом случае документация (та её часть, которая написана) частично потеряет актуальность. Кстати, в каталог дистрибутива нужно помещать копию документации. Соответственно, задачи:
|
Решена одна из ошибок проблемы «курицы или яйца». В процессе раскрутки нужно откомпилировать LibraryEx.sref, но доступен только «старый», стабильный компилятор. Если им компилировать библиотеку, то она в скомпилированном виде будет несовместима с текущей версией компилятора. Поэтому сначала компилятор собирается стабильной версией, потом компилируется библиотека, потом компилятор снова пересобирается собой.
|
* Перенесён в подкаталог examples/inifile пример с чтением INI-файлов. * Добавлен пример программы Hello, World.
Задача полностью выполнена. |
На первый взгляд самоприменимый компилятор порождает проблему курицы или яйца: как его собрать из исходных текстов, если для сборки исходных текстов требуется уже собранный компилятор. На самом деле, самоприменимый компилятор — это пара компиляторов: первый реализован на исходном языке, второй — на целевом языке. Причём с онтологической точки зрения второй не дублирует первый: в компиляторе на целевом языке может находиться знание, отсутствующее в компиляторе в исходных текстах. Пример. Говорят, что нигде в исходных текстах первого компилятора C Кернигана и Ричи нигде не было записано, что последовательности
\n
соответствует символ с кодом 10 — было записано, что она соответствует числовому значению, выраженному литерой'\n'
.Для Простого Рефала целевым языком является C++. Первый компилятор (на Простом Рефале) находится в каталоге
compiler
, второй — в каталогеbootstrap
(т. н. «стабильная версия»). Файлы в каталоге обновляются на каждой итерации сборки, но заносятся в репозиторий, когда его старая версия перестаёт быть совместимой либо с исходными текстами первого компилятора, либо с новой версией рантайма (refalrts
+Library.cpp
).При глубоких модификациях промежуточного представления такая организация исходного кода создаёт проблемы: хочется иметь старую старую версию компилятора + рантайма, когда текущая версия перестала работать. Следовательно, организацию исходного кода нужно изменять: как минимум завести пару папок для рантайма стабильной и рабочей версии.
Другая проблема состоит в том, что файлы в папке
bootstrap
обновляются при каждой пересборке компилятора. В результате затрудняется работа с системой контроля версий — файлы в папкеbootstrap
оказываются подсвеченными как изменённые. Засорять ими коммит не хочется, поскольку тогда дифф будет отражать не смысловые изменения (в файлах*.sref
), но ещё и артефакты сгенерированного кода (как правило, стабильную версию часто обновлять не требуется). Время от времени делаются коммиты с сообщением вида «Обновлена стабильная версия», в которую помещаются все кумулятивные изменения файлов папки bootstrap. Имело бы смысл иметь две папки «bootstrap»: в одну (bootstrap1) помещаются все текущие исходники и она не отслеживается в системе контроля версий, вторая (bootstrap2) отслеживается, но файлы в ней автоматически не обновляются. Время от времени пользователь вручную осуществляет копирование файлов из bootstrap1 в bootstrap2. Альтернатива: исходники на C++ в обычном режиме при перекомпиляции не обновляются в папке bootstrap, для их обновления нужно передавать специальную опцию скрипту сборки.В рамках текущей задачи предлагается сделать отдельный репозиторий на GitHub (например, с именем
simple-refal-bootstrap
илиsimple-refal-release
), в котором будет находиться:bootstrap
,LibraryEx.cpp
),srmake
иlexgen
, также в скомпилированном виде.Репозиторий будет подключаться как подмодуль в репозитории
simple-refal
. В последнем будет папкаbuild
, в которую будут помещаться скомпилированные исходники (либо одного компилятора, либо ещё и сопутствующих утилит), а также скрипт, копирующий исходники из этой папки в подмодуль.Вариант со слиянием в подпапку работать не будет, поскольку оно однонаправленно: если репозиторий FOO подключён как подмодуль в репозитории BAR, то, находять в подмодуле, можно как получать новые изменения из репозитория FOO, так и контрибьютить в него. Если в репозитории BAR имеется подпапка, в которую вливается репозиторий FOO, то возможно лишь обновление подпапки, контрибуция изменений в репозиторий FOO будет затруднена.
Создания нового репозитория не избежать: отдельную ветку текущего локального репозитория (находящегося в папке
.git
локальной копии) в подмодуль вынести нельзя, можно указать только путь до удалённого репозитория. И, если всё равно придётся указывать для подмодуля путь на удалённый репозиторий, то будет меньше путаницы, если использовать отдельный репозиторий, а не особую ветку основного.The text was updated successfully, but these errors were encountered: