Автор Тема: Почему вредно "Истинное ТРУЪ" make install  (Прочитано 14331 раз)

Оффлайн Damir

  • alt linux team
  • ***
  • Сообщений: 134
Почему вредно "Истинное ТРУЪ" make install
« Ответ #15 : 19.11.2008 19:35:42 »
А зачем устанавливать программу в систему (в /usr/local и т.п.) для отладки и разработки?
Где вы увидели /usr/local/?
Где вы не увидели "и т.п."?
Ceterum censeo LORum esse delendam

lx001

  • Гость
Почему вредно "Истинное ТРУЪ" make install
« Ответ #16 : 19.11.2008 19:39:06 »
А зачем устанавливать программу в систему (в /usr/local и т.п.) для отладки и разработки?
Где вы увидели /usr/local/?
Где вы не увидели "и т.п."?
и != или

Оффлайн Damir

  • alt linux team
  • ***
  • Сообщений: 134
Почему вредно "Истинное ТРУЪ" make install
« Ответ #17 : 19.11.2008 19:41:50 »
и != или
Диагноз - тролль. *вешает табличку "не кормить"*
Ceterum censeo LORum esse delendam

lx001

  • Гость
Почему вредно "Истинное ТРУЪ" make install
« Ответ #18 : 19.11.2008 19:56:23 »
Не делайте неоправданно широких обобщений, и вас подкармливать перестанут.  :)

Оффлайн Damir

  • alt linux team
  • ***
  • Сообщений: 134
Почему вредно "Истинное ТРУЪ" make install
« Ответ #19 : 19.11.2008 20:24:46 »
Отвечайте по существу вопроса, а не придирайтесь к мелочам - и вас не примут за тролля.
Ceterum censeo LORum esse delendam

lx001

  • Гость
Почему вредно "Истинное ТРУЪ" make install
« Ответ #20 : 19.11.2008 20:49:19 »
не придирайтесь к мелочам
"и/или" не мелочь.  /usr/local/ и и_т_п=$HOME/local  -- две большие разницы.

Оффлайн Damir

  • alt linux team
  • ***
  • Сообщений: 134
и_т_п еще может означать /sw/stuff и прочие страшные для любого админа каталоги неопакеченного софта.

В простейшем случае установка софта в /usr/local может серьезно поломать систему, если там например будет библиотека, заменяющая библиотеки в /usr. Или devel-файлы. В результате на такой свалке несложно словить кучу необъяснимых багов. Никакой нормальный человек не будет вам помогать разбираться, почему на вашей свалке что-то не работает, если на чистой машине все работает.

Если вы мусорите в своей квартире - не удивляйтесь, что скоро там разведутся баги. И багрепорты строителям будет бесполезно отправлять.
Ceterum censeo LORum esse delendam

lx001

  • Гость
и_т_п еще может означать /sw/stuff и прочие страшные для любого админа каталоги неопакеченного софта.
Не может, а должно. Потому как по историческим причинам /usr/local/bin бывает в PATH, /usr/local/lib может быть у несознательного пользователя в LD_LIBRARY_PATH, может быть в ld.so.conf, /usr/local/include, как правило, по умолчанию стоит на первом месте у gcc, что неправильно, и т.д.
Цитировать
В простейшем случае установка софта в /usr/local может серьезно поломать систему, если там например будет библиотека, заменяющая библиотеки в /usr.
...  -Wl,-soname=/usr/lib/libsomething.so.${version} ...
...  -Wl,-rpath /usr/lib/ /usr/lib/libsomething.so.${version} ...
В системах с несколькими версиями libsomething так и делается, если программа должна загружаться с определенной библиотекой.
Цитировать
Или devel-файлы. В результате на такой свалке несложно словить кучу необъяснимых багов. Никакой нормальный человек не будет вам помогать разбираться, почему на вашей свалке что-то не работает, если на чистой машине все работает.
Включать в cc по умолчанию /usr/local/include _первым_ номером, imho, неправильно.

