LINUX.ORG.RU

Любителям CMake посвящается

 


1

4

Добрый вечер, граждане!

Есть одна проблема, но сначала вводная:
в наличии две совершенно идентичных виртуальных машины, с одной и той же ОС, установленной из одного и того же исошника. Для чистоты эксперимента, доступа к интернетам нет, обновляться не с чего. Всё, что можно поставить - на этом исошнике.

Так же, есть тарбол исходников некой программы на куте, система сборки CMake, будь она не ладна.

Распаковываем, на обоих машинах, собираем. Получаем две работоспособных программы. Считаем контрольные суммы - они различаются!

Экспериментально выяснено, что на разных виртуалках cmake генерит разный порядок сборки.

Так вот, вопрос как раз в этом: какого черта они различаются, и как это вылечить?

В конторе приемка софта происходит по вычислению контрольной суммы бинаря, пришедшего от разработчика и сравнению её с контрольной суммы бинаря, полученного проверяющим при пересборке.

Изменить процедуру приёмки не представляется возможным. Вдоль, бочку и бежать оттуда не предлагать ;)

Заранее благодарен за различные подсказки.

P.S.: есть другие компоненты со схожим набором (тоже куте, qml плагины), но сборочная среда - qmakе - вышеозвученной проблемы нет, так что, склонен подозревать cmake.

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 3)
Ответ на: комментарий от aol

А если на другой машине например выставить hostname, может IP, ... такие же как и на первой? Из-за чего-то ведь меняется содержимое бинарника?

There are often many swiches to enable/disable when trying to build a project that uses CMake.

How do you store the build settings made by some user to make a build reproduceable on another machine?

http://stackoverflow.com/questions/17588517/how-to-store-cmake-build-settings

sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 1)
Ответ на: комментарий от sdio

Тоже ковыряли - не в этом дело. СMake - говно, наверное самый правильный ответ, но он нас не спасает. Думаю, что marble из мейнстрима имеет те же самые проблемы.

SCAD
()
Ответ на: комментарий от SCAD

Лучше спросить в IRC'е #marble на freenode там авторы (Dennis Nienhüser, Torsten Rahn и Bernhard Beschow) тусуются постоянно.

Kosyak ★★★★
()
Ответ на: комментарий от EXL

Смотрели hexdiff-ом, readelf-ом такое ощущение что порядок линковки блоков внутри so файла разный. Вплоть до GNU_EH_FRAME offset.

SCAD
()
Ответ на: комментарий от anonymous

нет не нарушаем. Собираем с бранча: origin/sok-2012-plasma-active потому что не все наши коммиты прошли в upstream и нет времени добить эту тему

SCAD
()
Ответ на: комментарий от anonymous

Я уже писал, что mainstream marble наверняка имеет те же самые проблемы.

SCAD
()
Ответ на: комментарий от aol

Если интересно, это проект marble, который мы по неволе расширяем.

Странно, что для Marble вы используете очень старую версию CMake, этому есть обьективные причины? Marble ведь активно развивается сам по себе. А QMake вообще неинкрементальная система сборки, никогда ей не была и уже не будет, её потолок это сборка самой Qt с нуля.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Странно, что для Marble вы используете очень старую версию CMake

номера версий ПО продиктованы дистрибутивом, который мы используем.. весь производный софт должен собраться в изолированном окружении без сторонних пакетов.

aol ★★★★★
() автор топика
Ответ на: комментарий от Pavval

точно. грубо говоря, единственная разница - link.txt :)

aol ★★★★★
() автор топика
Ответ на: комментарий от EXL

кдешное говно отключается дефайном -DQTONLY=YES - именно так мы его и собираем..

aol ★★★★★
() автор топика

какого черта они различаются, и как это вылечить?

Аутист, что ли? А тебя не напрягает, что яйца на разной высоте висят? Срочно беги к хирургу, исправлять!

Считаем контрольные суммы - они различаются!

Они будут различаться даже при одинаковом порядке сборки.

А если ты еще и -jN для N > 1 будешь использовать, то никакого порядка вообще никто тебе никогда не гарантирует.

В конторе приемка софта происходит по вычислению контрольной суммы бинаря, пришедшего от разработчика и сравнению её с контрольной суммы бинаря, полученного проверяющим при пересборке.

Принести бочку керосина, разлить, поджечь. Выбегающих из конторы отстреливать с безопасного расстояния.

anonymous
()

понатыкай strip для бинарей, библиотеки (so-шки) собирай через ar. а то в бинарь могут улететь даты объектников, даты исходников да и вообще мало-ли чего..__DATE__ и подобные макросы в исходниках чего стоят :)

