Macos 如何在运行sudomake vs make时使用.makerc文件?

Macos 如何在运行sudomake vs make时使用.makerc文件?,macos,postgresql,makefile,sudo,Macos,Postgresql,Makefile,Sudo,我正在雪豹安装(使用MacPorts安装的Postgres)上编译几个Postgres扩展。这通常需要在make命令中传递两个变量,例如: sudo make install USE_PGXS=1 PGUSER=postgres 至少可以说,我的C有点生疏了,我在谷歌上搜索过,希望找到一种不需要传递上述两个变量的方法,但都没有用 我似乎做了一些正确的事情。。。我当前的~/.makerc文件包含以下内容: $ cat ~/.makerc USE_PGXS=1 PGUSER=postgres

我正在雪豹安装(使用MacPorts安装的Postgres)上编译几个Postgres扩展。这通常需要在make命令中传递两个变量,例如:

sudo make install USE_PGXS=1 PGUSER=postgres
至少可以说,我的C有点生疏了,我在谷歌上搜索过,希望找到一种不需要传递上述两个变量的方法,但都没有用

我似乎做了一些正确的事情。。。我当前的~/.makerc文件包含以下内容:

$ cat ~/.makerc 
USE_PGXS=1
PGUSER=postgres
这解决了运行
make installcheck
时的问题,但是在没有
sudo
的情况下运行此操作通常意味着在实际的make过程中会出现权限问题,并且当我运行
sudo make installcheck
时,
.makerc
不会被读取。我以root身份登录,并在/var/root中放置了一个指向上述文件的符号链接,但没有任何效果

可以说,我可以求助于以root用户身份登录来完成所有这些工作。然而,我很想知道我是否忽略了什么。在运行
sudo make
而不是
make
时,是否没有办法使用
.makerc
文件


编辑:注释日志,在初始建议之后:

DB:~/pgdevel/kmeans-postgresql $ export USE_PGXS=1
DB:~/pgdevel/kmeans-postgresql $ export PGUSER=postrgess
这会失败,因为它使生成文件假定kmeans postgresql位于postgres/contrib中(这就是USE_PGXS的作用,将其放置在postgres/contrib中也会失败,因为它是使用MacPorts安装的):

这将成功(即使没有导出):


PS:我之所以要添加OSX和PostgreSQL标记,是因为虽然不是严格意义上的PostgreSQL相关,但我希望MacOSX上的另一个PostgreSQL用户可能知道解决方法。

sudo不应该改变当前的用户环境,因此保留所有变量和对homedir文件的访问。也许您应该定义一个文件,如
setenv.sh

export USE_PGXS=1
export PGUSER=postrgess
并将其源代码放在构建shell中:

$ . setenv.sh

或者你可以把它放进你的
.bashrc
,但这将包含在你所有的shell中,在将来的某个时候,你可能会搞不清楚“为什么这个该死的Postgress会被编译成那样?”

终于找到了谷歌的正确关键字:“sudo export environment variable”

这最终导致我识别了
/etc/sudoers
文件,需要使用
visudo
命令将其编辑为root

因此,首先,
~/.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"
最后重新启动终端,一切就绪。

Denis,我使用
tcsh(1)
几乎完全是为了这个原因。不同的工具、项目、工作环境等都需要不同的工具链,因此需要不同的环境变量。然而,这种不同的上下文几乎总是受您所在目录的限制

以下是我的
.cshrc
文件(第100-116行)中的内容:

然后我在我的文件系统中乱扔这样的东西:

或者这个:

在后一个示例中,我希望在分布式
.enter.tcsh
文件中支持站点本地设置,我添加了对
.local.tcsh
约定的支持,然后我可以提供自己的设置(在这种情况下,我使用的boost副本不在标准位置):

我希望这个技巧能有所帮助(使用
tcsh(1)
over
bash(1)
为我节省了无数个小时的挫折和调试时间……历史才是真正赢得我的东西,但这是另一回事)。正是这样的东西使得
tcsh(1)
成为我与系统交互的首选shell(必要时我仍然在
sh
中编写脚本)

至于你的具体情况:

sudo env PGUSER=postgres USE_PGXS=1 make install
或者因为您在mac上使用MacPorts(我的本机开发环境):


sudo-E
保护环境。根据您的操作系统和版本,这在某些时候是默认的,但可能不再是。所以试试看

sudo -E make install

你从哪里得到的
.makerc
?是GNU制造还是其他什么?尝试和错误,真的。我在谷歌搜索结果中看到了它,所以尝试了一下。GCC版本是i686-apple-darwin10-GCC-4.2.1(GCC)4.2.1(apple Inc.build 5664)我在GNU Make文档中找不到它,所以它可能不存在:)似乎是这样。我刚刚发布了答案,实际上不需要这样的文件……需要设置这样的变量的扩展名被破坏了。给他们发一份错误报告。我只是试着导出,没有用。(也发布了更多详细的日志。)感谢您花时间写下所有这些。你在最后提到的几句话正是我每次都想避免写的实际上,通过使用visudo.np编辑/etc/sudoers文件,我成功地避免了这些问题。我不喜欢把感觉像是一次性的东西放在系统全局区域,这就是为什么我开发了
.enter.tcsh
.local.tcsh
技术。对我过去所做的事情的上下文局部提示是再好不过的,尤其是现在我的大脑显然已经满了,我倾向于需要文档或笔记如果您有任何问题,请使用LMK。zsh也可以使用上下文相关的shell设置。但在任何情况下,这在这里都没有真正的帮助,因为他可能正在将一些随机扩展下载到一个临时目录中,而shell配置不一定会预测到这个临时目录。正确。顺便说一句,我是从zsh得到这个想法的,但是zsh并不是默认安装在大多数系统上的。
# 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
sudo env PGUSER=postgres USE_PGXS=1 make install
sudo env PGUSER=postgres USE_PGXS=1 PATH=/opt/local/lib/postgresql91/bin:${PATH} make install
sudo -E make install