【问题标题】:How to make use of a .makerc file when running sudo make vs make?运行 sudo make vs make 时如何使用 .makerc 文件?
【发布时间】:2011-06-03 09:50:51
【问题描述】:

我正在为 Snow Leopard 安装(使用 MacPorts 安装 Postgres)编译几个 Postgres 扩展。这通常需要与 make 命令一起传递两个变量,例如:

sudo make install USE_PGXS=1 PGUSER=postgres

至少可以说,我的 C 有点生疏了,我在 Google 上四处搜索无济于事,希望找到一种不需要传递上述两个变量的方法。

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

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

这解决了运行make installcheck 时的问题,但是在没有sudo 的情况下运行它经常意味着在实际制作过程中出现权限问题,并且当我运行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

这失败了,因为它使 makefile 假定 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 相关,但我希望 MacOSX 上的另一个 PostgreSQL 用户可能知道解决方法。

【问题讨论】:

  • 你从哪里得到.makerc?是 GNU Make 还是别的什么?
  • 试错,真的。我在谷歌搜索结果中看到了它,所以尝试了一下。 GCC 版本是 i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)
  • 我在 GNU Make 文档中找不到它,所以它可能不存在 :)
  • 似乎如此。我刚刚发布了答案,确实不需要这样的文件......
  • 需要设置类似变量的扩展被破坏。向他们发送错误报告。

标签: macos postgresql makefile sudo


【解决方案1】:

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

sudo -E make install

【讨论】:

    【解决方案2】:

    sudo 不应更改当前用户环境,因此所有变量和对 homedir 文件的访问都被保留。也许你应该定义一个像setenv.sh这样的文件:

    export USE_PGXS=1
    export PGUSER=postrgess
    

    并在您的构建外壳中获取它:

    $ . setenv.sh
    

    或者您可以将其放入您的 .bashrc,但这将包含在您的所有 shell 中,并且在未来的某个时间您可能会感到困惑'为什么这个被阻止的 Postgress 会被这样编译?'

    【讨论】:

    • 我刚刚尝试了导出,但无济于事。 (也发布了更详细的日志。)
    【解决方案3】:

    终于找到合适的关键词给谷歌了:“sudo export environment variable”...

    这最终让我找到了/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"
    

    终于重启了终端,一切顺利。

    【讨论】:

      【解决方案4】:

      丹尼斯,我几乎完全出于这个原因使用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 约定的支持,然后我可以提供自己的设置(在这种情况下,我使用不在标准位置的 boost 副本):

      # 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) 成为我与系统交互的首选shell(如果需要,我仍然在sh 中编写脚本)。

      至于你的具体情况:

      sudo env PGUSER=postgres USE_PGXS=1 make install
      

      或者因为您在使用 MacPorts(我的原生开发环境)的 Mac 上:

      sudo env PGUSER=postgres USE_PGXS=1 PATH=/opt/local/lib/postgresql91/bin:${PATH} make install
      

      【讨论】:

      • 感谢您花时间写下所有这些。你在最后建议的台词正是我每次都试图避免写的那些。 ;-) 我实际上设法通过使用 visudo 编辑 /etc/sudoers 文件来完全避免它们。
      • np。我不喜欢将感觉像是一次性的项目放在系统全局区域中,这就是我开发.enter.tcsh.local.tcsh 技术的原因。我过去所做的事情的上下文本地提示无法被击败,尤其是现在我的大脑显然已经填满并且我很容易需要文档或笔记。 >
      • 上下文相关的 shell 设置也可以使用 zsh。但无论如何,这在这里并没有真正的帮助,因为他可能正在将一些随机扩展下载到一个 shell 配置不一定能预测的临时目录中。
      • 正确。顺便说一句,我是从 zsh 那里得到这个想法的,但是默认情况下大多数系统上都没有安装 zsh。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多