【问题标题】:How can I fix this error when making vim on Fedora 23在 Fedora 23 上制作 vim 时如何解决此错误
【发布时间】:2016-04-30 17:25:07
【问题描述】:

我正在尝试在我的 Fedora 23 上使用以下选项构建 vim

我想要一些插件+python +python3 +perl +lua +ruby +gui +conceal +gui

我找不到所有内置的版本(所以我自己做)

旅程始于关注Valloric

sudo yum install -y ruby ruby-devel lua lua-devel luajit \
    luajit-devel ctags git python python-devel \
    python3 python3-devel tcl-devel \
    perl perl-devel perl-ExtUtils-ParseXS \
    perl-ExtUtils-XSpp perl-ExtUtils-CBuilder \
    perl-ExtUtils-Embed

我也有ncurses (raw,devel,static,...)

然后

$ cd $HOME/Sources
$ git clone https://github.com/vim/vim.git
$ cd vim
$ ./configure --with-tlib=ncurses \
              --with-features=huge \
              --enable-fail-if-missing \
              --enable-luainterp=yes \
              --enable-mzschemeinterp \
              --enable-perlinterp \
              --enable-pythoninterp=yes \
              --with-python-config-dir=/usr/lib64/python2.7/config \
              --enable-python3interp=yes \
              --enable-tclinterp=yes \
              --enable-rubyinterp=yes \
              --enable-cscope \
              --enable-multibyte \
              --enable-gui=auto \
              --prefix=$HOME/Build/vim \
              --with-compiledby=statquant | tee configure.log

屏幕上打印以下内容:

/home/statquant/Sources/vim/src/config-PyMake3137:1478: warning: overriding recipe for target 'Modules/_math.o'
/home/statquant/Sources/vim/src/config-PyMake3137:1475: warning: ignoring old recipe for target 'Modules/_math.o'
/home/statquant/Sources/vim/src/config-PyMake3137:1517: warning: overriding recipe for target 'Modules/timemodule.o'
/home/statquant/Sources/vim/src/config-PyMake3137:1482: warning: ignoring old recipe for target 'Modules/timemodule.o'
configure: error: NOT FOUND!
      You need to install a terminal library; for example ncurses.
      Or specify the name of the library with --with-tlib.

然后我

make | tee make.log

我意识到它实际上在 $HOME/Sources/vim/src 而不是 $HOME/Build/vim 中构建了 vim(也许我的预期是错误的)

当我在 ./vim -g 上运行 :version 时(vim 已经构建了 GUI 支持)有 没有 python 没有 python3 ....

configure.logtheremake.logthere

EDIT1:以下作品,我现在只怀念+perl +ruby

./configure --with-features=huge \
       --enable-tclinterp=yes \
       --enable-luainterp=yes \
       --enable-pythoninterp=yes \
       --enable-python3interp=yes \
       --with-compiledby=statquant \
       --prefix=$HOME/Build/vim \

make install # and yes it installs in $HOME/Build/vim  

EDIT2 这是我尝试添加时发生的情况

  1. +perl

我可以跑

./configure --with-features=huge \
            --enable-tclinterp=yes \
            --enable-luainterp=yes \
            --enable-pythoninterp=yes \
            --enable-python3interp=yes \
            --enable-perlinterp=yes \
            --prefix=$HOME/Build/vim \
            --with-compiledby=statquant | tee configure.log

它似乎工作(没有错误):configure.log

make | tee make.log
[...]
cc1: error: -Wformat-security ignored without -Wformat [-Werror=format-security]
<command-line>:0:0: warning: "_FORTIFY_SOURCE" redefined
<command-line>:0:0: note: this is the location of the previous definition
cc1: some warnings being treated as errors
make[1]: *** [objects/option.o] Error 1
Makefile:2907: recipe for target 'objects/option.o' failed
make[1]: Leaving directory '/home/statquant/Sources/vim/src'
make: *** [first] Error 2
Makefile:26: recipe for target 'first' failed

我没有得到 vim 内置 /home/statquant/Sources/vim/src : make.log

  1. +红宝石

    ./configure --with-features=huge \ --启用-tclinterp=是\ --启用-luainterp=是\ --启用-pythoninterp=是\ --enable-python3interp=是\ --启用-rubyinterp=是\ --prefix=$HOME/Build/vim \ --with-compiledby=statquant |三通配置.log

它甚至不运行configure

