什么是shellscript和makefile命令调用之间的区别?

时间:2017-01-07 19:12:16

标签: shell makefile gnu-make ctags gentoo

故事

我写了 Makefile 而不是 shellscript 来为 gentoolinux 构建二进制包。有三个目标chrootsystempackages

chroot:准备一个gentoo stage3 chroot环境,添加我的叠加层并将我的自定义配置文件设置为默认值。

system:使用新的useflags和profile definition

在chroot内重建

packages:构建应该可用的自定义包

vim 在我的个人资料中设置为默认编辑器,取决于 dev-util / ctags

问题

在shellcript中或直接在shell中强制调用此命令成功

chroot /newroot/rootfs /env.sh emerge -q1 dev-util/ctags

通过Makefile 调用

system:
    chroot /newroot/rootfs /env.sh emerge -q1 dev-util/ctags

我的env.sh包装器看起来像这样

#!/bin/bash

# chroot wrapper for a clean portage environment

if [ -z "${1}" ]; then
  echo "USAGE: ${0} <cmd> [<args>] [..]"
  exit 1
fi

export envArgs="${@}"

bash -c "env-update && source /etc/profile && ${envArgs}"

错误如下:

>>> Failed to emerge dev-util/ctags-20161028, Log file:
>>>  '/var/tmp/portage/dev-util/ctags-20161028/temp/build.log'
 * Package:    dev-util/ctags-20161028
 * Repository: gentoo
 * Maintainer: vim@gentoo.org
 * USE:        abi_x86_64 amd64 elibc_glibc kernel_linux userland_GNU
 * FEATURES:   preserve-libs sandbox userpriv usersandbox
 * Applying ctags-20161028-automagic-deps.patch ...
 [ ok ]
