Я пытаюсь создать pdftk, который, по-видимому, требует gcj. Поскольку его еще нет на моем пути, я могу либо добавить каталог, содержащий gcj, к моему пути, либо определить путь в предварительно созданном Makefile.
Проблема в том, что я понятия не имею:
а) где находится gcj, и б) существует ли он на сервере вообще (по крайней мере, так, как я могу добавить в путь).
Эта проблема возникала не один раз в моих предыдущих попытках собрать двоичные файлы из исходного кода, поэтому я надеюсь, что смогу задать два вопроса сразу, чтобы исправить мою текущую проблему и избежать этой проблемы в будущем ...
Есть ли способ добавить ВСЕ, что у меня есть разрешение на чтение / выполнение, на свой путь? Подвопрос, это плохая идея?
Делает whereis
искать только мой путь? Есть ли какой-то эквивалент для поиска файлов / каталогов, которые мне нужны, без необходимости искать на ВСЕМ хосте и получать отказ в доступе для всех остальных каталогов?
Есть ли способ узнать наверняка, недоступна ли библиотека / двоичный файл или просто не на моем пути?
Есть ли способ узнать, специально для gcc
если gcj
доступен?
Могу ли я скомпилировать gcj в свой каталог пользователя без необходимости компилировать с ним весь gcc?
Есть ли (универсальный) способ при создании двоичного файла пометить файл компиляции или создания файла для работы с любыми зависимостями, когда он их находит, а не просто сбой?
Имеет ли типичный пользователь в ситуации с общим хостом возможность использовать библиотеку пакетов ОС для получения пакетов на уровне пользователя?
(1.) Есть ли способ добавить ВСЕ, что у меня есть разрешение на чтение / выполнение, на свой путь? Подвопрос, это плохая идея?
... это плохая идея по соображениям безопасности.
(2.) Где искать только мой путь? Есть ли какой-то эквивалент для поиска файлов / каталогов, которые мне нужны, без необходимости искать на ВСЕМ хосте и получать отказ в доступе для всех остальных каталогов?
Вы можете использовать locate (или glocate доступно в Findutils из OpenCSW) с параметром -r, который позволяет использовать регулярные выражения: glocate -r /gcj$
(3.) Есть ли способ узнать наверняка, что библиотека / двоичный файл определенно недоступен или просто не находится на моем пути?
glocate может сказать вам это, если предположить, что gupdatedb
был недавно запущен.
(4.) Есть ли способ узнать, доступен ли gcj, особенно для gcc?
Лучший способ сделать это - просканировать установленные пакеты. Список установленных файлов находится в /var/sadm/install/contents
.
(5.) Могу ли я скомпилировать gcj в свой каталог пользователя без необходимости компилировать с ним весь gcc?
Не пробовал, но вам все равно придется пройти через массу хлопот. Наверное, лучше схватить уже доступный двоичный файл gcj. Если вам нужно скомпилировать его самостоятельно, лучше всего использовать существующие описания сборки, такие как вот этот.
(6.) Есть ли (универсальный) способ при сборке двоичного файла пометить файл компиляции или создания для работы с любыми зависимостями по мере их обнаружения, а не просто сбой?
Я предполагаю, что вы думаете о чем-то вроде Gentoo emerge, который загружает и устанавливает зависимые пакеты перед компиляцией того, который вам нужен. Это нелегко сделать; особенно если вы компилируете все как обычный пользователь, потому что тогда вам нужно использовать среду chroot. Это хорошая идея, но сделать это нетривиально.
(7.) Имеет ли типичный пользователь в ситуации с разделяемым хостом возможность использовать библиотеку пакетов ОС для получения пакетов на уровне пользователя?
Что вы подразумеваете под получить пакеты? Если вы хотите извлечь содержимое файла .pkg, вы можете использовать команду pkgtrans, например: pkgtrans foo.pkg ./ all
Однако есть также возможность сделать что-то вроде строитель который создает среду chroot, в которой вы выполняете свою компиляцию, а также установку пакетов, все в домашнем каталоге.
Возвращаясь к вопросу gcj, я думаю, вам нужно указать зависимости времени сборки вашего make-файла и зависеть от пакета, содержащего gcj, по известному пути, а затем вы можете использовать этот путь в описании сборки.
Как правило, если вы находитесь на виртуальном хостинге, компиляция пакетов будет сложной задачей, гораздо лучше найти систему, в которой вы можете устанавливать и удалять пакеты и писать в / usr.
Также неплохо использовать какую-нибудь среду сборки, например GAR, который делает все правильно и устраняет множество неприятностей: он проверяет зависимости времени сборки, загружает архивы, проверенные контрольные суммы, извлекает, применяет исправления, если они есть, настраивает, строит, устанавливает и создает пакет, и вы можете указать все в один Makefile. Чтобы научиться пользоваться такой структурой, потребуется немного времени, но если вы склонны создавать пакеты самостоятельно, время, потраченное на обучение, быстро окупится.
1: Никто этого не делает -> плохая идея.
2 + 3: Верный путь:
pkginfo | grep -i gcj # (Solaris specific)
find / -name gcj 2>/dev/null
4: Не знаю.
5: Вероятно, и это, очевидно, много ручной работы.
6: Нет. В Makefile вы можете просто добавить в PATH любые каталоги, которые обычно содержат gcj (ваше обоснованное предположение). Это никому не повредит.
7: Нет, администратор может установить пакет. Но вам не нужно быть администратором, чтобы извлечь файлы, содержащиеся в пакете, в домашний каталог:
pkgtrans my-gcj.pkg . # (Solaris specific) converts package to a "filesystem format package" (i.e. directory tree)
После такого вычитания программное обеспечение будет редко использоваться (неправильное владение, неправильный путь, неправильные пути к библиотекам, неправильные пути к конфигурационным файлам, сценарий установки не выполняется, предварительные требования не проверены, ...). Такая операция также возможна не только в Solaris, но и в большинстве других разновидностей Unix / Linux - с использованием их инструментов упаковки.
Да, это плохая идея по соображениям безопасности. Вредоносный сценарий или программа, или простая ошибка могут стать настоящей проблемой.
whereis
ищет очевидные места, такие как /bin
, /usr/bin
и другие. См. Раздел ФАЙЛЫ на странице руководства.
Ты можешь использовать locate
если это доступно или find
в противном случае:
locate gcj
или
find / -name gcj