checking --with-tlib argument... empty: automatic terminal library selection
checking for tgetent in -ltinfo... no
checking for tgetent in -lncurses... no
checking for tgetent in -ltermlib... no
checking for tgetent in -ltermcap... no
checking for tgetent in -lcurses... no
no terminal library found
checking for tgetent()... configure: error: NOT FOUND!
      You need to install a terminal library; for example ncurses.
      Or specify the name of the library with --with-tlib.

这里是日志:configure.log

【问题讨论】:

  • 如果你不与CFLAGS混淆,它是否有效,即在没有一次性分配的情况下运行./configure
  • 要理解configure 的错误消息,您需要重定向到configure.log 的上下文。尝试在不重定向的情况下运行 configure 以查看哪些特定检查会产生该错误输出。或者只看config.log,它可能包含所有相关信息。
  • 每次您解决问题时,问题都会发生变化。这使得几乎不可能提供帮助和奖金彩票。你能发布你收到的错误消息吗?
  • 你能发布你最新的 config.log 文件吗?如果您的配置过程与这些标志一起传递并且没有发生错误并且也通过了,那么 +ruby 和 +perl 不可用是很奇怪的。因为这里只有一些标志,FEAT_RUBY 和 FEAT_PERL。一旦在 confdefs.h 中定义为 1,那么 :version 应该将它们显示为 +。
  • 你想要最新的 VIM 吗?你为什么要自己建造它?...

标签: vim makefile fedora make-install


【解决方案1】:

