Как использовать файл .makerc при запуске sudo make против make? - PullRequest
0 голосов
/ 03 июня 2011

Я нахожусь в процессе компиляции нескольких расширений Postgres при установке Snow Leopard (Postgres устанавливается с помощью MacPorts). Это часто требует, чтобы две переменные передавались вместе с командой make, например:

sudo make install USE_PGXS=1 PGUSER=postgres

Мой C немного ржавый, если не сказать больше, и я погуглил безрезультатно в надежде найти средство, которое не должно передавать две вышеуказанные переменные.

Кажется, я правильно сделал несколько вещей ... Мой текущий файл ~ / .makerc содержит следующее:

$ cat ~/.makerc 
USE_PGXS=1
PGUSER=postgres

Это исправило проблему при запуске make installcheck, но запуск этого без sudo часто означает проблемы с разрешениями в будущем во время самого процесса make, и .makerc не читается, когда я запускаю sudo make installcheck. Я вошел в систему как root и поместил символическую ссылку в / var / root на указанный выше файл, но безрезультатно.

Я мог бы, возможно, прибегнуть к выполнению всего этого, вошедшего в систему как root. Однако мне любопытно узнать, не мог ли я что-то упустить из виду. Нет ли способа использовать файл .makerc при запуске sudo make вместо make?


Редактировать: закомментированный журнал, после первоначального предложения:

DB:~/pgdevel/kmeans-postgresql $ export USE_PGXS=1
DB:~/pgdevel/kmeans-postgresql $ export PGUSER=postrgess

Это терпит неудачу, потому что заставляет make-файл предполагать, что kmeans-postgresql находится в postgres / contrib (о чем говорит USE_PGXS, и поместить его в postgres / contrib тоже не удается, поскольку он был установлен с помощью MacPorts):

DB:~/pgdevel/kmeans-postgresql $ sudo make

Makefile:34: ../../src/Makefile.global: No such file or directory
Makefile:35: /contrib/contrib-global.mk: No such file or directory
make: *** No rule to make target `/contrib/contrib-global.mk'.  Stop.

Это успешно (даже без экспорта):

DB:~/pgdevel/kmeans-postgresql $ make

sed 's,MODULE_PATHNAME,$libdir/kmeans,g' kmeans.sql.in >kmeans.sql
cp kmeans.sql kmeans--1.0.0.sql
/usr/bin/gcc-4.2 -pipe -O2 -arch x86_64 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv  -I. -I. -I/opt/local/include/postgresql91/server -I/opt/local/include/postgresql91/internal -I/opt/local/include -I/opt/local/include/ossp -I/opt/local/include/libxml2  -I/opt/local/include  -c -o kmeans.o kmeans.c
[some warnings...]
/usr/bin/gcc-4.2 -pipe -O2 -arch x86_64 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv  -L/opt/local/lib/postgresql91 -L/opt/local/lib -arch x86_64 -L/opt/local/lib  -L/opt/local/lib -Wl,-dead_strip_dylibs   -bundle -bundle_loader /opt/local/lib/postgresql91/bin/postgres -o kmeans.so kmeans.o
rm kmeans.o

PS: я повторно добавляю теги OSX и PostgreSQL, потому что, хотя и не строго связанный с PostgreSQL, я надеюсь, что другой пользователь PostgreSQL в MacOSX может знать обходной путь.

Ответы [ 4 ]

2 голосов
/ 04 июня 2011

sudo -E сохраняет окружающую среду. В зависимости от вашей операционной системы и версии, это было по умолчанию в какой-то момент, но может не быть больше. Так что попробуйте

sudo -E make install
0 голосов
/ 03 июня 2011

Наконец-то нашел правильные ключевые слова для Google: «переменная среды экспорта sudo» ...

Это в конечном итоге привело меня к идентификации файла /etc/sudoers, который нужно отредактировать как root с помощью команды visudo.

Итак, во-первых, в файле ~/.bash_profile нужны две строки:

export PGUSER=postgres
export USE_PGXS=1

Программа vi необходима в качестве редактора (mate -w по какой-то причине не хотела работать), поэтому точная команда для visudo:

env EDITOR=vi sudo visudo

Добавьте две строки после сброса среды:

Defaults        env_keep += "PGUSER"
Defaults        env_keep += "USE_PGXS"

Наконец, перезапустите терминал, и все готово.

0 голосов
/ 03 июня 2011

Денис, я использую tcsh(1) почти исключительно по этой причине. Разные инструменты, проекты, рабочие среды и т. Д. Требуют разных наборов инструментов и, следовательно, разных переменных среды. Этот другой контекст, однако, почти всегда ограничен каталогом, в котором вы находитесь.

Вот что у меня в файле .cshrc (строки 100-116):

https://github.com/sean-/cshrc/blob/master/.cshrc#L100

А потом я засоряю свою файловую систему такими вещами:

https://github.com/sean-/flask-skeleton/blob/master/.enter.tcsh

или это:

https://github.com/sean-/Boost.Examples/blob/master/.enter.tcsh#L1

В последнем примере, где я хочу поддерживать локальные настройки сайта в распределенном файле .enter.tcsh, я добавляю поддержку для соглашения .local.tcsh, а затем я могу предоставить свои собственные настройки (в этом случае я использую копия надстройки, которая не находится в стандартном месте):

# My .local.tcsh file for the Boost.Examples project referenced above.
if ( ${?BOOST_INCDIR} == "0" ) then
  setenv BOOST_INCDIR $HOME/src/foo/obj/contrib-Darwin-i386/include
  printf '[INFO] Setting BOOST_INCDIR environment variable to %s\n' ${BOOST_INCDIR}
endif

if ( ${?BOOST_LIBDIR} == "0" ) then
  setenv BOOST_LIBDIR $HOME/src/foo/obj/contrib-Darwin-i386/lib
  printf '[INFO] Setting BOOST_LIBDIR environment variable to %s\n' ${BOOST_LIBDIR}
endif

if ( ${?DYLD_FALLBACK_LIBRARY_PATH} == "0" ) then
  setenv DYLD_FALLBACK_LIBRARY_PATH $HOME/src/foo/obj/contrib-Darwin-i386/lib
  printf '[INFO] Setting DYLD_FALLBACK_LIBRARY_PATH environment variable to %s\n' ${DYLD_FALLBACK_LIBRARY_PATH}
endif

Надеюсь, подсказка поможет (использование tcsh(1) сверх bash(1) сэкономило мне миллионы часов разочарований и времени на отладку ... история - это то, что действительно меня покорило, но это другая история). Подобные вещи делают tcsh(1) моей предпочтительной оболочкой для взаимодействия с системами (я все еще пишу в sh, где это необходимо).

Что касается вашей конкретной ситуации:

sudo env PGUSER=postgres USE_PGXS=1 make install

или, так как вы используете MacPorts на компьютере Mac (мой родной dev env):

sudo env PGUSER=postgres USE_PGXS=1 PATH=/opt/local/lib/postgresql91/bin:${PATH} make install
0 голосов
/ 03 июня 2011

sudo не должен изменять текущую пользовательскую среду, поэтому все переменные и доступ к файлам homedir сохраняются. Может быть, вы должны определить файл, как setenv.sh:

export USE_PGXS=1
export PGUSER=postrgess

И поставьте его в вашей сборочной оболочке:

$ . setenv.sh

Или вы можете поместить его в .bashrc, но это будет включено во все ваши оболочки, и через некоторое время в будущем вы можете запутаться ' почему этот проклятый Postgress компилируется таким образом? «

...