Клонировать репозиторий с переключением на свою ветку:
git clone --recursive -b cv ssh://git@sigrand.ru/sigticam.git
Cloning into 'sigticam'...
remote: Counting objects: 17261, done.
remote: Compressing objects: 100% (4614/4614), done.
remote: Total 17261 (delta 12314), reused 17158 (delta 12244)
Receiving objects: 100% (17261/17261), 21.83 MiB | 8.86 MiB/s, done.
Resolving deltas: 100% (12314/12314), done.
Submodule 'common_xw' (ssh://git@sigrand.ru/common_xw.git) registered for path 'common_xw'
Submodule 'sigticam/platform/ti_dm368/appro' (ssh://git@sigrand.ru/appro.git) registered for path 'sigticam/platform/ti_dm368/appro'
Submodule 'sigticam/platform/ti_dm368/dvsdk' (ssh://git@sigrand.ru/dvsdk.git) registered for path 'sigticam/platform/ti_dm368/dvsdk'
Submodule 'sigticam/platform/ti_dm368/u-boot' (ssh://git@sigrand.ru/u-boot.git) registered for path 'sigticam/platform/ti_dm368/u-boot'
Submodule 'sigticam/src/libebb' (git://github.com/ry/libebb.git) registered for path 'sigticam/src/libebb'
Submodule 'xwmake' (ssh://git@sigrand.ru/xwmake.git) registered for path 'xwmake'
Cloning into 'common_xw'...
remote: Counting objects: 4776, done.
remote: Compressing objects: 100% (1627/1627), done.
remote: Total 4776 (delta 3102), reused 4776 (delta 3102)
Receiving objects: 100% (4776/4776), 1.14 MiB, done.
Resolving deltas: 100% (3102/3102), done.
Submodule path 'common_xw': checked out 'b0d05e916456bcfc40e2bfeb7704657337e6e483'
Cloning into 'sigticam/platform/ti_dm368/appro'...
remote: Counting objects: 12651, done.
remote: Compressing objects: 100% (5266/5266), done.
remote: Total 12651 (delta 7222), reused 12610 (delta 7198)
Receiving objects: 100% (12651/12651), 38.18 MiB | 11.17 MiB/s, done.
Resolving deltas: 100% (7222/7222), done.
Submodule path 'sigticam/platform/ti_dm368/appro': checked out 'e2188babbc528869c59699865176fa34bfd48eeb'
Cloning into 'sigticam/platform/ti_dm368/dvsdk'...
remote: Counting objects: 41108, done.
remote: Compressing objects: 100% (10147/10147), done.
remote: Total 41108 (delta 28225), reused 41108 (delta 28225)
Receiving objects: 100% (41108/41108), 244.05 MiB | 11.71 MiB/s, done.
Resolving deltas: 100% (28225/28225), done.
Submodule path 'sigticam/platform/ti_dm368/dvsdk': checked out '5448ff8cf4ad59d1f6cd4a174c1c9d40db553173'
Cloning into 'sigticam/platform/ti_dm368/u-boot'...
remote: Counting objects: 6597, done.
remote: Compressing objects: 100% (3197/3197), done.
remote: Total 6597 (delta 3334), reused 6597 (delta 3334)
Receiving objects: 100% (6597/6597), 10.20 MiB | 11.15 MiB/s, done.
Resolving deltas: 100% (3334/3334), done.
Submodule path 'sigticam/platform/ti_dm368/u-boot': checked out '9fa36da83f32c7a78e25752c0351d9604418b451'
Cloning into 'sigticam/src/libebb'...
remote: Counting objects: 531, done.
remote: Compressing objects: 100% (180/180), done.
remote: Total 531 (delta 351), reused 517 (delta 340)
Receiving objects: 100% (531/531), 190.81 KiB | 182 KiB/s, done.
Resolving deltas: 100% (351/351), done.
Submodule path 'sigticam/src/libebb': checked out 'af381bff8591675cd01e6d0d4e799d3185e9bef9'
Cloning into 'xwmake'...
remote: Counting objects: 1179, done.
remote: Compressing objects: 100% (419/419), done.
remote: Total 1179 (delta 743), reused 1172 (delta 740)
Receiving objects: 100% (1179/1179), 340.17 KiB, done.
Resolving deltas: 100% (743/743), done.
Submodule path 'xwmake': checked out 'b003012cbff954d40c766d4fd983abd3d1ef758a'
Перейти в полученный каталог:
cd sigticam
Временно перейти в субмодуль appro:
pushd sigticam/platform/ti_dm368/appro
~/sigticam/sigticam/platform/ti_dm368/appro ~/sigticam
Переключить на голову своей ветки:
git checkout -b cv origin/cv
Branch cv set up to track remote branch cv from origin.
Switched to a new branch 'cv'
Вернуться обратно:
popd
~/sigticam
mkdir -p ../src-depot
./xwmake/setup sigticam ../src-depot
mv b-sigticam b
. xwmake/ccache.sh
Примечание для не дружащих с UNIX: команда ”. xwmake/ccache.sh” это не выполнение скрипта “xwmake/ccache.sh”, а его вставка командой шелла “точка”. Между точкой и именем скрипта должно быть не менее одного пробела.
./b inst goal
Если сборка завершилась с ошибкой, возможно, что у вас слегка старая версия и в свежей версии эта проблема решена. Попробуйте обновить свою ветку, слив в неё главную ветку, как это описано в секции “Синхронизация работы с другими участниками проекта”.
./b save-all-files any
Оставив открытым текущее окно эмулятора терминала, в котором было проделано всё вышеприведённое, открыть новое окно терминала или вкладку того же терминала, если его программа это позволяет.
Перейти в каталог проекта и далее в субмодуль:
cd sigticam/sigticam/platform/ti_dm368/appro
Все действия над проектом выполнять в первом окне, а действия над субмодулем appro - во втором.
Запустить редактор текстов для программистов в отдельном окне.
В правильно настроенной среде X Window System фокус ввода перемещается вслед за курсором мыши безо всяких лишних кликов, как это и было изначально.
Если у вас не так (а у вас, скорее всего, не так) - горе вам! Вам будет ужасно неудобно работать в UNIX.
Над проектом работают несколько человек одновременно и все они каждый день вносят изменения в свои ветки.
Все изменения в ветках разработчиков рано или поздно должны слится в главную ветку master, что и сформирует конечный продукт.
Для того, чтобы это слияние было успешным, слияния должны делаться как можно чаще, “мелкими порциями”.
Каждый разработчик обязан периодически сливать в свою ветку изменения из веток других разработчиков, прежде всего из ветки master.
Чтобы понять, когда есть такие изменения, необходимо читать e-mail от “git version control” <git@sigrand.ru> хотя бы один раз в сутки. При необходимости, создать фильтр, чтобы эти сообщения не попадали в спам.
Как только приходит такое сообщение (ну или хотя бы один раз в сутки), необходимо обновить свой местный репозиторий:
git fetch
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 3), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From ssh://sigrand.ru/sigticam
876fe8f..7d49c96 master -> origin/master
и выполнить слияние:
git merge origin/master
Updating 876fe8f..7d49c96
Fast-forward
sigticam/defs.mk | 1 +
1 file changed, 1 insertion(+)
и обновить субмодули:
git submodule update --init
Submodule path 'common_xw': checked out 'c2041b0562409e94653feec197e3a4b3fb233d3e'
Submodule path 'xwmake': checked out 'a5f13f5f2fb939363709ba01288d4bfeab4df0d1'
Для субмодуля appro так же следует выполнить слияние во втором окне:
git merge origin/devel_dm368
Обратите внимание, что основная рабочая ветка для субмодуля appro не master, а devel_dm368.
После выполнения слияния, необходимо обновить свои ветки в центральном репозитории:
git push
Total 0 (delta 0), reused 0 (delta 0)
To ssh://git@sigrand.ru/sigticam.git
876fe8f..7d49c96 cv -> cv
как для основного репозитория, так и для субмодуля.
При выполнении сляиния могут возникнуть конфликты. В этом случае слияния не происходит, а конфликты помечаются в файлах особыми маркерами.
From ssh://sigrand.ru/sigticam
876fe8f..7d49c96 master -> origin/master
Auto-merging filename.c
CONFLICT (content): Merge conflict in filename.c
Automatic merge failed; fix conflicts and then commit the result.
Для решения конфликов нужно открыть текстовым редактором эти файлы, найти там маркеры <<< и >>> :
<<<<<<<
changes made on my branch
|||||||
the common ancestor version
=======
changes made on the branch i'm merging
>>>>>>>
и решить, какая из секций конфликта правильна, удалив другую секцию и маркеры.
Таких конфликтов с маркерами в каждом файле может быть множество, не пропустите их!
Конфликтные файлы будут видны в выдаче команды “git status” как “both modified”.
Для закрепления решения конфликта необходимо добавть их:
git add filename.c
После решения конфиктов во всех конфликтных файлах, делайте commit:
git commit
не забыв правильно откомментировать слияние и решение конфликтов в редакторе commit.
Сердцем системы сборки, кроме её двигателя, являются пакеты.
Только пакеты управляют процессом сборки исходных текстов, назначая для этого свой Makefile.
В субмодуле appro, техасская система Makefile’ов и MAKEFILE.MK не используется вообще никак и любое их изменение является совершенно бесполезным занятием.
Все действия над пакетами выполняются так:
./b ЦЕЛЬ ПАКЕТ [ПАКЕТ ...]
См. список целей (стадий сборки) пакета.
Для начала читать Вязка исходников.
Простые пакеты обычно ссылаются на архивы исходных текстов на сайтах интернет. Именно на такие пакеты и была изначально ориентирована система сборки. Такие пакеты подвергаются сначала скачиванию, а потом извлечению исходных текстов из архива. После чего на них, как правило, налагают заплаты.
Поскольку заплаты иногда специфичны для каждой платформы, заплаты налагаются на вязаной копии исходного дерева (см. Вязка исходников ) в каталоге платформы. Уже на этом этапе исходные тексты помечаются только для чтения и имеют более одной ссылки на каждый файл.
Затем патченое дерево ещё раз вяжется в каталог сборки, уникальный не только по платформе, как патчи, но и по версиям компонентов toolchain и ядра.
И только на этом этапе в каталоге сборки разработчику предлагается вносить свои изменения.
Для внесения изменений в выбранный файл нужно не столько дать себе права записи, сколько отвязать от исходного файла так, чтобы изменения, проверяемые для данной платформы и хэша версий компонентов toolchain, не повлияли на сборку для других платформ и версий toolchain.
Отвязка файла делается скриптом
./xwmake/script/relink-file [-o] file [file ...]
Лично я держу этот скрипт ещё и в своём домашнем пути, так что у меня он вызывается просто по имени “relink-file”.
Ключ -o ещё и оставляет файл с расширением ”.orig”.
Отвязав таким образом файл, его можно отредактировать текстовом редактором.
Затем можно сделать сборку пакета (build) или пересборку (rebuild), если это не в первый раз.
./b rebuild ПАКЕТ
Если при сборке произошла ошибка, последние 20 строк будут выведены на стандартный поток ошибок.
Однако часто этого недостаточно, потому что ошибка находится выше по журналу.
Посмотреть журнал сборки пакета удобно командой
./b build-log ПАКЕТ
при этом для просмотра используется текущий $PAGER. А если переменная среды PAGER не установлена, то журнал просто вываливается на стандартный вывод.
Затем хорошо известный цикл редактирование -> сборка -> установка -> проверка работы.
После удволетворения итогом, необходимо закрепить изменения. Поскольку исходные тексты находятся не в нашем ведении, сделать это можно только добавив к пакету патч - вывод команды diff:
diff -uwpb var_ПРОЕКТ/bld/last/ПАКЕТ/file.c.orig \
var_ПРОЕКТ/bld/last/ПАКЕТ/file.c \
> ПРОЕКТ/pkg/ПАКЕТ/что-исправили.patch
Затем добавить этот файл патча в список патчей пакета, проверить через repatch пакета, что новый патч подхватывается пакетом на стадии patch и добавить эти изменения (файл патча и изменения в файле пакета с добавлением файла патча) в свой репозиторий:
git add ПРОЕКТ/pkg/ПАКЕТ/что-исправили.patch
git add ПРОЕКТ/pkg/ПАКЕТ/ПАКЕТ.make
git commit
Некоторые пакеты не имеют в сети интернет доступных архивов исходных текстов. Таковы исходные тексты от Appro, так что их приходится включать в проект непосредственно, а не по ссылке, как простые пакеты. Это влечёт за собой резкое увеличение размера репозитория и другие недостатки. Однако есть и преимущество: поскольку мы держим эти исходники у себя в репозитории (в субмодулях), их можно редактировать непосредственно, фиксируя изменения в наших репозиториях, а не возясь с добавлением патчей на каждое мелкое изменение.
Разумеется, с непосредственно включёнными пакетами можно поступать так же, как и с простыми, но тогда эту секцию можно опустить.
Сборка непосредственных пакетов происходит аналогично простым пакетам, но для укладывания в стадии сборки простых пакетов с целью неусложнения системы сборки, исходные тексты непосредственно включённых пакетов вяжутся ещё дважды: на стадии fetch пакет вяжется из исходного места в каталог загрузки var_ПРОЕКТ/dl/ПАКЕТ и на стадии extract пакет вяжется в каталог для извлечённых архивов var_ПРОЕКТ/src/origin/ПАКЕТ, после чего всё происходит в точности как и с простыми пакетами.
Вследствии всего этого, после вязки такого исходника в каталог сборки число связей большинства файлов достигает 9:
ls -la var_sigticam/bld/last/ipnc-av-server-common/
-r--r--r-- 9 df df 0 Май 15 17:07 .link-count
Способом вносить изменения в эти исходные тексты является цикл:
./b unfetchlog ПАКЕТ
редактируем файл на его исходном месте
./b build ПАКЕТ
Приммечание: цель unfetchlog является комбинацией unfetch и unlog, чтобы журнал предыдущих попыток сборки не мешал смотреть на текущую.
Отредактированный таком образом исходный текст просто фиксируем в репозитори:
git add av_capture/framework/drv/usermod/src/drv_pwm.c
git commit
git push # не забываем
Фиксируем изменения в субмодуле в основном репозитории из окна основного репозитория:
git commit sigticam/platform/ti_dm368/appro
git push # не забываем
Сложность, тяжесть и неудобства внесения изменений будет облегчена в ближайшее время для некоторого семейства пакетов, с которыми мы непосредственно работаем.