您已启用-Werror=format-security。这会将printfscanf 格式的任何易受影响的使用当前视为`错误。

您可以修复if_perl.c 中的用法,我相信这是生成的文件。或删除标志-Werror=format-security

【讨论】:

  • 对不起,无法在 ubuntu 上测试。查看从配置中删除 --enable-perlinterp 是否有帮助
【解决方案2】:

python 的问题是这样的......

--with-python-config-dir=/usr/lib64/python2.7/config \
--enable-python3interp=yes \

带有版本 3 解释器的版本 2 配置。

您缺少 ncurses-devel 库,我可以看到您已将其从配置中删除。

sudo yum install ncurses-devel

configure 实际上对我有用,即使我没有安装 perl 开发包,即它没有失败要求我安装它们,我觉得这很奇怪。你是否已经安装了所有需要的开发包。

sudo yum install perl-devel
sudo yum install ruby-devel

【讨论】:

  • @statquant, --prefix 设置应用程序将安装而不是构建的路径。在您执行make install 之后,vim 将被复制到 $HOME/Build/vim。如果您希望所有文件都在那里(树外构建),您需要从该目录运行configure(并可能更改--prefix)。
【解决方案3】:

如果您缺少一些用于 ruby​​ 或 perl 的开发包,配置脚本会说:“禁用此选项”。刚刚用红宝石做了这个。安装 ruby​​-dev 软件包后,在 vim 中启用了 ruby​​ 选项。与 libperl-dev 相同。

【讨论】:

  • 你 100% 确定你安装了 libperl-dev 或类似的 dev pkg 吗?对我来说,安装它并添加简单的 --enable-perlinterp=yes 就像一个魅力
  • 你看到我有perl perl-devel perl-ExtUtils-ParseXS \ perl-ExtUtils-XSpp perl-ExtUtils-CBuilder \ perl-ExtUtils-Embed
【解决方案4】:

好的……事情就是这样。 VIM 是具有大量补丁的程序之一,Fedora 在 GCC 级别强制执行一些安全检查,不允许您从源代码构建它(轻松),我的建议:重建源 rpm,并不难:

安装所需的依赖项以重建 VIM

这些包是您在 F23 中构建 VIM 所必需的

sudo dnf install gtk2-devel ncurses-devel lua-devel perl-devel perl-ExtUtils-Embed perl-ExtUtils-ParseXS perl-ExtUtils-XSpp perl-ExtUtils-CBuilder python-devel python3-devel tcl-devel ruby-devel 

安装球拍存储库

我看到你正在传递需要球拍的--enable-mzschemeinterp 标志,官方回购中不包含该标志。

cat >/etc/yum.repos.d/rpm-sphere.repo <<EOF
[rpm-sphere]
name=RPM Sphere
baseurl=http://download.opensuse.org/repositories/home:/zhonghuaren/Fedora_23/
gpgkey=http://download.opensuse.org/repositories/home:/zhonghuaren/Fedora_23/repodata/repomd.xml.key
enabled=1
gpgcheck=1
EOF

安装 RPM 开发者工具:

这些是安装构建/重建 rpm 的工具所必需的

sudo dnf install @development-tools
sudo dnf install fedora-packager
sudo dnf install rpmdevtools

设置您的 RPM 构建根目录

在您的主文件夹中创建一个名为 rpmmacros 的文件,如下所示:

vim ~/.rpmmacros

添加以下内容:

%_topdir    /home/statquant/Src/rpm

然后创建文件夹/home/statquant/Src/rpm

创建 RPM 构建所需的文件夹

您需要拥有这些文件夹,以便在安装源 rpm 时存储源代码和规范文件:

mkdir -p ~/Src/rpm
cd ~/Src/rpm
mkdir BUILD RPMS SOURCES SPECS SRPMS
mkdir RPMS/{noarch,x86,x86_64}

下载 VIM 源 RPM:

dnf dnl --source vim

这会将源 rpm 下载到当前文件夹,例如 vim-7.4.1718-1.fc23.src.rpm

下载后,安装:

rpm -ivh vim-7.4.1718-1.fc23.src.rpm

安装后 RPM 应该会创建文件 /home/statquant/Src/rpm/SPECS/vim.spec 打开此文件。

修改配置选项

您会看到 SPEC 文件包含用于构建实际事物的配置选项和 make 命令。这个文件很大,而且有很多补丁。你可以继续修改configure命令所在的区域,有3个:

  • vim 最小的一个
  • vim 增强版
  • 一个用于 vim 的 GUI 版本

确保进行相应的修改。我使用您的选项进行了测试构建。你可以下载我的SPEC file here,vim、vim-enhanced 和 gvim 都可以正常工作。

重建 RPM

一旦您修改(或从我的模板复制)您想要基于该规范构建 RPM 的规范文件,请转到 /home/statquant/Src/rpm,然后:

rpmbuild -ba SPECS/vim.spec

这需要一段时间,之后,您应该会看到一些输出表明包已成功构建,在我的情况下:

Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/gustavo/Src/rpm/BUILDROOT/vim-7.4.1718-1.fc23.x86_64
Wrote: /home/gustavo/Src/rpm/SRPMS/vim-7.4.1718-1.fc23.src.rpm
Wrote: /home/gustavo/Src/rpm/RPMS/x86_64/vim-common-7.4.1718-1.fc23.x86_64.rpm
Wrote: /home/gustavo/Src/rpm/RPMS/x86_64/vim-minimal-7.4.1718-1.fc23.x86_64.rpm
Wrote: /home/gustavo/Src/rpm/RPMS/x86_64/vim-enhanced-7.4.1718-1.fc23.x86_64.rpm
Wrote: /home/gustavo/Src/rpm/RPMS/x86_64/vim-filesystem-7.4.1718-1.fc23.x86_64.rpm
Wrote: /home/gustavo/Src/rpm/RPMS/x86_64/vim-X11-7.4.1718-1.fc23.x86_64.rpm
Wrote: /home/gustavo/Src/rpm/RPMS/x86_64/vim-debuginfo-7.4.1718-1.fc23.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.tNsBuH
+ umask 022
+ cd /home/gustavo/Src/rpm/BUILD
+ cd vim74
+ rm -rf /home/gustavo/Src/rpm/BUILDROOT/vim-7.4.1718-1.fc23.x86_64
+ exit 0

安装新版本

现在您已经按照 Fedora 的建议和补丁构建了软件包,您可以继续重新安装它们(如果您已经拥有默认的 Fedora vim 版本,这可能是真的),如下所示:

cd /home/statquant/Src/rpm/RPMS/x86_64/
sudo dnf reinstall ./vim-common-7.4.1718-1.fc23.x86_64.rpm
sudo dnf reinstall ./vim-enhanced-7.4.1718-1.fc23.x86_64.rpm
etc...

请注意点和斜线表示 dnf 正在尝试安装本地软件包,而不是通过其数据库搜索会下载您已有的版本。

注意事项

出于安全考虑,我没有上传我的定制包,但如果你不介意或想尝试它们,请 ping 我,我可以上传它们,这样你就省去了所有这些麻烦......我已经有了RPM 构建工具,因为我为我构建了一些 here

您可能还想创建一个COPR 存储库,以便您自动执行此过程,如果您需要格式化磁盘、重新安装 Fedora、将其安装在新机器上等。您只需添加存储库并使用 dnf 即可安装您的自定义包。

如果您有任何其他问题,请告诉我,祝您好运!

更新spec文件中有以# options for开头的cmets,所以你可以跳转到实际的配置选项

【讨论】:

  • 很好,很高兴从你那里得到 rpm,我也会执行你的笔记
  • @statquant 好的,我设置了一个 copr 存储库(如 Fedora 的 ppa),一旦构建机器完成,我会通知你,这样你就可以像使用 dnf 包管理器一样使用安装常规 vim ;)
  • spec 文件创建了三个不同的二进制文件:vim-minimal、vim-enhanced 和 gvim,在这种情况下,gvim 是通过 GTK 构建的具有 X11 支持的二进制文件。 vim-enhanced 只是常规的命令行。 AFAIK 有一个名为 vim 的 shell 脚本,它将根据给定的参数运行其中的任何一个,至少在 fedora 上是这样
  • 嘿,我跟着你,效果很好,谢谢。问题: 1. vim-enhanced 是无GUI 构建的,vim-X11 只能用GUI 调用。为什么当我自己构建它时,我同时拥有两者? 2. 如果我想要 +client-server+clipboard+xterm_*,它们是 - 现在我该怎么做 3. /usr/share/vim/vim74/syntax 似乎缺少语法(对于 syntax.vim) 4.我可以在商业 redhat 发行版上使用这个 rpm 吗?
  • 我的构建有问题,看起来(例如)文档没有被拾取,因为 vim 在 /usr/share 而不是 ~/.vim 中查找,这很奇怪,因为我使用 Vundle为所有插件设置 rtp。文件类型也无法识别...缺少很多东西...
【解决方案5】:

现在有一个关于此的 Vim 问题: https://github.com/vim/vim/issues/1081

我正在使用我在对该问题的评论中提到的解决方法: https://github.com/vim/vim/issues/1081#issuecomment-269920486

我已经复制了下面的大部分评论以防万一。

我在 Fedora 25 (x86_64) 上遇到了这个问题。 Vim 的配置脚本向 ruby​​ 询问有关 LDFLAGS 的问题,但没有相应查询有关 CFLAGS 的信息: https://github.com/vim/vim/blob/v8.0.0134/src/auto/configure#L7174

rubyldflags=`$vi_cv_path_ruby -r rbconfig -e "print $ruby_rbconfig::CONFIG['LDFLAGS']"`

从 Fedora 23 开始,所有的 RPM 都默认被“强化”了: https://fedoraproject.org/wiki/Changes/Harden_All_Packages

构建 RPM 时,RPM SPEC 文件中使用的 %configure 宏会自动调整,以使用强化设置提供 CFLAGS、LDFLAGS 和其他几个环境变量。当使用 Fedora 的 ruby​​ 包时,上述使用 rbconfig 的查询会返回强化的链接器标志。因为vim的configure脚本没有使用对应的rbconfig来查询ruby的CFLAGS,导致编译和链接标志不匹配,导致报错:

configure: error: NOT FOUND!
      You need to install a terminal library; for example ncurses.
      Or specify the name of the library with --with-tlib.

在 src/auto/config.log 中,这种不匹配的标志会导致此错误:

configure:11318: checking for tgetent in -lncurses
configure:11343: gcc -o conftest -g -O2  -L. -Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,--enable-new-dtags -Wl,-z,relro    -L/usr/local/lib conftest.c -lncurses   -lselinux  >&5
/usr/bin/ld: /tmp/cckpDslF.o: relocation R_X86_64_PC32 against undefined symbol `tgetent' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status

我可以通过变通方法成功构建,但我对 autoconf 的了解不够,无法建议对配置脚本进行适当的修复。解决方法是首先安装一些与 RPM 相关的软件包:

sudo dnf install -y rpm-build redhat-rpm-config

接下来,通过以下方式在 shell 提示符下设置这些变量:

eval $(rpmbuild --eval '%{configure}' | egrep '^\s*[A-Z]+=')

上面使用 rpmbuild --eval '%{configure}' 来查询以多个环境变量赋值开头的 %configure 宏的定义。这提供了与 %configure 宏中提供的相同的默认编译环境。现在运行以下调用成功:

./configure --quiet --with-features=huge --enable-rubyinterp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2016-04-07
    • 2021-11-29
    • 2021-07-31
    • 1970-01-01
    • 2021-04-21
    • 2014-03-04
    相关资源
    最近更新 更多