build: more plumbing to make plugins work like ports

This commit is contained in:
Franco Fichtner 2016-07-05 10:08:50 +02:00
parent 81d78b75fc
commit 05f7f08a11
5 changed files with 78 additions and 52 deletions

View File

@ -412,6 +412,33 @@ extract_packages()
fi
}
search_packages()
{
BASEDIR=${1}
shift
PKGLIST=${@}
echo ">>> Searching packages in ${BASEDIR}: ${PKGLIST}"
for PKG in ${PKGLIST}; do
# exact matching according to package name
for PKGFILE in $(cd ${BASEDIR}${PACKAGESDIR}; \
find All -type f); do
PKGINFO=$(pkg -c ${BASEDIR} info -F ${PACKAGESDIR}/${PKGFILE} | grep ^Name | awk '{ print $3; }')
if [ ${PKG} = ${PKGINFO} ]; then
return 0
fi
done
# match using globbing as a second pass
for PKGGLOB in $(cd ${BASEDIR}${PACKAGESDIR}; \
find All -name "${PKG}" -type f); do
return 0
done
done
return 1
}
remove_packages()
{
BASEDIR=${1}
@ -421,7 +448,7 @@ remove_packages()
echo ">>> Removing packages in ${BASEDIR}: ${PKGLIST}"
for PKG in ${PKGLIST}; do
# clear out the ports that ought to be rebuilt
# exact matching according to package name
for PKGFILE in $(cd ${BASEDIR}${PACKAGESDIR}; \
find All -type f); do
PKGINFO=$(pkg -c ${BASEDIR} info -F ${PACKAGESDIR}/${PKGFILE} | grep ^Name | awk '{ print $3; }')
@ -429,7 +456,7 @@ remove_packages()
rm ${BASEDIR}${PACKAGESDIR}/${PKGFILE}
fi
done
# if globbing matches, remove too
# match using globbing as a second pass
for PKGGLOB in $(cd ${BASEDIR}${PACKAGESDIR}; \
find All -name "${PKG}" -type f); do
rm ${BASEDIR}${PACKAGESDIR}/${PKGGLOB}
@ -453,6 +480,27 @@ lock_packages()
done
}
bootstrap_packages()
{
BASEDIR=${1}
echo ">>> Bootstrapping packages in ${BASEDIR}"
for PKG in $({
cd ${BASEDIR}
# find all package files, omitting plugins
find .${PACKAGESDIR}/All -type f \
\! -name "os-*" \! -name "ospriv-*"
}); do
# Adds all available packages and removes the
# ones that cannot be installed due to missing
# dependencies. This behaviour is desired.
if ! pkg -c ${BASEDIR} add ${PKG}; then
rm -r ${BASEDIR}/${PKG}
fi
done
}
install_packages()
{
BASEDIR=${1}
@ -464,44 +512,26 @@ install_packages()
# remove previous packages for a clean environment
pkg -c ${BASEDIR} remove -fya
if [ -z "${PKGLIST}" ]; then
for PKG in $({
# Adds all selected packages and fails if one cannot
# be installed. Used to build a runtime environment.
for PKG in pkg ${PKGLIST}; do
PKGFOUND=
for PKGFILE in $({
cd ${BASEDIR}
# find all package files, omitting plugins
find .${PACKAGESDIR}/All -type f \
\! -name "os-*" \! -name "ospriv-*"
find .${PACKAGESDIR}/All -name "${PKG}-*.txz"
}); do
# Adds all available packages and removes the
# ones that cannot be installed due to missing
# dependencies. This behaviour is desired.
if ! pkg -c ${BASEDIR} add ${PKG}; then
rm -r ${BASEDIR}/${PKG}
PKGINFO=$(pkg -c ${BASEDIR} info -F ${PKGFILE} | grep ^Name | awk '{ print $3; }')
if [ ${PKG} = ${PKGINFO} ]; then
PKGFOUND=${PKGFILE}
fi
done
else
# always bootstrap pkg as the first package
for PKG in pkg ${PKGLIST}; do
# Adds all selected packages and fails if
# one cannot be installed. Used to build
# a runtime environment.
PKGFOUND=
for PKGFILE in $({
cd ${BASEDIR}
find .${PACKAGESDIR}/All -name "${PKG}-*.txz"
}); do
PKGINFO=$(pkg -c ${BASEDIR} info -F ${PKGFILE} | grep ^Name | awk '{ print $3; }')
if [ ${PKG} = ${PKGINFO} ]; then
PKGFOUND=${PKGFILE}
fi
done
if [ -n "${PKGFOUND}" ]; then
pkg -c ${BASEDIR} add ${PKGFOUND}
else
echo "Could not find package: ${PKG}" >&2
exit 1
fi
done
fi
if [ -n "${PKGFOUND}" ]; then
pkg -c ${BASEDIR} add ${PKGFOUND}
else
echo "Could not find package: ${PKG}" >&2
exit 1
fi
done
# collect all installed packages (minus locked packages)
PKGLIST="$(pkg -c ${BASEDIR} query -e "%k != 1" %n)"

View File

@ -53,6 +53,7 @@ for CORE_TAG in ${CORE_TAGS}; do
CORE_NAME=${PRODUCT_TYPE}
CORE_FAMILY="release"
CORE_ARGS="CORE_NAME=${CORE_NAME} CORE_FAMILY=${CORE_FAMILY}"
CORE_DEPS=$(make -C ${STAGEDIR}${COREDIR} depends)
if [ -n "${*}" ]; then
setup_copy ${STAGEDIR} ${COREDIR}
@ -64,11 +65,8 @@ for CORE_TAG in ${CORE_TAGS}; do
fi
fi
CORE_DEPS=$(make -C ${STAGEDIR}${COREDIR} depends)
remove_packages ${STAGEDIR} ${CORE_NAME}
if [ -n "${CORE_DEPS}" ]; then
install_packages ${STAGEDIR} ${CORE_DEPS}
fi
install_packages ${STAGEDIR} ${CORE_DEPS}
custom_packages ${STAGEDIR} ${COREDIR} "${CORE_ARGS}"
done

View File

@ -33,29 +33,27 @@ SELF=plugins
check_packages ${SELF} ${@}
if [ -z "${*}" ]; then
PLUGINS_LIST=$(make -C ${PLUGINSDIR} list)
else
PLUGINS_LIST="${*}"
fi
setup_stage ${STAGEDIR}
setup_base ${STAGEDIR}
setup_clone ${STAGEDIR} ${PLUGINSDIR}
extract_packages ${STAGEDIR}
# register persistent packages to avoid bouncing
remove_packages ${STAGEDIR} ${@}
install_packages ${STAGEDIR} pkg git
lock_packages ${STAGEDIR}
PLUGINS_LIST=$(make -C ${PLUGINSDIR} list)
for PLUGIN in ${PLUGINS_LIST}; do
PLUGIN_NAME=$(make -C ${PLUGINSDIR}/${PLUGIN} name)
PLUGIN_DEPS=$(make -C ${PLUGINSDIR}/${PLUGIN} depends)
remove_packages ${STAGEDIR} ${PLUGIN_NAME}
if [ -n "${PLUGIN_DEPS}" ]; then
install_packages ${STAGEDIR} ${PLUGIN_DEPS}
if search_packages ${STAGEDIR} ${PLUGIN_NAME}; then
# already built
continue
fi
install_packages ${STAGEDIR} ${PLUGIN_DEPS}
custom_packages ${STAGEDIR} ${PLUGINSDIR}/${PLUGIN}
done

View File

@ -44,7 +44,7 @@ setup_distfiles ${STAGEDIR}
extract_packages ${STAGEDIR}
remove_packages ${STAGEDIR} ${@}
install_packages ${STAGEDIR}
bootstrap_packages ${STAGEDIR}
echo ">>> Building packages..."

View File

@ -38,7 +38,7 @@ setup_clone ${STAGEDIR} ${PLUGINSDIR}
setup_chroot ${STAGEDIR}
extract_packages ${STAGEDIR}
install_packages ${STAGEDIR} ${PRODUCT_TYPE} pear-PHP_CodeSniffer phpunit
install_packages ${STAGEDIR} pkg ${PRODUCT_TYPE} pear-PHP_CodeSniffer phpunit
# don't want to deinstall in case of testing...
# install all plugins, see if files clash