misc/dist-test-cases: line 9: git: command not found
autoreconf-2.69: Entering directory `.'
autoreconf-2.69: configure.ac: not using Gettext
autoreconf-2.69: running: aclocal --force 
autoreconf-2.69: configure.ac: tracing
autoreconf-2.69: configure.ac: not using Libtool
autoreconf-2.69: running: /usr/bin/autoconf-2.69 --force
autoreconf-2.69: running: /usr/bin/autoheader-2.69 --force
autoreconf-2.69: running: automake --add-missing --copy --force-missing
Unescaped left brace in regex is deprecated, passed through in regex; marked by <-- HERE in m/\${ <-- HERE ([^ \t=:+{}]+)}/ at /usr/bin/automake-1.15 line 3936.
configure.ac:276: installing './compile'
configure.ac:23: installing './config.guess'
configure.ac:23: installing './config.sub'
configure.ac:11: installing './install-sh'
configure.ac:11: installing './missing'
Makefile.am: installing './depcomp'
/usr/share/automake-1.15/am/tags.am: warning: redefinition of 'ctags' ...
/usr/share/automake-1.15/am/program.am: ... 'ctags$(EXEEXT)' previously defined here
Makefile.am:6:   while processing program 'ctags'
autoreconf-2.69: Leaving directory `.'
optlib2c: translating make[1]: to make[1]:.c
cannot open the optlib file: "make[1]:" at ./misc/optlib2c line 220.
optlib2c: translating Entering to Entering.c
cannot open the optlib file: "Entering" at ./misc/optlib2c line 220.
optlib2c: translating directory to directory.c
cannot open the optlib file: "directory" at ./misc/optlib2c line 220.
optlib2c: translating '/var/tmp/portage/dev-util/ctags-20161028/work/ctags-20161028' to '/var/tmp/portage/dev-util/ctags-20161028/work/ctags-20161028'.c
./autogen.sh: line 10: '/var/tmp/portage/dev-util/ctags-20161028/work/ctags-20161028'.c: No such file or directory
optlib2c: translating optlib/CoffeeScript.ctags to optlib/CoffeeScript.c
optlib2c: translating optlib/ctags-optlib.ctags to optlib/ctags-optlib.c
optlib2c: translating optlib/gdbinit.ctags to optlib/gdbinit.c
optlib2c: translating optlib/man.ctags to optlib/man.c
optlib2c: translating optlib/pod.ctags to optlib/pod.c
optlib2c: translating make[1]: to make[1]:.c
cannot open the optlib file: "make[1]:" at ./misc/optlib2c line 220.
optlib2c: translating Leaving to Leaving.c
cannot open the optlib file: "Leaving" at ./misc/optlib2c line 220.
optlib2c: translating directory to directory.c
cannot open the optlib file: "directory" at ./misc/optlib2c line 220.
optlib2c: translating '/var/tmp/portage/dev-util/ctags-20161028/work/ctags-20161028' to '/var/tmp/portage/dev-util/ctags-20161028/work/ctags-20161028'.c
./autogen.sh: line 10: '/var/tmp/portage/dev-util/ctags-20161028/work/ctags-20161028'.c: No such file or directory
 * ERROR: dev-util/ctags-20161028::gentoo failed (prepare phase):
 *   (no error message)
 * 
 * Call stack:
 *     ebuild.sh, line 115:  Called src_prepare
 *   environment, line 381:  Called die
 * The specific snippet of code:
 *       ./autogen.sh || die
 * 
 * If you need support, post the output of `emerge --info '=dev-util/ctags-20161028::gentoo'`,
 * the complete build log and the output of `emerge -pqv '=dev-util/ctags-20161028::gentoo'`.
 * The complete build log is located at '/var/tmp/portage/dev-util/ctags-20161028/temp/build.log'.
 * The ebuild environment file is located at '/var/tmp/portage/dev-util/ctags-20161028/temp/environment'.
 * Working directory: '/var/tmp/portage/dev-util/ctags-20161028/work/ctags-20161028'
 * S: '/var/tmp/portage/dev-util/ctags-20161028/work/ctags-20161028'

 * Messages for package dev-util/ctags-20161028:

 * ERROR: dev-util/ctags-20161028::gentoo failed (prepare phase):
 *   (no error message)
 * 
 * Call stack:
 *     ebuild.sh, line 115:  Called src_prepare
 *   environment, line 381:  Called die
 * The specific snippet of code:
 *       ./autogen.sh || die
 * 
 * If you need support, post the output of `emerge --info '=dev-util/ctags-20161028::gentoo'`,
 * the complete build log and the output of `emerge -pqv '=dev-util/ctags-20161028::gentoo'`.
 * The complete build log is located at '/var/tmp/portage/dev-util/ctags-20161028/temp/build.log'.
 * The ebuild environment file is located at '/var/tmp/portage/dev-util/ctags-20161028/temp/environment'.
 * Working directory: '/var/tmp/portage/dev-util/ctags-20161028/work/ctags-20161028'
 * S: '/var/tmp/portage/dev-util/ctags-20161028/work/ctags-20161028'
../fnordpipe-overlay/Makefile:79: recipe for target 'system' failed
make: *** [system] Error 1

的问题

  • 两种方法(make&amp; shell invocation)有什么区别?
  • 如何跟进调查?

参考

如果有人想要复制它。

git clone https://github.com/fnordpipe/fnordpipe-overlay
WORKDIR=$(mktemp -d)
OVERLAYDIR="$(pwd)/fnordpipe-overlay"
mkdir $WORKDIR/rootfs/usr/local/fnordpipe-overlay
mount -o bind ./fnordpipe-overlay $WORKDIR/rootfs/usr/local/fnordpipe-overlay
cd $WORKDIR
make -f $OVERLAYDIR/Makefile chroot
make -f $OVERLAYDIR/Makefile system # <- fails in cause of the described problem

chroot ./rootfs /env.sh emerge -q dev-util/ctags # <- succeeds

附加

misc/dist-test-cases: line 9: git: command not found