Оффлайн Damir

  • alt linux team
  • ***
  • Сообщений: 134
Не может, а должно. Потому как по историческим причинам /usr/local/bin бывает в PATH, /usr/local/lib может быть у несознательного пользователя в LD_LIBRARY_PATH, может быть в ld.so.conf, /usr/local/include, как правило, по умолчанию стоит на первом месте у gcc, что неправильно, и т.д.
Для некоторых систем /usr/local является основным местом, куда ставятся все программы.



Цитировать
...  -Wl,-soname=/usr/lib/libsomething.so.${version} ...
...  -Wl,-rpath /usr/lib/ /usr/lib/libsomething.so.${version} ...
В системах с несколькими версиями libsomething так и делается, если программа должна загружаться с определенной библиотекой.
Первая строчка просто страшна и ужасна. Пути в soname - до этого надо еще додуматься.
А вторая еще и кривая похоже, потому как надо либо -Wl,-rpath,/usr/lib, либо -Wl,-rpath -Wl,/usr/lib
Плюс еще надо помнить про -Wl,-rpath-link

Глупо рассчитывать, что все эти нюансы знают все, кто использует configure/make/make install. Поэтому в ALT Linux Team принято разъяснять пользователям, что сборка вручную может привести к отсутствии поддержки (на жаргоне это называется "сделать из Альта Слаку"). Если же все эти нюансы известны - то вы и сами можете разобраться со всеми вытекающими проблемами, и можете  смело начхать на рекомендации.

Цитировать
Включать в cc по умолчанию /usr/local/include _первым_ номером, imho, неправильно.
Многие с вами, я уверен, не согласятся.
Ceterum censeo LORum esse delendam

lx001

  • Гость