кстати, если режимная сборка, то это недопустимо в вирт.машинах - только на реальном, серт.железе

MKuznetsov ★★★★★
()
Ответ на: комментарий от aol

Я думаю, что адекватные люди не думают за других о чём те думают:)

Избитая же тема - делаешь минимальный пример на котором поведение воспроизводится и кидаешь людям которые шарят. А не включаешь астрал моде он и вброс про НИИ.

pon4ik ★★★★★
()
Ответ на: комментарий от anonymous

Они будут различаться даже при одинаковом порядке сборки.

В целом повторяемость сборки — это не пустой звук, а процесс сборки — не необъяснимое волшебство, поэтому такого не должно происходить.

proud_anon ★★★★★
()

У нас cmake как раз используется именно для получения повторимых сборок, проблем никогда не было. Сборочных машин несколько, используется параллельная сборка.

Я бы первым делом сравнил сгенерённые Makefile, если они разные - проблема действительно в cmake - либо он у вас действительно слишком старый, либо пишите баги.

slovazap ★★★★★
()
Ответ на: комментарий от proud_anon

В целом повторяемость сборки — это не пустой звук,

Еще один аутист, которому яйца мешают?

поэтому такого не должно происходить.

Должно. И компилятор, и линкер имеют полное право использовать случайные или псевдослучайные процессы. И чем дальше в оптимизации, тем больше это будет необходимо. Давно доказано, что рандомизированные эвристики работают как правило лучше детерминированных. Что, ради таких убогих аутистов, как ты, брать чексумму исходников в качестве seed каждый раз?

anonymous
()
Ответ на: комментарий от anonymous

Царь, ты что ли? Прости, батюшка, не признал. Кланяюсь в пол.

EXL ★★★★★
()
Ответ на: комментарий от slovazap

я уже с дивана вещаю - завтра ради эксперимента засуну туда новый cmake

aol ★★★★★
() автор топика
Ответ на: комментарий от slovazap

и, да, как уже несколько раз писал выше - на одном хосте они гарантированно повторяются с одинаковыми чексуммами. проблема наступает, когда исходники собирают с нуля на другом хосте.

aol ★★★★★
() автор топика
Ответ на: комментарий от anonymous

И компилятор, и линкер имеют полное право использовать случайные или псевдослучайные процессы.

Знакомая лексика... это не ты - автор патчей к GCC и LLVM?

tailgunner ★★★★★
()

Может им патченый md5sum в PATH подсунуть?

crowbar
()
Ответ на: комментарий от anonymous

А если ты еще и -jN для N > 1 будешь использовать, то никакого порядка вообще никто тебе никогда не гарантирует.

Порядок исполнения отдельных команд не гарантирует. А порядок аргументов в каждой команде гарантировать обязан. И линковщик здесь не исключение.

Dendy ★★★★★
()
Ответ на: комментарий от aol

номера версий ПО продиктованы дистрибутивом, который мы используем.. весь производный софт должен собраться в изолированном окружении без сторонних пакетов.

Если в свежем CMake проблема исправлена, то засуньте его себе в изолированное окружение и собирайте при бутстрапе.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

да, так и придется делать.. завтра после эксперимента всё расскажу :)

aol ★★★★★
() автор топика
Ответ на: комментарий от aol

Я видел, поэтому и написал что у нас тоже используются разные хосты.

slovazap ★★★★★
()
Ответ на: комментарий от anonymous

Должно. И компилятор, и линкер имеют полное право использовать случайные или псевдослучайные процессы.

Но только пока не используют. А если использовали бы, проблема бы решалась возможностью подсунуть один и тот же seed для генератора случайных чисел. Он бы тогда генерировал одинаковые числа.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Но только пока не используют.

Используют. Много и с удовольствием.

проблема бы решалась возможностью подсунуть один и тот же seed для генератора случайных чисел

Ну так и подсовывай, аутист. -frandom-seed=блаблабла.

Только вот это не поможет в случае со случайным порядком сборки (и -jN). На уровне .o файлов детерминизма еще можно добиться, а вот в процессе линковки фиг тебе.

anonymous
()
Ответ на: комментарий от Dendy

А порядок аргументов в каждой команде гарантировать обязан.

С какой это плешивой радости?!?

anonymous
()
Ответ на: комментарий от anonymous

Ну так и подсовывай, аутист. -frandom-seed=блаблабла.

ТС, попробуй, что ли, подсунуть! Вдруг этого хватит.

Только вот это не поможет в случае со случайным порядком сборки

Ну так может ещё куда-то надо аналогичную опцию подсунуть.

и -jN

Ну этого ТС, я думаю, и сам не применяет, раз такое дело.

