Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:adrianSuSE
build
build-recipe-spec
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File build-recipe-spec of Package build
# # spec specific functions. # ################################################################ # # Copyright (c) 1995-2014 SUSE Linux Products GmbH # Copyright (c) 2022 Andreas Stieger <Andreas.Stieger@gmx.de> # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 or 3 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program (see the file COPYING); if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA # ################################################################ recipe_setup_spec() { spec_setup_stages "$BUILD_RPM_BUILD_STAGE" TOPDIR=`chroot $BUILD_ROOT su -c "rpm --eval '%_topdir'" - $BUILD_USER` if test -z "$TOPDIR"; then cleanup_and_exit 1 "Error: TOPDIR empty" fi test "$DO_INIT_TOPDIR" = false || spec_init_topdir mkdir -p $BUILD_ROOT$TOPDIR/{BUILD,SOURCES,SPECS,SRPMS,BUILDROOT,OTHER,RPMS/noarch,RPMS/i386,RPMS/$(uname -m)} copy_sources "$MYSRCDIR" "$BUILD_ROOT$TOPDIR/SOURCES/" chown -hR "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR" } spec_get_buildtarget() { local args=() if test -n "$BUILD_FLAVOR" ; then args[${#args[@]}]="--buildflavor" args[${#args[@]}]="$BUILD_FLAVOR" fi if test -n "$OBS_PACKAGE" ; then args[${#args[@]}]="--obspackage" args[${#args[@]}]="$OBS_PACKAGE" fi queryrecipe "${args[@]}" --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" "$BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE" buildtarget } recipe_prepare_spec() { # fixup specfile args=() if test -n "$RELEASE" ; then args[${#args[@]}]="--release" args[${#args[@]}]="$RELEASE" fi if test -n "$BUILD_FLAVOR" ; then args[${#args[@]}]="--buildflavor" args[${#args[@]}]="$BUILD_FLAVOR" fi if test -n "$OBS_PACKAGE" ; then args[${#args[@]}]="--obspackage" args[${#args[@]}]="$OBS_PACKAGE" fi if test -n "$CHANGELOG" -a -f "$BUILD_ROOT/.build-changelog" ; then args[${#args[@]}]="--changelog" args[${#args[@]}]="$BUILD_ROOT/.build-changelog" fi substitutedeps "${args[@]}" --root "$BUILD_ROOT" --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" "$BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE" "$BUILD_ROOT/.spec.new" || cleanup_and_exit 1 # report specfile changes if test -f $BUILD_ROOT/.spec.new ; then if ! cmp -s $BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE $BUILD_ROOT/.spec.new ; then echo ----------------------------------------------------------------- echo "I have the following modifications for $RECIPEFILE:" sed -e "/^%changelog/q" $BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE > $BUILD_ROOT/.spec.t1 sed -e "/^%changelog/q" $BUILD_ROOT/.spec.new > $BUILD_ROOT/.spec.t2 diff $BUILD_ROOT/.spec.t1 $BUILD_ROOT/.spec.t2 rm -f $BUILD_ROOT/.spec.t1 $BUILD_ROOT/.spec.t2 mv $BUILD_ROOT/.spec.new $BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE else rm -f $BUILD_ROOT/.spec.new fi fi # fix rpmrc if we are compiling for i686 test -f $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 && mv $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 $BUILD_ROOT/usr/lib/rpm/rpmrc if test -e $BUILD_ROOT/usr/lib/rpm/rpmrc -a "$BUILD_ARCH" != "${BUILD_ARCH#i686}" ; then mv $BUILD_ROOT/usr/lib/rpm/rpmrc $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 sed -e 's/^buildarchtranslate: athlon.*/buildarchtranslate: athlon: i686/' -e 's/^buildarchtranslate: i686.*/buildarchtranslate: i686: i686/' < $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 > $BUILD_ROOT/usr/lib/rpm/rpmrc fi # extract optflags from configuration queryconfig --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" optflags ${BUILD_DEBUG:+debug} > $BUILD_ROOT/root/.rpmrc test $BUILD_USER = abuild && cp -p $BUILD_ROOT/root/.rpmrc $BUILD_ROOT/home/abuild/.rpmrc if test -z "$ABUILD_TARGET"; then ABUILD_TARGET=$(spec_get_buildtarget) test -z "$ABUILD_TARGET" && ABUILD_TARGET=$(queryconfig target --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" ) test -z "$ABUILD_TARGET" || echo "build target is $ABUILD_TARGET" fi } spec_is_empty_dir() { local d for d in "$1"/* ; do test -e "$d" && return 1 done return 0 } spec_init_topdir() { local d keepbuild keepbuildroot case "${rpmstages[0]}" in -b[ci]\ --short-circuit) keepbuild=BUILD ;; -bb\ --short-circuit | -bl) keepbuild=BUILD keepbuildroot=BUILDROOT ;; esac test -n "$RPM_BUILD_IN_PLACE" && unset keepbuild if test -n "$keepbuild$keepbuildroot" ; then for d in $keepbuild $keepbuildroot ; do spec_is_empty_dir "$BUILD_ROOT$TOPDIR/$d" && cleanup_and_exit 1 "need files in $TOPDIR/$d for '${rpmstages[0]}'" done for d in "$BUILD_ROOT$TOPDIR"/* "$BUILD_ROOT$TOPDIR"/.[^.]* ; do test "$d" = "$BUILD_ROOT$TOPDIR/$keepbuild" -o "$d" = "$BUILD_ROOT$TOPDIR/$keepbuildroot" && continue rm -rf "$d" done else rm -rf "$BUILD_ROOT$TOPDIR" fi } spec_setup_stages() { local stage="$1" test "$stage#-b[a-z]" != "$stage" && stage="${stage#-b}" # compat local xstage=pciba origstage="$stage" case $stage in "") stage=pciba ;; [lr]) ;; [pciba]) stage="${xstage%$stage*}$stage" ;; [pcibalr]=) stage="${stage%=}" ;; [pciba]+) stage="${stage%+}${xstage#*${stage%+}}" ;; s+ | s= | s) stage=s ;; *) cleanup_and_exit 1 "unknown stage '$stage'" ;; esac stage=${stage//s/a} # drop p/a stages in build-in-place mode unless requested test -n "$RPM_NOPREP" -a "$stage" != p -a "$origstage" = "${origstage/p/}" && stage="${stage#p}" test -n "$RPM_BUILD_IN_PLACE" -a "$stage" != a -a "$origstage" = "${origstage/[as]/}" && stage="${stage%a}" rpmstages=() case $stage in p | pc | pci | pcib | pciba) rpmstages[${#rpmstages[@]}]="-b${stage: -1}" ; stage= ;; c | ci | cib | ciba) rpmstages[${#rpmstages[@]}]="--noprep -b${stage: -1}" ; stage= ;; esac while test -n "$stage" ; do local opt="-b${stage:0:1}" case "${stage:0:1}" in a) opt="-bs" ;; [cib]) opt="$opt --short-circuit" ;; esac rpmstages[${#rpmstages[@]}]="$opt" stage=${stage:1} done } recipe_build_spec() { rpmbuild=rpmbuild test -x $BUILD_ROOT/usr/bin/rpmbuild || rpmbuild=rpm test "$BUILDTYPE" = debbuild && rpmbuild=debbuild HAVE_DYNAMIC_BUILDREQUIRES= if grep -E '^%generate_buildrequires' "$BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE" >/dev/null ; then HAVE_DYNAMIC_BUILDREQUIRES=true fi # XXX: move _srcdefattr to macro file? rpmbopts=("--define" "_srcdefattr (-,root,root)") if test "$DO_CHECKS" != true ; then if chroot "$BUILD_ROOT" "$rpmbuild" --nocheck --help >/dev/null 2>&1; then rpmbopts[${#rpmbopts[@]}]="--nocheck" else echo "warning: --nocheck is not supported by this $rpmbuild version" fi fi if test "$rpmbuild" == "debbuild" ; then rpmbopts[${#rpmbopts[@]}]="-vv" fi if test "$rpmbuild" == "rpmbuild" ; then # use only --nosignature for rpm v4 rpmbopts[${#rpmbopts[@]}]="--nosignature" fi if test -n "$RPM_BUILD_IN_PLACE" ; then rpmbopts[${#rpmbopts[@]}]="--build-in-place" fi if test -n "$ABUILD_TARGET" ; then rpmbopts[${#rpmbopts[@]}]="--target=$ABUILD_TARGET" fi # sysroot packages are not in the database if test -n "$ABUILD_TARGET" -a -d "$BUILD_ROOT/.build.sysroot" ; then rpmbopts[${#rpmbopts[@]}]="--nocheck" rpmbopts[${#rpmbopts[@]}]="--nodeps" fi if test -n "$BUILD_DEBUG" ; then rpmbopts[${#rpmbopts[@]}]='--define' rpmbopts[${#rpmbopts[@]}]="_build_create_debug 1" fi # OBS Debuginfo flag support for Red Hat family if test -z "$BUILD_DEBUG" ; then # only when rpmbuild knows --undefine if chroot $BUILD_ROOT $rpmbuild --undefine --help >& /dev/null; then rpmbopts[${#rpmbopts[@]}]='--undefine' rpmbopts[${#rpmbopts[@]}]="_enable_debug_packages" fi fi if test -n "$DISTURL" ; then rpmbopts[${#rpmbopts[@]}]='--define' rpmbopts[${#rpmbopts[@]}]="disturl $DISTURL" fi if test -n "$RSYNCDONE" ; then rpmbopts[${#rpmbopts[@]}]='--define' rpmbopts[${#rpmbopts[@]}]="RSYNCDONE 1" fi buildrootoverride=$(queryconfig --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" buildflags rpm-buildroot-override) if test -n "$buildrootoverride" ; then rpmbopts[${#rpmbopts[@]}]='--buildroot' rpmbopts[${#rpmbopts[@]}]="$buildrootoverride" fi GEN_BUILDREQS_PACKS=() if test -n "$HAVE_DYNAMIC_BUILDREQUIRES" ; then # query dynamic build requires rm -f "$BUILD_ROOT$TOPDIR/SRPMS/"*.buildreqs.nosrc.rpm toshellscript $rpmbuild \ --nodeps \ "${definesnstuff[@]}" \ -br \ "${rpmbopts[@]}" \ "$TOPDIR/SOURCES/$RECIPEFILE" \ > $BUILD_ROOT/.build.command chmod 755 $BUILD_ROOT/.build.command chroot $BUILD_ROOT su -c /.build.command - $BUILD_USER < /dev/null st=$? if test "$st" != 0 -a "$st" != 11 ; then return fi : > $BUILD_ROOT$TOPDIR/OTHER/_generated_buildreqs if test "$st" = 11 ; then reqsfile= for i in "$BUILD_ROOT$TOPDIR/SRPMS/"*.buildreqs.nosrc.rpm ; do test -f "$i" && reqsfile=${i##*/} done test -n "$reqsfile" || cleanup_and_exit 1 "no buildreqs.nosrc.rpm file?" chroot $BUILD_ROOT rpm -qp --requires "$TOPDIR/SRPMS/$reqsfile" | grep -v '^rpmlib(' | sort -u > $BUILD_ROOT$TOPDIR/OTHER/_generated_buildreqs_tmp chroot $BUILD_ROOT rpmspec -q --srpm --requires "$TOPDIR/SOURCES/$RECIPEFILE" >> $BUILD_ROOT$TOPDIR/OTHER/_generated_buildreqs_tmp || cleanup_and_exit 1 "rpm -q --spec failed" sort < $BUILD_ROOT$TOPDIR/OTHER/_generated_buildreqs_tmp | uniq -u > $BUILD_ROOT$TOPDIR/OTHER/_generated_buildreqs rm -f $BUILD_ROOT$TOPDIR/OTHER/_generated_buildreqs_tmp while read db ; do GEN_BUILDREQS_PACKS[${#GEN_BUILDREQS_PACKS[@]}]="$db" done < $BUILD_ROOT$TOPDIR/OTHER/_generated_buildreqs fi rm -f "$BUILD_ROOT$TOPDIR/SRPMS/"*.buildreqs.nosrc.rpm fi for rpmstage in "${rpmstages[@]}" ; do # su involves a shell which would require even more # complicated quoting to bypass than this toshellscript $rpmbuild \ "${definesnstuff[@]}" \ $rpmstage \ "${rpmbopts[@]}" \ "$TOPDIR/SOURCES/$RECIPEFILE" \ > $BUILD_ROOT/.build.command chmod 755 $BUILD_ROOT/.build.command check_exit local build_command="/.build.command" test -n "$RPM_BUILD_IN_PLACE" && build_command="cd /.build.packages/SOURCES && $build_command" chroot $BUILD_ROOT su -c "$build_command" - $BUILD_USER < /dev/null st=$? test "$st" = 0 || break done test "$st" = 0 && BUILD_SUCCEEDED=true test "$st" = 11 -a -n "$HAVE_DYNAMIC_BUILDREQUIRES" && BUILD_SUCCEEDED=genbuildreqs } recipe_resultdirs_spec() { echo RPMS SRPMS } recipe_cleanup_spec() { : } recipe_unpack_srcrpm() { local srpm="$1" test -n "$LIST_STATE" || echo "processing src rpm $srpm ..." MYSRCDIR="$BUILD_ROOT/.build-srcdir" rm -rf "$MYSRCDIR" mkdir -p "$MYSRCDIR" cd "$MYSRCDIR" || cleanup_and_exit 1 $BUILD_DIR/unrpm -q "$srpm" || cleanup_and_exit 1 "Could not unpack $srpm." for RECIPEFILE in *.spec ; do : ; done RECIPEPATH="$MYSRCDIR/$RECIPEFILE" } # post build functions... move somewhere else? recipe_check_file_owners() { echo "... checking for files with abuild user/group" BADFILE= while read un gn fn ; do if test "$un" = abuild -o "$gn" = abuild -o "$un" = ${ABUILD_UID} -o "$gn" = ${ABUILD_GID} ; then echo " $un $gn $fn" BADFILE=true fi done < <(rpm -qp --qf '[%{FILEUSERNAME} %{FILEGROUPNAME} %{FILENAMES}\n]' $RPMS) if test -n "$BADFILE" ; then cleanup_and_exit 1 "please fix your filelist (e.g. add defattr)" fi } recipe_run_rpmlint() { # SUSE builds are using a special rpmlint binary which is not # pulling in additional dependencies local rpmlint="/opt/testing/bin/rpmlint" if ! test -x "$BUILD_ROOT$rpmlint" ; then # default rpmlint place as fallback rpmlint="/usr/bin/rpmlint" fi if ! test -x "$BUILD_ROOT$rpmlint" ; then return fi LINT_RPM_FILE_LIST=($(find $BUILD_ROOT/$TOPDIR/RPMS \ \( -name "*-debuginfo-*" -o -name "*-debugsource-*" \ -o -name "*-32bit-*" -o -name "*-64bit-*" \ -o -name "*-x86-*" -o -name "*-ia32-*" \) -prune \ -o -type f -name '*.rpm' -print)) SRPM_FILE_LIST=($(find $BUILD_ROOT/$TOPDIR/SRPMS -type f -name "*.rpm")) echo echo "RPMLINT report:" echo "===============" rpmlint_logfile=$TOPDIR/OTHER/rpmlint.log rm -f "$BUILD_ROOT$rpmlint_logfile" ret=0 chroot $BUILD_ROOT su -s $rpmlint "$BUILD_USER" -- \ --info ${LINT_RPM_FILE_LIST[*]#$BUILD_ROOT} \ ${SRPM_FILE_LIST[*]#$BUILD_ROOT} > >(tee "$BUILD_ROOT$rpmlint_logfile") 2>&1 || ret=1 echo if test "$ret" = 1 ; then cleanup_and_exit 1 fi } recipe_compare_oldpackages() { if test -x "$BUILD_ROOT/usr/lib/build/same-build-result.sh" ; then echo "... comparing built packages with the former built" if chroot $BUILD_ROOT /usr/lib/build/same-build-result.sh /.build.oldpackages "$TOPDIR/RPMS" "$TOPDIR/SRPMS"; then chroot $BUILD_ROOT touch /.build/.same_result_marker # XXX: dirty build service hack. fix bs_worker. Search for # 'same_result_marker' for traces of a first try to get rid of this if test -n "$REASON" -a -n "$DISTURL" ; then exitcode=2 fi fi fi } recipe_create_deltarpms() { if test -x "$BUILD_ROOT/usr/bin/makedeltarpm" -a -x $BUILD_ROOT/usr/lib/build/mkdrpms ; then echo "... creating delta rpms" ds=("$BUILD_ROOT/$TOPDIR"/RPMS/* "$BUILD_ROOT$TOPDIR/SRPMS") chroot $BUILD_ROOT /usr/lib/build/mkdrpms /.build.oldpackages "${ds[@]#$BUILD_ROOT}" fi }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor