aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPer Øyvind Karlsen <peroyvind@mandriva.org>2008-03-19 03:12:37 +0000
committerPer Øyvind Karlsen <peroyvind@mandriva.org>2008-03-19 03:12:37 +0000
commit6edbac559ab83e220650fa9b5b1cc61f14ad7800 (patch)
tree098873c618c4106b1e917190c63111163e140c60
parentf600b411177df8fa2747c02d187054a214cbd6a8 (diff)
downloadperl-URPM-6edbac559ab83e220650fa9b5b1cc61f14ad7800.tar
perl-URPM-6edbac559ab83e220650fa9b5b1cc61f14ad7800.tar.gz
perl-URPM-6edbac559ab83e220650fa9b5b1cc61f14ad7800.tar.bz2
perl-URPM-6edbac559ab83e220650fa9b5b1cc61f14ad7800.tar.xz
perl-URPM-6edbac559ab83e220650fa9b5b1cc61f14ad7800.zip
improve rpm version detection
really fix callback size for rpm5.org versions
-rw-r--r--Makefile.PL27
-rw-r--r--URPM.xs55
2 files changed, 40 insertions, 42 deletions
diff --git a/Makefile.PL b/Makefile.PL
index f760e93..de082ad 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -16,13 +16,18 @@ unless (defined $rpm_path) {
defined $rpm_path or die "Can't find rpm on this system\n";
+sub hexversion {
+ my ($major, $minor, $micro) = (@_[0] =~ /(\d+)\.(\d+)\.?(\d+)?/);
+ return int($major<<16) + int($minor<<8) + int($micro<<0)
+}
+
my $version = `LC_ALL=C $rpm_path --version`;
# fix compiling with RCs:
$version =~ s/(-.*)|(\.DEVEL)//;
chomp $version;
$version =~ s/(RPM version )|(rpm \(RPM\) )//;
-my $pversion = eval "v$version";
-$pversion ge v4.2 or die "Unable to build URPM with too old (or undetected) rpm version $version\n";
+my $hversion = hexversion($version);
+$hversion ge hexversion(4.2) or die "Unable to build URPM with too old (or undetected) rpm version $version\n";
# to generate the ChangeLog depending on the checkout layout
my $commonusername = "../common/";
@@ -45,23 +50,13 @@ ChangeLog:
}
my @rpmflags;
-if ($pversion ge v4.4.90 && $pversion lt v4.5) {
+#print $hversion;
+if ($hversion ge hexversion(4.4.90) && $hversion lt hexversion(4.5)) {
# rpm.org version
- push @rpmflags, '-DRPM_ORG';
+ push @rpmflags, "-DRPM_ORG";
} else {
# rpm5.org version
- if ($pversion ge v4.4.6) {
- push @rpmflags, '-DRPM_446';
- }
- if ($pversion ge v4.4.8) {
- push @rpmflags, '-DRPM_448';
- }
- if ($pversion ge v4.5) {
- push @rpmflags, '-DRPM_450';
- }
- if ($pversion ge v5.0) {
- push @rpmflags, '-DRPM_500';
- }
+ push @rpmflags, "-DRPM_VERSION_CODE=$hversion";
}
my $ccflags = join(' ', '-Wall -fno-strict-aliasing', @rpmflags);
diff --git a/URPM.xs b/URPM.xs
index 435d9b5..1d66bb4 100644
--- a/URPM.xs
+++ b/URPM.xs
@@ -27,6 +27,8 @@
#undef Mkdir
#undef Stat
+#define RPM_VERSION(maj,min,pl) (((maj) << 16) + ((min) << 8) + (pl))
+
#ifdef RPM_ORG
#define byte uint8_t
static inline void *_free(const void * p) {
@@ -35,8 +37,8 @@ static inline void *_free(const void * p) {
}
typedef struct rpmSpec_s * Spec;
#else
-#if !defined(RPM_450) || !defined(RPM_500)
#define rpmtsImportPubkey rpmcliImportPubkey
+#if RPM_VERSION(4,5,0) >= RPM_VERSION_CODE
#define rpmProblemGetType(p) p->type
#define rpmProblemGetPkgNEVR(p) p->pkgNEVR
#define rpmProblemGetAltNEVR(p) p->altNEVR
@@ -44,14 +46,14 @@ typedef struct rpmSpec_s * Spec;
#define rpmProblemGetLong(p) p->ulong1
#endif
#endif
-#ifdef RPM_446
+#if RPM_VERSION(4,4,6) <= RPM_VERSION_CODE
# define _RPMPS_INTERNAL
#endif
-#ifdef RPM_450
+#if RPM_VERSION(4,5,0) <= RPM_VERSION_CODE
# define _RPMEVR_INTERNAL
#include <rpm/rpmevr.h>
#endif
-#ifdef RPM_500
+#if RPM_VERSION(5,0,0) <= RPM_VERSION_CODE
#include <rpm/rpm4compat.h>
#else
@@ -139,7 +141,8 @@ static const void* unused_variable(const void *p) {
}
static int rpmError_callback_data;
-#if defined(RPM_ORG) || defined(RPM_500)
+#if defined(RPM_ORG) || RPM_VERSION(5,0,0) <= RPM_VERSION_CODE
+
int rpmError_callback() {
write_nocheck(rpmError_callback_data, rpmlogMessage(), strlen(rpmlogMessage()));
return RPMLOG_DEFAULT;
@@ -580,7 +583,7 @@ return_list_tag(URPM__Package pkg, int_32 tag_name) {
switch (type) {
case RPM_NULL_TYPE:
break;
-#ifndef RPM_500
+#if RPM_VERSION(5,0,0) > RPM_VERSION_CODE
case RPM_CHAR_TYPE:
#endif
case RPM_INT8_TYPE:
@@ -1205,7 +1208,7 @@ static void drop_tags(Header *h) {
headerRemoveEntry(*h, RPMTAG_FILESIZES); /* ? */
headerRemoveEntry(*h, RPMTAG_FILERDEVS); /* it seems unused. always empty */
headerRemoveEntry(*h, RPMTAG_FILEVERIFYFLAGS); /* only used for -V */
-#ifdef RPM_446
+#if RPM_VERSION(4,4,6) <= RPM_VERSION_CODE
headerRemoveEntry(*h, RPMTAG_FILEDIGESTALGOS); /* only used for -V */
headerRemoveEntry(*h, RPMTAG_FILEDIGESTS); /* only used for -V */ /* alias: RPMTAG_FILEMD5S */
#endif
@@ -1310,8 +1313,8 @@ ts_nosignature(rpmts ts) {
rpmtsSetVSFlags(ts, _RPMVSF_NODIGESTS | _RPMVSF_NOSIGNATURES);
}
-#if HAVE_RPM_RPMCB_H
-typedef unsigned long long rpmCallbackSize_t;
+#if RPM_VERSION(4,4,5) <= RPM_VERSION_CODE
+typedef uint64_t rpmCallbackSize_t;
#else
typedef unsigned long rpmCallbackSize_t;
#endif
@@ -1513,7 +1516,7 @@ int
Pkg_is_arch_compat__XS(pkg)
URPM::Package pkg
INIT:
-#ifdef RPM_448
+#if RPM_VERSION(4,4,8) <= RPM_VERSION_CODE
char * platform;
#endif
CODE:
@@ -1524,7 +1527,7 @@ Pkg_is_arch_compat__XS(pkg)
get_fullname_parts(pkg, NULL, NULL, NULL, &arch, &eos);
*eos = 0;
-#ifdef RPM_448
+#if RPM_VERSION(4,4,8) <= RPM_VERSION_CODE
platform = rpmExpand(arch, "-%{_real_vendor}-%{_target_os}%{?_gnu}", NULL);
RETVAL = rpmPlatformScore(platform, NULL, 0);
_free(platform);
@@ -1534,7 +1537,7 @@ Pkg_is_arch_compat__XS(pkg)
*eos = '@';
} else if (pkg->h && headerIsEntry(pkg->h, RPMTAG_SOURCERPM)) {
char *arch = get_name(pkg->h, RPMTAG_ARCH);
-#ifdef RPM_448
+#if RPM_VERSION(4,4,8) <= RPM_VERSION_CODE
platform = rpmExpand(arch, "-%{_real_vendor}-%{_target_os}%{?_gnu}", NULL);
RETVAL = rpmPlatformScore(platform, NULL, 0);
_free(platform);
@@ -1551,11 +1554,11 @@ int
Pkg_is_platform_compat(pkg)
URPM::Package pkg
INIT:
-#ifdef RPM_448
+#if RPM_VERSION(4,4,8) <= RPM_VERSION_CODE
char * platform = NULL;
#endif
CODE:
-#ifdef RPM_448
+#if RPM_VERSION(4,4,8) <= RPM_VERSION_CODE
read_config_files(0);
if (pkg->h && headerIsEntry(pkg->h, RPMTAG_PLATFORM)) {
int_32 count, type;
@@ -2948,7 +2951,7 @@ Trans_add(trans, pkg, ...)
CODE:
if ((pkg->flag & FLAG_ID) <= FLAG_ID_MAX && pkg->h != NULL) {
int update = 0;
-#ifdef RPM_446
+#if RPM_VERSION(4,4,6) <= RPM_VERSION_CODE
rpmRelocation relocations = NULL;
#else
rpmRelocation *relocations = NULL;
@@ -2968,7 +2971,7 @@ Trans_add(trans, pkg, ...)
if (SvROK(ST(i+1)) && SvTYPE(SvRV(ST(i+1))) == SVt_PVAV) {
AV *excludepath = (AV*)SvRV(ST(i+1));
I32 j = 1 + av_len(excludepath);
-#ifdef RPM_446
+#if RPM_VERSION(4,4,6) <= RPM_VERSION_CODE
relocations = calloc(j + 1, sizeof(*relocations));
#else
relocations = calloc(j + 1, sizeof(rpmRelocation));
@@ -3277,7 +3280,7 @@ Urpm_list_rpm_tag(urpm=Nullsv)
while (ext->name != NULL) {
if (ext->type == HEADER_EXT_MORE) {
-#ifdef RPM_500
+#if RPM_VERSION(5,0,0) <= RPM_VERSION_CODE
ext = *ext->u.more;
#else
ext = ext->u.more;
@@ -3745,12 +3748,12 @@ int
Urpm_archscore(arch)
const char * arch
PREINIT:
-#ifdef RPM_448
+#if RPM_VERSION(4,4,8) <= RPM_VERSION_CODE
char * platform = NULL;
#endif
CODE:
read_config_files(0);
-#ifdef RPM_448
+#if RPM_VERSION(4,4,8) <= RPM_VERSION_CODE
platform = rpmExpand(arch, "-%{_real_vendor}-%{_target_os}%{?_gnu}", NULL);
RETVAL=rpmPlatformScore(platform, NULL, 0);
_free(platform);
@@ -3764,12 +3767,12 @@ int
Urpm_osscore(os)
const char * os
PREINIT:
-#ifdef RPM_448
+#if RPM_VERSION(4,4,8) <= RPM_VERSION_CODE
char * platform = NULL;
#endif
CODE:
read_config_files(0);
-#ifdef RPM_448
+#if RPM_VERSION(4,4,8) <= RPM_VERSION_CODE
platform = rpmExpand("%{_real_arch}-%{_real_vendor}-", os, "%{?_gnu}", NULL);
RETVAL=rpmPlatformScore(platform, NULL, 0);
_free(platform);
@@ -3784,7 +3787,7 @@ Urpm_platformscore(platform)
const char * platform
CODE:
read_config_files(0);
-#ifdef RPM_448
+#if RPM_VERSION(4,4,8) <= RPM_VERSION_CODE
RETVAL=rpmPlatformScore(platform, NULL, 0);
#else
unused_variable(platform);
@@ -3832,11 +3835,11 @@ Urpm_spec2srcheader(specfile)
/* check what it does */
#define SPEC_VERIFY 0
if (!parseSpec(ts, specfile, "/"
-#ifndef RPM_448
+#if RPM_VERSION(4,4,8) > RPM_VERSION_CODE
, NULL
#endif
, 0, NULL, NULL, SPEC_ANYARCH, SPEC_FORCE
-#ifdef RPM_448
+#if RPM_VERSION(4,4,8) <= RPM_VERSION_CODE
, SPEC_VERIFY
#endif
)) {
@@ -3845,7 +3848,7 @@ Urpm_spec2srcheader(specfile)
spec = rpmtsSetSpec(ts, NULL);
if (! spec->sourceHeader)
initSourceHeader(spec
-#ifdef RPM_450
+#if RPM_VERSION(4,5,0) <= RPM_VERSION_CODE
, NULL
#endif
);
@@ -3918,7 +3921,7 @@ rpmErrorWriteTo(fd)
CODE:
rpmError_callback_data = fd;
rpmlogSetCallback(rpmError_callback
-#if defined(RPM_ORG) || defined(RPM_500)
+#if defined(RPM_ORG) || RPM_VERSION(5,0,0) <= RPM_VERSION_CODE
, NULL
#endif
);