X-Git-Url: https://git.tld-linux.org/?a=blobdiff_plain;f=builder.sh;h=a6eb3d72279dc333a5ca7eff96c3ce7e5fd2e645;hb=refs%2Fheads%2Fmaster;hp=14f317ac24cc09de0b90933ba2b54191f2911238;hpb=4a622468cc1a2fe34b00641538f04d4d2bdf0b8b;p=packages%2Frpm-build-tools.git diff --git a/builder.sh b/builder.sh index 14f317a..b022e1f 100755 --- a/builder.sh +++ b/builder.sh @@ -97,6 +97,7 @@ LASTLOG_FILE="" CHMOD="no" CHMOD_MODE="0644" RPMOPTS="" +RPMUSERDEFS="" RPMBUILDOPTS="" BCOND="" GROUP_BCONDS="no" @@ -120,8 +121,13 @@ PARALLEL_DOWNLOADS=10 WGET_RETRIES=${MAX_WGET_RETRIES:-0} +# .distbcond URL +DISTBCOND_URL="https://src.tld-linux.org/.distbcond" + # rsync repository with git refs of packages -PKGREVS_URL="http://pkgrevs.tld-linux.org" +PKGREVS_URL="https://pkgrevs.tld-linux.org" +PKGREVS_PREFIX="tld/" +SETPKGREV="false" # TLD git/df config TLD_GIT_SERVER="git://git.tld-linux.org" @@ -335,13 +341,11 @@ usage() { # if the line contains short and long option, it will take only the long option # but if you want both being completed, put the short option to separate line echo "\ -Usage: builder [--all-branches] [-D|--debug] [-V|--version] [--short-version] [-a|--add_cvs] [-b|-ba|--build] -[-bb|--build-binary] [-bs|--build-source] [-bc] [-bi] [-bl] [-u|--try-upgrade] -[{-cf|--cvs-force}] [{-B|--branch} ] [--depth ] -[-g|--get] [-h|--help] [--ftp] [--http] [{-l|--logtofile} ] [-m|--mr-proper] -[-q|--quiet] [--date [-r ] [{-T|--tag ] -[-Tvs|--tag-version-stable] [-Ts|--tag-stable] [-Tv|--tag-version] -[{-Tp|--tag-prefix} ] [{-tt|--test-tag}] +Usage: builder [--all-branches] [-D|--debug] [-V|--version] [--short-version] +[-a|--add_cvs] [-b|-ba|--build] [-bb|--build-binary] [-bs|--build-source] +[-bc] [-bi] [-bl] [-u|--try-upgrade] [{-cf|--cvs-force}] [{-B|--branch} ] +[--depth ] [-g|--get] [-h|--help] [--ftp] [--http] [{-l|--logtofile} ] +[-m|--mr-proper] [-q|--quiet] [--date ] [-r ] [-nu|--no-urls] [-v|--verbose] [--opts ] [--short-circuit] [--show-bconds] [--with/--without ] [--define ] [--git-pld|--git-tld] [--pkgrev] [-lp] @@ -442,18 +446,6 @@ Usage: builder [--all-branches] [-D|--debug] [-V|--version] [--short-version] [ but icon file is absent), -su, --source-urls - list urls - urls to sources and patches intended for copying urls with spec with lots of macros in urls --T , --tag - - add git tag for files, --Tvs, --tag-version-stable - - add git tags STABLE and NAME-VERSION-RELEASE for files, --Ts, --tag-stable - - add git tag STABLE for files, --Tv, ---tag-version - add git tag NAME-VERSION-RELEASE for files, --Tp, --tag-prefix - - add to NAME-VERSION-RELEASE tags, --tt, --test-tag - - fail if tag is already present, -ir, --integer-release-only - allow only integer and snapshot releases -v, --verbose - be verbose, @@ -733,21 +725,27 @@ EOF if ! is_rpmorg; then local safe_macrofiles safe_macrofiles=$(rpm $TARGET_SWITCH --showrc | awk -F: '/^macrofiles/ { gsub(/^macrofiles[ \t]+:/, "", $0); print $0 } ') - eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --macros "$safe_macrofiles:$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1 + eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --macros "$safe_macrofiles:$BUILDER_MACROS" $QUIET $RPMOPTS $RPMUSERDEFS $RPMBUILDOPTS $BCOND $* 2>&1 else - eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --load "$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1 + eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --load "$BUILDER_MACROS" $QUIET $RPMOPTS $RPMUSERDEFS $RPMBUILDOPTS $BCOND $* 2>&1 fi } cache_rpm_dump() { + local SPEC_PATH if [ -n "$DEBUG" ]; then set -x set -v fi + if [ ! -z "$1" ]; then + SPEC_PATH="$1" + else + SPEC_PATH="$PACKAGE_DIR/$SPECFILE" + fi if [ -x /usr/bin/rpm-specdump ]; then update_shell_title "cache_rpm_dump using rpm-specdump command" - rpm_dump_cache=$(rpm-specdump $TARGET_SWITCH $BCOND --define "_specdir $PACKAGE_DIR" --define "_sourcedir $PACKAGE_DIR" $PACKAGE_DIR/$SPECFILE) + rpm_dump_cache=$(eval rpm-specdump $TARGET_SWITCH $BCOND $RPMUSERDEFS --define \'_specdir $PACKAGE_DIR\' --define \'_sourcedir $PACKAGE_DIR\' $SPEC_PATH) else update_shell_title "cache_rpm_dump using rpmbuild command" local rpm_dump @@ -810,7 +808,7 @@ parse_spec() { get_icons cd $PACKAGE_DIR - cache_rpm_dump + cache_rpm_dump "$1" if rpm_dump | grep -qEi ":.*nosource.*1"; then FAIL_IF_NO_SOURCES="no" @@ -896,9 +894,9 @@ Exit_error() { remove_build_requires echo >&2 "Error: couldn't get out package name/version/release from spec file." exit 6 ;; - "err_tag_exists" ) + "err_pkgrev_exists" ) remove_build_requires - echo >&2 "Tag ${2} already exists" + echo >&2 "Error: package revision ${2} already exists" exit 9 ;; "err_fract_rel" ) remove_build_requires @@ -925,6 +923,9 @@ Exit_error() { "err_pkgrev_get" ) echo >&2 "Error: failed to get package revision for tag ${2}" exit 16 ;; + "err_distbcond_update" ) + echo >&2 "Error: failed to update .distbcond" + exit 17 ;; "err_not_implemented" ) remove_build_requires echo >&2 "Error: functionality not yet imlemented" @@ -941,7 +942,7 @@ init_builder() { fi if [ "$NOINIT" != "yes" ] ; then - TOP_DIR=$(eval $RPM $RPMOPTS --eval '%{_topdir}') + TOP_DIR=$(eval $RPM $RPMOPTS $RPMUSERDEFS --eval '%{_topdir}') local macros_ver=$(rpm -E %?rpm_build_macros) if [ -z "$macros_ver" ]; then @@ -1468,36 +1469,13 @@ get_files() { fi } -tag_exist() { -# If tag exists and points to other commit exit with error -# If it existsts and points to HEAD return 1 -# If it doesn't exist return 0 - local _tag="$1" - local sha1=$(git rev-parse HEAD) - echo "Searching for tag $_tag..." - if [ -n "$DEPTH" ]; then - local ref=$(git ls-remote $REMOTE_PLD "refs/tags/$_tag" | cut -c -40) - else - local ref=$(git show-ref -s "refs/tags/$_tag") - fi - [ -z "$ref" ] && return 0 - [ "$ref" = "$sha1" ] || Exit_error err_tag_exists "$_tag" - return 1 -} - -make_tagver() { +make_pkgrev() { if [ -n "$DEBUG" ]; then set -x set -v fi - # Check whether first character of PACKAGE_NAME is legal for tag name - if [ -z "${PACKAGE_NAME##[_0-9]*}" -a -z "$TAG_PREFIX" ]; then - TAG_PREFIX=tag_ - fi - - # NOTE: CVS tags may must not contain the characters `$,.:;@' - TAGVER=$(echo $TAG_PREFIX$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_RELEASE) + TAGVER=$(echo $PKGREVS_PREFIX$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_RELEASE) # Remove @kernel.version_release from TAGVER because tagging sources # could occur with different kernel-headers than kernel-headers used at build time. @@ -1510,37 +1488,6 @@ make_tagver() { echo -n "$TAGVER" } -tag_files() { - if [ -n "$DEBUG" ]; then - set -x - set -v - fi - - echo "Version: $PACKAGE_VERSION" - echo "Release: $PACKAGE_RELEASE" - - local _tag - if [ "$TAG_VERSION" = "yes" ]; then - _tag=`make_tagver` - fi - if [ -n "$TAG" ]; then - _tag="$TAG" - fi - echo "tag: $_tag" - - local OPTIONS="tag $CVS_FORCE" - - cd "$PACKAGE_DIR" - - if tag_exist $_tag || [ -n "$CVS_FORCE" ]; then - update_shell_title "tag sources: $_tag" - git $OPTIONS $_tag || exit - git push $IPOPT $CVS_FORCE $REMOTE_PLD tag $_tag || Exit_error err_remote_problem $REMOTE_PLD - else - echo "Tag $_tag already exists and points to the same commit" - fi -} - get_pkgrev() { [ -z "$1" ] && return 1 local _tmp=$(mktemp /tmp/.builder-XXXX) @@ -1553,12 +1500,8 @@ get_pkgrev() { set_pkgrev() { local _tag - if [ "$TAG_VERSION" = "yes" ]; then - _tag=`make_tagver` - fi - if [ -n "$TAG" ]; then - _tag="$TAG" - fi + parse_spec "$1" + _tag=`make_pkgrev` echo "Writing git revision for tag $_tag" local _tmp=$(mktemp /tmp/.builder-XXXX) rm $_tmp 2>/dev/null @@ -1568,7 +1511,7 @@ set_pkgrev() { rm $_tmp 2>/dev/null [ "$(get_pkgrev "$_tag")" = "$CVSTAG" ] && return 0 echo "$result" | grep -q -E "^OK$" && return 0 - echo "$result" | grep -q -E "^EXISTS$" && Exit_error err_tag_exists "$_tag" + echo "$result" | grep -q -E "^EXISTS$" && Exit_error err_pkgrev_exists "$_tag" Exit_error err_pkgrev_set } @@ -1751,12 +1694,22 @@ build_package() { local specdir=$(insert_gitlog $SPECFILE) ulimit -c unlimited # If required exclude directories with systemd related files from package contents - if grep -q -E 'systemd(unitdir|userunitdir|tmpfilesdir)' $specdir/$SPECFILE; then + if grep -q -E '(lib/(systemd|binfmt.d|sysctl.d|sysusers.d|tmpfiles.d)|systemd(unitdir|userunitdir|tmpfilesdir))' $specdir/$SPECFILE; then sed -i -e '/^%exclude_systemd_files/d; /^%files/s/$/\n%exclude_systemd_files/g;' $specdir/$SPECFILE fi + # Enable/disable distro wide bconds based on ~/.distbcond + process_distbcond "$specdir/$SPECFILE" + # Add %tld macro to release to allow release control + sed -i -r -e '/^Release:/s/%\{\?tld\}//g; s/^Release:\s+(.*)$/Release:\t\1%{?tld}/;' $specdir/$SPECFILE # FIXME: eval here is exactly why? - PATH=$CLEAN_PATH eval teeboth "'$logfile'" ${TIME_COMMAND} ${NICE_COMMAND} $RPMBUILD $TARGET_SWITCH $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $RPMBUILDOPTS $BCOND --define \'_specdir $PACKAGE_DIR\' --define \'_sourcedir $PACKAGE_DIR\' $specdir/$SPECFILE + PATH=$CLEAN_PATH eval teeboth "'$logfile'" ${TIME_COMMAND} ${NICE_COMMAND} $RPMBUILD $TARGET_SWITCH $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $RPMUSERDEFS $RPMBUILDOPTS $BCOND --define \'_specdir $PACKAGE_DIR\' --define \'_sourcedir $PACKAGE_DIR\' $specdir/$SPECFILE retval=$? + + # Set pkgrev if requested and build status is OK + if [ ! -z "$SETPKGREV" ] && [ "$SETPKGREV" = "true" ] && [ "$retval" -eq "0" ]; then + set_pkgrev "$specdir/$SPECFILE" + fi + rm -r $specdir if [ -n "$logfile" ] && [ -n "$LOGDIROK" ] && [ -n "$LOGDIRFAIL" ]; then @@ -1851,6 +1804,57 @@ process_bcondrc() { update_shell_title "parse ~/.bcondrc: DONE!" } +process_distbcond() { + # apply bconds from ~/.distbcond to spec + # The file structure is like gentoo's package.use: + # --- + # * -selinux + # samba -mysql -pgsql + # w32codec-installer license_agreement + # php +mysqli + # --- + + local distbcond=$HOME/.distbcond + + echo "Updating .distbcond" + wget -q --no-check-certificate $DISTBCOND_URL -O "$distbcond" + if [ $? -ne 0 ]; then + Exit_error err_distbcond_update + fi + DISTBCOND_MD5=$(grep -E "^# MD5 " "$distbcond" | cut -d ' ' -f 3) + DISTBCOND_MD5_LOCAL=$(grep -v -E "^#" "$distbcond" | md5sum | cut -d ' ' -f 1) + if [ "$DISTBCOND_MD5" != "$DISTBCOND_MD5_LOCAL" ]; then + rm -f "$distbcond" + Exit_error err_distbcond_update + fi + + SN=${SPECFILE%%\.spec} + + local bcond_avail=$(find_spec_bcond $SPECFILE) + + while read pkg flags; do + # ignore comments + [[ "$pkg" == \#* ]] && continue + + # any package or current package? + if [ "$pkg" = "*" ] || [ "$pkg" = "$PACKAGE_NAME" ] || [ "$pkg" = "$SN" ]; then + for flag in $flags; do + local opt=${flag#[+-]} + + # use only flags which are in this package. + if [[ $bcond_avail = *${opt}* ]]; then + if [[ $flag = -* ]]; then + sed -i -r -e '/^%bcond_(with|without)\s+'$opt'/s/^%bcond_(with|without)/%bcond_with/g;' "$1" + elif [[ $flag = +* ]]; then + sed -i -r -e '/^%bcond_(with|without)\s+'$opt'/s/^%bcond_(with|without)/%bcond_without/g;' "$1" + fi + fi + done + fi + done < $distbcond + update_shell_title "parse ~/.distbcond: DONE!" +} + set_bconds_values() { update_shell_title "set bcond values" @@ -2082,12 +2086,12 @@ install_build_requires_rpmdeps() { local DEPS CNFL if [ "$FETCH_BUILD_REQUIRES_RPMGETDEPS" = "yes" ]; then # TODO: Conflicts list doesn't check versions - CNFL=$(eval rpm-getdeps $BCOND $RPMOPTS $SPECFILE 2> /dev/null | awk '/^\-/ { print $3 } ' | _rpm_cnfl_check | xargs) - DEPS=$(eval rpm-getdeps $BCOND $RPMOPTS $SPECFILE 2> /dev/null | awk '/^\+/ { print $3 } ' | _rpm_prov_check | xargs) + CNFL=$(eval rpm-getdeps $BCOND $RPMOPTS $RPMUSERDEFS $SPECFILE 2> /dev/null | awk '/^\-/ { print $3 } ' | _rpm_cnfl_check | xargs) + DEPS=$(eval rpm-getdeps $BCOND $RPMOPTS $RPMUSERDEFS $SPECFILE 2> /dev/null | awk '/^\+/ { print $3 } ' | _rpm_prov_check | xargs) fi if [ "$FETCH_BUILD_REQUIRES_RPMSPECSRPM" = "yes" ]; then - CNFL=$(eval rpm -q --specsrpm --conflicts $BCOND $RPMOPTS $SPECFILE | awk '{print $1}' | _rpm_cnfl_check | xargs) - DEPS=$(eval rpm -q --specsrpm --requires $BCOND $RPMOPTS $SPECFILE | awk '{print $1}' | _rpm_prov_check | xargs) + CNFL=$(eval rpm -q --specsrpm --conflicts $BCOND $RPMOPTS $RPMUSERDEFS $SPECFILE | awk '{print $1}' | _rpm_cnfl_check | xargs) + DEPS=$(eval rpm -q --specsrpm --requires $BCOND $RPMOPTS $RPM_USERDEFS $SPECFILE | awk '{print $1}' | _rpm_prov_check | xargs) fi if [ -n "$CNFL" ]; then @@ -2127,10 +2131,10 @@ init_repository() { } init_rpm_dir() { - local TOP_DIR=$(eval $RPM $RPMOPTS --eval '%{_topdir}') - local rpmdir=$(eval $RPM $RPMOPTS --eval '%{_rpmdir}') - local buildir=$(eval $RPM $RPMOPTS --eval '%{_builddir}') - local srpmdir=$(eval $RPM $RPMOPTS --eval '%{_srcrpmdir}') + local TOP_DIR=$(eval $RPM $RPMOPTS $RPMUSERDEFS --eval '%{_topdir}') + local rpmdir=$(eval $RPM $RPMOPTS $RPMUSERDEFS --eval '%{_rpmdir}') + local buildir=$(eval $RPM $RPMOPTS $RPMUSERDEFS --eval '%{_builddir}') + local srpmdir=$(eval $RPM $RPMOPTS $RPMUSERDEFS --eval '%{_srcrpmdir}') local TEMPLATES=template-specs local tmp @@ -2366,33 +2370,6 @@ while [ $# -gt 0 ]; do -su | --source-urls) COMMAND="list-sources-urls" shift ;; - -Tvs | --tag-version-stable ) - COMMAND="tag" - TAG="STABLE" - TAG_VERSION="yes" - shift;; - -Ts | --tag-stable ) - COMMAND="tag" - TAG="STABLE" - TAG_VERSION="no" - shift;; - -Tv | --tag-version ) - COMMAND="tag" - TAG="" - TAG_VERSION="yes" - shift;; - -Tp | --tag-prefix ) - TAG_PREFIX="$2" - shift 2;; - -tt | --test-tag ) - TEST_TAG="yes" - shift;; - -T | --tag ) - COMMAND="tag" - shift - TAG="$1" - TAG_VERSION="no" - shift;; -ir | --integer-release-only ) INTEGER_RELEASE="yes" shift;; @@ -2421,11 +2398,11 @@ while [ $# -gt 0 ]; do MACRO="${1}" shift if echo "${MACRO}" | grep -q '\W'; then - RPMOPTS="${RPMOPTS} --define \"${MACRO}\"" + RPMUSERDEFS="${RPMUSERDEFS} --define \"${MACRO}\"" else VALUE="${1}" shift - RPMOPTS="${RPMOPTS} --define \"${MACRO} ${VALUE}\"" + RPMUSERDEFS="${RPMUSERDEFS} --define \"${MACRO} ${VALUE}\"" fi ;; --alt_kernel) @@ -2471,7 +2448,8 @@ while [ $# -gt 0 ]; do DISTFILES_SERVER=${TLD_DISTFILES_SERVER} ;; --pkgrev) - COMMAND="set_pkgrev" + SETPKGREV="true" + COMMAND="build-source" shift;; -lp) COMMAND="list_pkgrev" @@ -2613,35 +2591,6 @@ case "$COMMAND" in fi fi - # ./builder -bs test.spec -r AC-branch -Tp auto-ac- -tt - if [ -n "$TEST_TAG" ]; then - local TAGVER=` - make_tagver` - tag_exist $TAGVER || [ $TAGVER = $CVSTAG ] || Exit_error err_tag_exists $TAGVER - # check also tags created in CVS - local TAGVER_CVS=$(echo $TAGVER | tr '[.@]' '[_#]') - local CVSTAG_CVS=$(echo $CVSTAG | tr '[.@]' '[_#]') - tag_exist $TAGVER_CVS || [ $TAGVER_CVS = $CVSTAG_CVS ] \ - || Exit_error err_tag_exists $TAGVER_CVS - # - do not allow to build from HEAD when XX-branch exists - TREE_PREFIX=$(echo "$TAG_PREFIX" | sed -e 's#^auto/\([a-zA-Z]\+\)/.*#\1#g') - if [ "$TAGVER" != "$CVSTAG" -a "$TAGVER_CVS" != "$CVSTAG" -a "$TREE_PREFIX" != "$TAG_PREFIX" ]; then - TAG_BRANCH="${TREE_PREFIX}-branch" - if [ -n "$DEPTH" ]; then - cmd_branches="git ls-remote --heads" - ref_prefix=refs/heads - else - cmd_branches="git show-ref" - ref_prefix=refs/remotes/${REMOTE_PLD} - fi - TAG_STATUS=$($cmd_branches | grep -i "${ref_prefix}/$TAG_BRANCH$" | cut -c'-40') - if [ -n "$TAG_STATUS" -a "$TAG_STATUS" != $(git rev-parse "$CVSTAG") ]; then - Exit_error err_branch_exists "$TAG_STATUS" - fi - fi - - fi - if [ -n "$NOSOURCE0" ] ; then SOURCES=`echo $SOURCES | xargs | sed -e 's/[^ ]*//'` fi @@ -2725,21 +2674,6 @@ case "$COMMAND" in fi update_md5 $SOURCES $PATCHES ;; - "tag" ) - NOURLS=1 - NODIST="yes" - init_builder - if [ -z "$SPECFILE" ]; then - Exit_error err_no_spec_in_cmdl - fi - - parse_spec - if [ ! -d .git ]; then - echo "No git reposiotory" >&2 - exit 101 - fi - tag_files - ;; "mr-proper" ) mr_proper ;; @@ -2822,17 +2756,6 @@ case "$COMMAND" in "version" ) echo "$VERSIONSTRING" ;; - "set_pkgrev" ) - init_builder - if [ -z "$SPECFILE" ]; then - Exit_error err_no_spec_in_cmdl - fi - get_spec > /dev/null - parse_spec - set_bconds_values - display_bconds - set_pkgrev - ;; "list_pkgrev" ) init_builder if [ -z "$SPECFILE" ]; then