proud_anon ★★★★★
()
Ответ на: комментарий от anonymous

А порядок аргументов в каждой команде гарантировать обязан.

С какой это плешивой радости?!?

Потому что в общем случае порядок аргументов влияет на результат выполнения.

Dendy ★★★★★
()
Ответ на: комментарий от anonymous

Только вот это не поможет в случае со случайным порядком сборки (и -jN). На уровне .o файлов детерминизма еще можно добиться, а вот в процессе линковки фиг тебе.

У вас какая-то каша в голове. Причём здесь порядок сборки вообще? Когда очередь доходит до линковки все обьектники уже собраны, в каком порядке они собирались никого не интересует. Изначальная проблема была давно озвучена: случайный порядок аргументов линкера. Мейкфайлы и многопоточная сборка к этой теме отношения не имеют.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Когда очередь доходит до линковки все обьектники уже собраны, в каком порядке они собирались никого не интересует.

Линкер может разместить секции из .o файлов в памяти в любом порядке, как его припрет. Особенно если это gold. При одних и тех же аргументах может быть разный результат.

Изначальная проблема была давно озвучена: случайный порядок аргументов линкера. Мейкфайлы и многопоточная сборка к этой теме отношения не имеют.

Порядок аргументов легко может зависеть от порядка исполнения правил.

anonymous
()

Сравнивать бинарники, собранные из одинаковых сорцах, но в разное время глупо: где-то может неприметно затаится такая штука, как timestamp. Так что ССЗБ.

По теме — не знаю. Возможно внутри cmake использует хеш-мапы для разруливания зависимостей. А у самих хеш-мап порядок ключей часто рандомизирован при обходе. Вот и выходим на разный порядок сборки

KennyMinigun ★★★★★
()
Ответ на: комментарий от anonymous

Порядок аргументов легко может зависеть от порядка исполнения правил.

В CMake уж точно не может, порядок определяется на этапе генерации.

Если такое происходит, то это симптом неверно расставленных зависимостей в системе сборки и должен быть исправлен.

Вообще система сборки общего назначения не может знать о том какие утилиты она запускает и тем более манипулировать аргументами.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

В CMake уж точно не может, порядок определяется на этапе генерации.

Объектники, предназначенные для сборки в одну библиотеку, имеют одинаковый приоритет сборки, поэтому теоретически могут быть собраны в разном порядке даже при однопоточной сборке, не говоря уже о -jN.

Sorcerer ★★★★★
()

Попробуйте для начала сравнить выхлопы make VERBOSE=1 на разных машинах.

Sorcerer ★★★★★
()

Изменить процедуру приёмки не представляется возможным. Вдоль, бочку и бежать оттуда не предлагать ;)

Предлагаю попросить заказчика отдельно оплатить искусственно созданные (неоправданные) сложности. Если не согласится, самому придумать какую-нибудь ерунду того же уровня (попросить выделить тебе отдельную приемочную среду с круглосуточным доступом на отдельной машине).

Если заказчик придумал глупость и предлагает тебе преодолевать ее за свой счет, сделай так, чтобы это было за его счет. В конце концов заказчику результат нужен даже больше, чем тебе.

P.S. Ты хоть предоплату взял с него?

anonymous
()
Ответ на: комментарий от Sorcerer

А я ответил, что не может, поэтому дальнейшие разговоры про порядок сборки бессмысленны. Я прекрастно знаю как работает многопоточная сборка, но к данной теме это отношения не имеет.

Dendy ★★★★★
()
Ответ на: комментарий от aol

чуваак, без минимального примера - это поиск фиг знает чего, тебя реально так ломает потратить 5 минут и сделать аналогичный проект, с сорцами FooBar?

Если бага есть - она воспроизведется:)

Как ты сорцы вытаскиваешь на эти 2 идеально идентичные системы?

Какие ресурсы используются в программе, помимо файлов исходных данных?

Используется ли где то команда configure_file ?

pon4ik ★★★★★
()

Так вот, вопрос как раз в этом: какого черта они различаются, и как это вылечить?

собирай в один поток, для простой make это -j, для QMake я не помню. Вроде-бы также.

В конторе приемка софта происходит по вычислению контрольной суммы бинаря, пришедшего от разработчика и сравнению её с контрольной суммы бинаря, полученного проверяющим при пересборке.

ваще-то подпись(ЭЦП) проверять нужно. И не бинаря, а исходников или пакета.

emulek
()
Ответ на: комментарий от tailgunner

Идентичные системы сборки дают идентичные результаты.

только если ты в один поток собираешь. Если в два и более, возможны варианты. Тоже самое с сжатием файлов.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.