summaryrefslogtreecommitdiffstats
path: root/meta/recipes-extended/bash/bash.inc
blob: e541161c7579481f1e0d64dae60d61123efa7145 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
SUMMARY = "An sh-compatible command language interpreter"
HOMEPAGE = "http://tiswww.case.edu/php/chet/bash/bashtop.html"
DESCRIPTION = "Bash is the GNU Project's Bourne Again SHell, a complete implementation of the IEEE POSIX and Open Group shell specification with interactive command line editing, job control on architectures that support it, csh-like features such as history substitution and brace expansion, and a slew of other features."
SECTION = "base/shell"

DEPENDS = "ncurses bison-native virtual/libiconv"

inherit autotools gettext texinfo update-alternatives ptest

EXTRA_AUTORECONF += "--exclude=autoheader"
EXTRA_OECONF = "--enable-job-control --without-bash-malloc bash_cv_wexitstatus_offset=8"

# If NON_INTERACTIVE_LOGIN_SHELLS is defined, all login shells read the
# startup files, even if they are not interactive.
# This is what other major distros do. And this is what we wanted. See bug#5359 and bug#7137.
CFLAGS += "-DNON_INTERACTIVE_LOGIN_SHELLS"

# This can vary depending upon the host
CFLAGS += "-DHEREDOC_PIPESIZE=65536"

# Disable bracketed paste mode by default (enabled by default in bash 5.1). It
# causes a lot of garbage in non-interactive shells
CFLAGS += "-DBRACKETED_PASTE_DEFAULT=0"

ALTERNATIVE:${PN} = "bash sh"
ALTERNATIVE_LINK_NAME[bash] = "${base_bindir}/bash"
ALTERNATIVE_TARGET[bash] = "${base_bindir}/bash"
ALTERNATIVE_LINK_NAME[sh] = "${base_bindir}/sh"
ALTERNATIVE_TARGET[sh] = "${base_bindir}/bash.${BPN}"
ALTERNATIVE_PRIORITY = "100"

RDEPENDS:${PN} += "base-files"
RDEPENDS:${PN}:class-nativesdk = ""
RDEPENDS:${PN}-ptest += "make coreutils perl sed shadow util-linux-setpriv"

RDEPENDS:${PN}-ptest:append:libc-glibc = " \
	glibc-gconv-big5hkscs \
	glibc-gconv-iso8859-1 \
	glibc-utils \
	locale-base-de-de \
	locale-base-en-us \
	locale-base-fr-fr \
	locale-base-fr-fr.iso-8859-1 \
	locale-base-zh-hk.big5-hkscs \
	"

CACHED_CONFIGUREVARS += "headersdir=${includedir}/${PN}"

do_configure:prepend () {
    if [ ! -e ${S}/acinclude.m4 ]; then
       cat ${S}/aclocal.m4 > ${S}/acinclude.m4
    fi
}

do_compile:prepend() {
    # Remove any leftover .build files. This ensures that bash always has the
    # same version number and keeps builds reproducible
    rm -f ${B}/.build
}

do_compile_ptest () {
	oe_runmake buildtest
}

do_install:prepend () {
	# Ensure determinism as this counter increases for each make call
	rm -f ${B}/.build
}

do_install:append () {
	# Move /usr/bin/bash to /bin/bash, if need
	if [ "${base_bindir}" != "${bindir}" ]; then
		mkdir -p ${D}${base_bindir}
		mv ${D}${bindir}/bash ${D}${base_bindir}
	fi
}

fix_absolute_paths () {
	# Clean buildhost references in bashbug
	sed -i -e "s,--sysroot=${STAGING_DIR_TARGET},,g" \
		-e "s,-I${WORKDIR}/\S* ,,g" \
		-e 's|${DEBUG_PREFIX_MAP}||g' \
		${D}${bindir}/bashbug

	# Clean buildhost references in bash.pc
	sed -i -e "s,--sysroot=${STAGING_DIR_TARGET},,g" \
	     ${D}${libdir}/pkgconfig/bash.pc

	# Clean buildhost references in Makefile.inc
	sed -i -e "s,--sysroot=${STAGING_DIR_TARGET},,g" \
		-e 's|${DEBUG_PREFIX_MAP}||g' \
		-e 's:${HOSTTOOLS_DIR}/::g' \
		-e 's:${BASE_WORKDIR}/${MULTIMACH_TARGET_SYS}::g' \
		${D}${libdir}/bash/Makefile.inc
}

do_install:append:class-target () {
	fix_absolute_paths
}

do_install:append:class-nativesdk () {
	fix_absolute_paths
}

do_install_ptest () {
	make INSTALL_TEST_DIR=${D}${PTEST_PATH}/tests install-test
	cp ${B}/Makefile ${D}${PTEST_PATH}
	cp ${B}/config.h ${D}${PTEST_PATH}
	cp ${B}/version.h ${D}${PTEST_PATH}
	cp ${S}/y.tab.[ch] ${D}${PTEST_PATH}
	install -D ${WORKDIR}/run-bash-ptests ${D}${PTEST_PATH}/run-bash-ptests
        sed -i -e 's/^Makefile/_Makefile/' -e "s,--sysroot=${STAGING_DIR_TARGET},,g" \
	    -e 's|${DEBUG_PREFIX_MAP}||g' \
	    -e 's|${BUILD_LDFLAGS}||g' \
	    -e "s,${S},,g" -e "s,${B},,g" -e "s,${STAGING_DIR_NATIVE},,g" \
	    -e 's:${HOSTTOOLS_DIR}/::g' \
	    -e 's:${UNINATIVE_LOADER}:${base_bindir}/false:g' \
	     ${D}${PTEST_PATH}/Makefile
}
# The uninative loader is different on i386 & x86_64 hosts. Since it is only
# being replaced with /bin/false anyway, it doesn't need to be part of the task
# hash
do_install_ptest[vardepsexclude] += "UNINATIVE_LOADER"

pkg_postinst:${PN} () {
	grep -q "^${base_bindir}/bash$" $D${sysconfdir}/shells || echo ${base_bindir}/bash >> $D${sysconfdir}/shells
}

pkg_postrm:${PN} () {
	printf "$(grep -v "^${base_bindir}/bash$" $D${sysconfdir}/shells)\n" > $D${sysconfdir}/shells
}

PACKAGES += "${PN}-bashbug"
FILES:${PN} = "${bindir}/bash ${base_bindir}/bash.bash"
FILES:${PN}-bashbug = "${bindir}/bashbug"

PACKAGE_BEFORE_PN += "${PN}-loadable"
RDEPENDS:${PN}-loadable += "${PN}"
FILES:${PN}-loadable += "${libdir}/bash/*"

# Limit the RPROVIDES here to class target so that if usrmerge is enabled for nativesdk, it does not
# include host system paths in /bin/
RPROVIDES:${PN}:append:class-target = " ${@bb.utils.contains('DISTRO_FEATURES', 'usrmerge', '/bin/sh /bin/bash', '', d)}"