这是一个可选脚本。在git之前安装ctags时,会抛出错误,表明没有.git目录。 ctags源是从tarbal获取而不是从git获取。没关系。

添加环境变量列表(在chroot内)以查看是否与emerge或ctags构建存在冲突。

XDG_VTNR=1
MANPATH=/usr/local/share/man:/usr/share/man:/usr/share/gcc-data/x86_64-pc-linux-gnu/4.9.4/man:/usr/share/binutils-data/x86_64-pc-linux-gnu/2.25.1/man
XDG_SESSION_ID=XX
TERM=xterm-256color
SHELL=/bin/bash
MAKEFLAGS=
KONSOLE_DBUS_SERVICE=:X.YZ
KONSOLE_PROFILE_NAME=New Profile
GS_LIB=/home/XX/.fonts
WINDOWID=XXXXXXXX
SHELL_SESSION_ID=XXXXXXXXXXXXXXXXXX
GTK_MODULES=canberra-gtk-module
QSG_RENDER_LOOP=
KDE_FULL_SESSION=true
XDG_SESSION_CLASS=user
USER=XX
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.cfg=00;32:*.conf=00;32:*.diff=00;32:*.doc=00;32:*.ini=00;32:*.log=00;32:*.patch=00;32:*.pdf=00;32:*.ps=00;32:*.tex=00;32:*.txt=00;32:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
GUILE_LOAD_PATH=/usr/share/guile/1.8
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session1
MAKE_TERMOUT=true
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
MULTIOSDIRS=../lib64:../lib32
QT_AUTO_SCREEN_SCALE_FACTOR=0
MAKELEVEL=1
SESSION_MANAGER=local/jay:@/tmp/.ICE-unix/636,unix/jay:/tmp/.ICE-unix/636
PAGER=/usr/bin/less
CONFIG_PROTECT_MASK=/etc/gentoo-release /etc/sandbox.d /etc/terminfo /etc/ca-certificates.conf
MFLAGS=
MAIL=/var/spool/mail/XX
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.9.4
DESKTOP_SESSION=/usr/share/xsessions/plasma
PWD=/
XDG_SESSION_TYPE=x11
EDITOR=/bin/nano
KONSOLE_DBUS_WINDOW=/Windows/1
KDE_SESSION_UID=XXXX
LANG=en_US.UTF-8
KONSOLE_DBUS_SESSION=/Sessions/1
COLORFGBG=15;0
SHLVL=5
XDG_SEAT=seat0
HOME=/root
MANPAGER=manpager
LANGUAGE=
KDE_SESSION_VERSION=5
XCURSOR_THEME=breeze_cursors
LESS=-R -M --shift 5
LOGNAME=XX
XDG_SESSION_DESKTOP=KDE
MAKE_TERMERR=true
GCC_SPECS=
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/XXXX/bus
XDG_DATA_DIRS=/usr/share:/usr/share:/usr/local/share
LESSOPEN=|lesspipe %s
INFOPATH=/usr/share/info:/usr/share/gcc-data/x86_64-pc-linux-gnu/4.9.4/info:/usr/share/binutils-data/x86_64-pc-linux-gnu/2.25.1/info
DISPLAY=:0
PROFILEHOME=
XDG_RUNTIME_DIR=/run/user/XXXX
XDG_CURRENT_DESKTOP=KDE
container=lxc
CONFIG_PROTECT=/usr/share/gnupg/qualified.txt
COLORTERM=truecolor
QMLSCENE_DEVICE=
XAUTHORITY=/home/XX/.Xauthority
_=/usr/bin/env

修改

检查环境变量就行了。 发现了以下变量,当它们在chroot中被取消时,那么通过makefile构建ctags工作正常。

unset MAKEFLAGS
unset MAKELEVEL
unset MAKE_TERMOUT
unset MAKE_TERMERR

不确切知道是哪一个做到了但现在我不明白背后的魔力。有人可以解决吗?

0 个答案:

没有答案