Не может, а должно. Потому как по историческим причинам /usr/local/bin бывает в PATH, /usr/local/lib может быть у несознательного пользователя в LD_LIBRARY_PATH, может быть в ld.so.conf, /usr/local/include, как правило, по умолчанию стоит на первом месте у gcc, что неправильно, и т.д.
Для некоторых систем /usr/local является основным местом, куда ставятся все программы.
Не в ALT.
Цитировать
Цитировать
...  -Wl,-soname=/usr/lib/libsomething.so.${version} ...
...  -Wl,-rpath /usr/lib/ /usr/lib/libsomething.so.${version} ...
Первая строчка просто страшна и ужасна. Пути в soname - до этого надо еще додуматься.
Надо. Почему нет? Где-то может лежать библиотека с той же версией, но под другую платформу. Например, полный путь (+ имя платформы) в SONAME помогает понять при сборке, правильную библиотеку мы подсовываем или нет, не проверяя, откуда именно ее взяли.
Цитировать
А вторая еще и кривая похоже, потому как надо либо -Wl,-rpath,/usr/lib, либо -Wl,-rpath -Wl,/usr/lib
Не похоже. Она избыточна. Достаточно /usr/lib/libsomething.so.${version}, чтобы случайно не загрузиться, например, с /usr/local/lib/libsomething.so.${version}
Цитировать
Плюс еще надо помнить про -Wl,-rpath-link
Конечно надо.
Цитировать
Глупо рассчитывать, что все эти нюансы знают все, кто использует configure/make/make install.
Эти нюансы надо знать пишущим configure(.ac), Makefile(.am), и пишущим в /etc/ld.so.conf, /etc/ld.so.conf.d/*, чтобы не пришлось "разъяснять пользователям".
Цитировать
Цитировать
Включать в cc по умолчанию /usr/local/include _первым_ номером, imho, неправильно.
Многие с вами, я уверен, не согласятся.
Пользователи некоторых производных Berkeley UNIX не согласятся точно.
 В ALT /usr/local/include держать первым в списке, _imho_, вредно, пока, например, в autotools по умолчанию prefix=/usr/local.

Оффлайн Damir

  • alt linux team
  • ***
  • Сообщений: 134
Цитировать
Надо. Почему нет? Где-то может лежать библиотека с той же версией, но под другую платформу. Например, полный путь (+ имя платформы) в SONAME помогает понять при сборке, правильную библиотеку мы подсовываем или нет, не проверяя, откуда именно ее взяли.
А я думал что SONAME нужно для разграничения ABI.

Цитировать
Не похоже. Она избыточна. Достаточно /usr/lib/libsomething.so.${version}, чтобы случайно не загрузиться, например, с /usr/local/lib/libsomething.so.${version}
Это, на мой взгляд, какая-то ересь. rpath достаточно для запуска, rpath и rpath-link достаточно для линковки.
Цитировать
Цитировать
Глупо рассчитывать, что все эти нюансы знают все, кто использует configure/make/make install.
Эти нюансы надо знать пишущим configure(.ac), Makefile(.am), и пишущим в /etc/ld.so.conf, /etc/ld.so.conf.d/*, чтобы не пришлось "разъяснять пользователям".
Вы путаете уровень компетенции. Пишущим configure.ac про это знать не надо.

Цитировать
Пользователи некоторых производных Berkeley UNIX не согласятся точно.
 В ALT /usr/local/include держать первым в списке, _imho_, вредно, пока, например, в autotools по умолчанию prefix=/usr/local.
Это типично фашистский способ решения проблем - превращать то, что "не рекомендуется делать" в то, что "невозможно сделать в принципе". /usr/local/include первый в списке _именно потому_, что в autotools по умолчанию prefix=/usr/local.
Ceterum censeo LORum esse delendam

lx001

  • Гость
А я думал что SONAME нужно для разграничения ABI.
Не нужно, а можно. :)  Иногда приходится писать и платформу.
Цитировать
Цитировать
Достаточно /usr/lib/libsomething.so.${version}, чтобы случайно не загрузиться, например, с /usr/local/lib/libsomething.so.${version}
Это, на мой взгляд, какая-то ересь.
libtool на Linux иногда подставляет это открытым текстом вместо  -L/some/libdir/ -Wl,-rpath /some/libdir -lsomething.
Кроме того, это работает на Linux, даже если libsomething.so указывает на неверную libsomething.so.${version}
Цитировать
Вы путаете уровень компетенции. Пишущим configure.ac про это знать не надо.
То есть автор программы не должен думать о портабельности?
Цитировать
/usr/local/include первый в списке _именно потому_, что в autotools по умолчанию prefix=/usr/local.
Это как раз неправильно.

lx001

  • Гость
P.S.
Это типично фашистский способ решения проблем - превращать то, что "не рекомендуется делать" в то, что "невозможно сделать в принципе"
Почему невозможно? -I/usr/local/include всегда можно задать руками, а от досадных клэшей /usr/include <-> /usr/local/include это спасет.

Оффлайн Damir

  • alt linux team
  • ***
  • Сообщений: 134
Не нужно, а можно. :)  Иногда приходится писать и платформу.
На мой взгляд, это нецелевое использование, и подлежит осуждению всем прогрессивным обществом.

Цитировать
Достаточно /usr/lib/libsomething.so.${version}, чтобы случайно не загрузиться, например, с /usr/local/lib/libsomething.so.${version}
Это ерунда, нужно правильно rpath выставлять. SONAME не трожьте.

Цитировать
libtool на Linux иногда подставляет это открытым текстом вместо  -L/some/libdir/ -Wl,-rpath /some/libdir -lsomething.
Кроме того, это работает на Linux, даже если libsomething.so указывает на неверную libsomething.so.${version}
Какая у вас путаница в голове. libtool делает все правильно, а вы видимо путаете симлинк .so -> .so.N с SONAME. Что в общем неудивительно.
Цитировать
Цитировать
Вы путаете уровень компетенции. Пишущим configure.ac про это знать не надо.
То есть автор программы не должен думать о портабельности?
Автотулз как раз и сделаны в таком виде, чтобы автор не думал о портабельности.

Цитировать
Почему невозможно? -I/usr/local/include всегда можно задать руками, а от досадных клэшей /usr/include <-> /usr/local/include это спасет.
Даю вводную:
Библиотека A версии Na лежит в /usr. Библиотека A версии Ma лежит в /usr/local. Библиотека B версии Nb лежит в /usr. Библиотека B версии Mb лежит в /usr/local.

Вы собираете программу C с библиоткой A версии Na и библиотекой B версии Mb. При том, что один и тот же файл программы C использует одновременно include-файлы от библиотек A и B.

Каким образом тут помогут ключи -I/usr/local/include?
Ceterum censeo LORum esse delendam

lx001

  • Гость
Не нужно, а можно. :)  Иногда приходится писать и платформу.
На мой взгляд, это нецелевое использование, и подлежит осуждению всем прогрессивным обществом.
Где зафиксировано, что в SONAME пишется  libname.so.${version_major}, и только оно?
Цитировать
Цитировать
Достаточно /usr/lib/libsomething.so.${version}, чтобы случайно не загрузиться, например, с /usr/local/lib/libsomething.so.${version}
Это ерунда, нужно правильно rpath выставлять. SONAME не трожьте.
Причем _здесь_ SONAME? Как вам поможет -rpath в "-L/libdir/ -Wl,-rpath /libdir -lsmth", если /libdir/libsmth.so указывает на неправильную библиотеку? Опять симлинки будем расставлять?

Цитировать
Цитировать
libtool на Linux иногда подставляет это открытым текстом вместо  -L/some/libdir/ -Wl,-rpath /some/libdir -lsomething.
Кроме того, это работает на Linux, даже если libsomething.so указывает на неверную libsomething.so.${version}
libtool делает все правильно,
Конечно. :)
Цитировать
а вы видимо путаете симлинк .so -> .so.N с SONAME.
Где это вам увиделось? :)
Цитировать
Автотулз как раз и сделаны в таком виде, чтобы автор не думал о портабельности.
_Должны_ быть сделаны. :)
Цитировать
Цитировать
Почему невозможно? -I/usr/local/include всегда можно задать руками, а от досадных клэшей /usr/include <-> /usr/local/include это спасет.
Даю вводную:
Библиотека A версии Na лежит в /usr. Библиотека A версии Ma лежит в /usr/local. Библиотека B версии Nb лежит в /usr. Библиотека B версии Mb лежит в /usr/local.

Вы собираете программу C с библиоткой A версии Na и библиотекой B версии Mb. При том, что один и тот же файл программы C использует одновременно include-файлы от библиотек A и B.

Каким образом тут помогут ключи -I/usr/local/include?
Лишних слов много :), что неудивительно.

Правильный вопрос такой:  что делать, если нужно включить  /usr/include/A.h и /usr/local/include/B.h,
если есть /usr/local/include/A.h и /usr/include/B.h других версий?
В таких случаях делается, например,
( mkdir -p .include/  && cd .include/ && ln -s /usr/include/A.h . && ln -s /usr/local/include/B.h . )
gcc -I ./.include ....

Как правильно после этого запустить ld с libA.so.N и libB.so.M,  видимо, сами знаете,  если в /usr/lib:

libA.so -> libA.so.N
libA.so.N -> libA.so.N.x
libB.so -> libB.so.N
libB.so.N -> libB.so.N.y

а в /usr/local/lib:

libA.so -> libA.so.M
libA.so.M -> libA.so.M.w
libB.so -> libB.so.M
libB.so.M -> libB.so.M.z


Следующий правильный вопрос такой:

что делать, если в /libdir/ есть libA.so.N и libA.so.M, и libA.so -> libA.so.M, а нам нужна именно libA.so.N?