openpkg/rpmmacros

Thu, 04 Oct 2012 20:30:05 +0200

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 04 Oct 2012 20:30:05 +0200
changeset 715
c10fb90893b9
parent 427
71503088f51b
permissions
-rw-r--r--

Correct out of date build configuration, porting to Solaris 11 network
link infrastructure and new libpcap logic. This additionally allows for
device drivers in subdirectories of /dev. Correct packaged nmap
personalities and signatures to work out of the box. Finally, hack
arpd logic to properly close sockets and quit on TERM by repeating
signaling in the run command script. Sadly, all this fails to correct
the run time behaviour of honeyd which fails to bind to the IP layer.

michael@13 1 ##
michael@13 2 ## rpmmacros -- OpenPKG RPM Macros
michael@428 3 ## Copyright (c) 2000-2012 OpenPKG GmbH <http://openpkg.com/>
michael@13 4 ##
michael@428 5 ## This software is property of the OpenPKG GmbH, DE MUC HRB 160208.
michael@428 6 ## All rights reserved. Licenses which grant limited permission to use,
michael@428 7 ## copy, modify and distribute this software are available from the
michael@428 8 ## OpenPKG GmbH.
michael@13 9 ##
michael@428 10 ## THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
michael@13 11 ## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
michael@13 12 ## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
michael@13 13 ## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
michael@13 14 ## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
michael@13 15 ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
michael@13 16 ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
michael@13 17 ## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
michael@13 18 ## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
michael@13 19 ## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
michael@13 20 ## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
michael@13 21 ## SUCH DAMAGE.
michael@13 22 ##
michael@428 23
michael@428 24 ##
michael@13 25 ## The purpose of this macro set is to override the default
michael@13 26 ## macros in the OpenPKG RPM installation for the @l_prefix@ hierarchy.
michael@13 27 ##
michael@13 28
michael@428 29 # utility macro for "delayed one-time expansion" of macro bodies
michael@428 30 # (works by redefining a macro in-place to its expanded body on its first usage)
michael@428 31 %l_once() %{expand:%%global %{*}}%{expand:%%{%{1}}}
michael@428 32
michael@13 33 # the OpenPKG release identification (for the current package or as a fallback for the bootstrap package)
michael@428 34 %l_openpkg_release(F:) %(%{l_prefix}/libexec/openpkg/release \\\
michael@428 35 --release="%{?release}%{!?release:%(%{l_rpm} -q --qf '%{release}' openpkg)}" \\\
michael@428 36 %{?-F:-F "%{-F*}"}%{!?-F:-F "OpenPKG-%%t"})
michael@13 37
michael@13 38 # the OpenPKG OIDs (root is officially registered at IANA)
michael@13 39 %l_openpkg_oid 1.3.6.1.4.1.18749
michael@13 40 %l_openpkg_oid_bootstrap %{l_openpkg_oid}.4.1
michael@13 41 %l_openpkg_oid_instance %{l_openpkg_oid_bootstrap}.1
michael@13 42 %l_openpkg_oid_platform %{l_openpkg_oid_bootstrap}.2
michael@13 43 %l_openpkg_oid_tagfmtopt %{l_openpkg_oid_bootstrap}.3
michael@13 44
michael@13 45 # the OpenPKG package tagging
michael@13 46 %l_tag_fmt @TAG@
michael@428 47 %l_tag_fmt_compat %(prefix="%{l_prefix_static}"; \
michael@428 48 if [ ".`expr $prefix : '/[^/][^/]*$'`" != .0 ]; then \
michael@428 49 loc=`echo $prefix | cut -c2-4`; \
michael@428 50 else \
michael@428 51 loc=`echo $prefix | sed -e 's;/\\(.\\)[^/]*;\\1;g' | cut -c1-3`; \
michael@428 52 fi; \
michael@428 53 echo $loc)
michael@428 54 %l_tag_fmt_loc %(echo "%{l_prefix_static}" | \\\
michael@428 55 sed -e 's;^/\\([^/]\\)[^/]*/\\([^/]\\)[^/]*/\\([^/]\\).*;\\1\\2\\3;' \\\
michael@428 56 -e 's;^/\\([^/]\\)[^/]*/\\([^/][^/]\\).*;\\1\\2;' \\\
michael@428 57 -e 's;^/\\([^/][^/]\\)[^/]*/\\([^/]\\).*;\\1\\2;' \\\
michael@428 58 -e 's;^/\\([^/]\\)[^/]*/\\([^/]\\).*;\\1\\2;' \\\
michael@428 59 -e 's;^/\\([^/][^/][^/]\\).*;\\1;' \\\
michael@428 60 -e 's;^/\\([^/][^/]\\).*;\\1;' \\\
michael@428 61 -e 's;^/\\([^/]\\).*;\\1;' \\\
michael@428 62 )
michael@428 63 %l_tag_fmt_opt %(uuid_ns="`%{l_uuid} -v3 ns:OID %{l_openpkg_oid_tagfmtopt}`"; \
michael@428 64 %{l_uuid} -v3 $uuid_ns '%{?_options}')
michael@13 65 %l_tag_fmt_uuid %(%{l_uuid} -v1)
michael@13 66 %l_tag_fmt_time %(date '+%%Y%%m%%d%%H%%M%%S')
michael@13 67 %l_tag_fmt_user %(%{l_shtool} echo -e '%%u')
michael@13 68 %l_tag_fmt_host %(%{l_shtool} echo -e '%%h%%d')
michael@428 69 %l_tag_gen %{expand:%(echo '%{l_tag_fmt}' | \\\
michael@428 70 sed -e 's/<\\([a-zA-Z][_a-zA-Z0-9]*\\)>/%%{l_tag_fmt_\\1}/g')}
michael@428 71 %l_tag %{l_once l_tag %(echo "%{l_tag_gen}" | sed -e 's;-;;g')}
michael@13 72
michael@13 73 # the OpenPKG instance location (backward compatibility only)
michael@13 74 %l_location %{l_tag}
michael@13 75
michael@13 76 # standard RPM host platform identification
michael@13 77 # (defaults via "shtool platform" and uname(3); used internally)
michael@13 78 #%_host_cpu ...USE INTERNAL DEFAULT...
michael@13 79 #%_host_vendor ...USE INTERNAL DEFAULT...
michael@13 80 #%_host_os ...USE INTERNAL DEFAULT...
michael@13 81 %_host_alias %{nil}
michael@13 82 %_host %{_host_cpu}-%{_host_os}
michael@13 83
michael@13 84 # standard RPM build platform identification
michael@13 85 # (defaults via %{_host*} macros; not used internally AFAIK)
michael@13 86 %_build_cpu %{_host_cpu}
michael@13 87 %_build_vendor %{_host_vendor}
michael@13 88 %_build_os %{_host_os}
michael@13 89 %_build_alias %{_host_alias}
michael@13 90 %_build %{_host}
michael@13 91
michael@13 92 # standard RPM target platform identification
michael@13 93 # (defaults via %{_host*} macros; used internally for %ifarch/%ifnarch)
michael@13 94 %_target_cpu %{_host_cpu}
michael@13 95 %_target_vendor %{_host_vendor}
michael@13 96 %_target_os %{_host_os}
michael@13 97 %_target_alias %{_host_alias}
michael@13 98 %_target %{_host}
michael@13 99
michael@13 100 # legacy RPM platform macros
michael@13 101 # (defaults via config.guess/config.sub under RPM build-time)
michael@13 102 %_arch %{_host_cpu}
michael@13 103 %_vendor %{_host_vendor}
michael@13 104 %_os %{_host_os}
michael@13 105
michael@13 106 # legacy RPM platform macros
michael@13 107 # (defaults via various other macros; partly used internally)
michael@13 108 %_build_arch %{_arch}
michael@13 109 %_target_platform %{_target_cpu}-%{_target_vendor}-%{_target_os}
michael@13 110 %_gnu %{nil}
michael@13 111
michael@13 112 # official OpenPKG host platform identification
michael@13 113 %l_host_arch %{_host_cpu}
michael@13 114 %l_host_vendor %{_host_vendor}
michael@13 115 %l_host_os %{_host_os}
michael@13 116 %l_host %{_host_cpu}-%{_host_os}
michael@13 117
michael@428 118 # host name or FQDN identification
michael@428 119 %l_hostname(f) %(%{l_shtool} echo -n -e '%%h%{?-f:%%d}')
michael@428 120
michael@13 121 # new OpenPKG platform identification
michael@428 122 %l_platform(cptF:) %(if [ ".%{?-F}" != . ]; then \
michael@428 123 fmt="%{-F*}"; \
michael@428 124 else \
michael@428 125 T="%{?-c:c}%{?-p:p}%{?-t:t}"; \
michael@428 126 [ ".$T" = . ] && T="p"; \
michael@428 127 fmt="%%<a$T>-%%<s$T>"; \
michael@428 128 fi; \
michael@428 129 %{l_shtool} platform -n -L -S "" -C "+" -F "$fmt")
michael@13 130
michael@13 131 # old OpenPKG platform identification
michael@13 132 %l_target %{l_platform -t}
michael@13 133
michael@428 134 # UID/GID lookup
michael@428 135 %l_xuid_lookup() %(( getent passwd '%1'; \
michael@428 136 grep '^%1:' /etc/passwd; \
michael@428 137 ypmatch '%1' passwd; \
michael@428 138 nismatch '%1' passwd; \
michael@428 139 nidump passwd . | grep '^%1:' \
michael@428 140 ) 2>/dev/null | \
michael@428 141 sed -e 'q' | \\\
michael@428 142 awk -F: '{ print $3; }' \
michael@428 143 )
michael@428 144 %l_xgid_lookup() %(( getent group '%2'; \
michael@428 145 grep '^%2:' /etc/group; \
michael@428 146 ypmatch '%2' group; \
michael@428 147 nismatch '%2' group; \
michael@428 148 nidump group . | grep '^%1:' \
michael@428 149 ) 2>/dev/null | \
michael@428 150 sed -e 'q' | \\\
michael@428 151 awk -F: '{ print $3; }' \
michael@428 152 )
michael@428 153
michael@13 154 # the *S*uper-user user/group name/id pair
michael@13 155 %l_susr @SUSR@
michael@13 156 %l_sgrp @SGRP@
michael@428 157 %l_suid %{expand:%%{l_xuid_lookup %{l_susr} %{l_sgrp}}}
michael@428 158 %l_sgid %{expand:%%{l_xgid_lookup %{l_susr} %{l_sgrp}}}
michael@13 159
michael@13 160 # the *M*anagement user/group name/id pair
michael@13 161 %l_musr @MUSR@
michael@13 162 %l_mgrp @MGRP@
michael@428 163 %l_muid %{expand:%%{l_xuid_lookup %{l_musr} %{l_mgrp}}}
michael@428 164 %l_mgid %{expand:%%{l_xgid_lookup %{l_musr} %{l_mgrp}}}
michael@13 165
michael@13 166 # the *R*restricted user/group name/id pair
michael@13 167 %l_rusr @RUSR@
michael@13 168 %l_rgrp @RGRP@
michael@428 169 %l_ruid %{expand:%%{l_xuid_lookup %{l_rusr} %{l_rgrp}}}
michael@428 170 %l_rgid %{expand:%%{l_xgid_lookup %{l_rusr} %{l_rgrp}}}
michael@13 171
michael@13 172 # the *N*on-privileged user/group name/id pair
michael@13 173 %l_nusr @NUSR@
michael@13 174 %l_ngrp @NGRP@
michael@428 175 %l_nuid %{expand:%%{l_xuid_lookup %{l_nusr} %{l_ngrp}}}
michael@428 176 %l_ngid %{expand:%%{l_xgid_lookup %{l_nusr} %{l_ngrp}}}
michael@13 177
michael@13 178 # backward compatibility (openpkg < 20020204)
michael@13 179 %l_fsusr %{l_musr}
michael@13 180 %l_fsgrp %{l_mgrp}
michael@13 181 %l_npuid %{l_nuid}
michael@13 182 %l_npgid %{l_ngid}
michael@13 183
michael@428 184 # whether we are intended to operate in an environment where
michael@428 185 # only a single unprivileged user account can be used
michael@428 186 %l_unprivileged @l_unprivileged@
michael@428 187
michael@13 188 # define the installation hierarchy (used parts)
michael@13 189 %l_prefix @l_prefix@
michael@13 190 %l_prefix_static @l_prefix_static@
michael@13 191
michael@13 192 # define the installation hierarchy (unused parts)
michael@13 193 %l_exec_prefix %{l_prefix}
michael@13 194 %l_bindir %{l_prefix}/bin
michael@13 195 %l_sbindir %{l_prefix}/sbin
michael@13 196 %l_libexecdir %{l_prefix}/libexec
michael@13 197 %l_datadir %{l_prefix}/share
michael@13 198 %l_sysconfdir %{l_prefix}/etc
michael@13 199 %l_sharedstatedir %{l_prefix}/com
michael@13 200 %l_localstatedir %{l_prefix}/var
michael@13 201 %l_libdir %{l_prefix}/lib
michael@13 202 %l_includedir %{l_prefix}/include
michael@13 203 %l_infodir %{l_prefix}/info
michael@13 204 %l_mandir %{l_prefix}/man
michael@13 205 %l_docdir %{l_prefix}/doc
michael@13 206
michael@13 207 # provide killer macro "%{l_value -s|-b|-c (l_xxx ...|-a|-A)}" which
michael@13 208 # expands to the values of previous l_xxx variables in this file. With
michael@13 209 # option "-s" it expands into a chain of "-e 's;<name>;<value>;g'"
michael@13 210 # constructs for used with Stream Editor sed(1), with option "-b" it
michael@13 211 # expands into a chain of "<name>='<value>';" constructs for use with
michael@13 212 # Bourne-Shell sh(1), with option "-c" it expands into a chain of "set
michael@13 213 # <name> = '<value>';" constructs for use with C-Shell csh(1). But
michael@13 214 # be careful, <value> currently (for expansion speed reasons) is not
michael@13 215 # escaped, so make sure the values of the above macros do not contain
michael@13 216 # ";" for "-s" and ";" for "-b" and "-c". You can either specify one
michael@13 217 # or more names of variables to expand or use "-a" for mostly all
michael@13 218 # variables and "-A" for really all variables.
michael@428 219 %l_value(sbcaA) %{expand:%(\
michael@428 220 l=""; \
michael@428 221 for x in \\\
michael@428 222 `if [ ".%*" != . ]; then \
michael@428 223 echo "%* "; \
michael@428 224 else \
michael@428 225 p=""; \
michael@428 226 if [ ".%{-a:yes}" = .yes ]; then \
michael@428 227 p="^%%l_(prefix|[smrn](usr|grp|uid|gid))"; \
michael@428 228 elif [ ".%{-A:yes}" = .yes ]; then \
michael@428 229 p="^%%l_"; \
michael@428 230 fi; \
michael@428 231 if [ ".$p" != . ]; then \
michael@428 232 egrep "$p" %{l_prefix}/etc/openpkg/rpmmacros |\\\
michael@428 233 sed -e '/^%%l_value/,$d' \\\
michael@428 234 -e 's;^%%\\(l_[a-z1-9_]*\\).*;\\1;'; \
michael@428 235 fi; \
michael@428 236 fi`; do \
michael@428 237 e=""; \
michael@428 238 if [ ".%{-s:yes}" = .yes ]; then \
michael@428 239 e="-e 's;@$x@;%%{$x};g'"; \
michael@428 240 elif [ ".%{-b:yes}" = .yes ]; then \
michael@428 241 e="$x='%%{$x}';"; \
michael@428 242 elif [ ".%{-c:yes}" = .yes ]; then \
michael@428 243 e="set $x = '%%{$x}';"; \
michael@428 244 else \
michael@428 245 e="%%{$x}"; \
michael@428 246 fi; \
michael@428 247 if [ ".$l" = . ]; then \
michael@428 248 l="$e"; \
michael@428 249 else \
michael@428 250 l="$l $e"; \
michael@428 251 fi; \
michael@428 252 done; \
michael@428 253 echo "$l" \
michael@428 254 )}
michael@13 255
michael@13 256 # local version of the empty macro
michael@13 257 %l_nil %{nil}
michael@13 258
michael@428 259 # local version of the tab character
michael@428 260 %l_tab %{lua: print "\t" }
michael@428 261
michael@13 262 # override the internal RPM hierarchy variables
michael@13 263 %_usr %{nil}
michael@13 264 %_var %{nil}
michael@13 265 %_usrsrc %{nil}
michael@13 266 %_topdir %{nil}
michael@13 267 %_dbpath %{l_prefix}/RPM/DB
michael@13 268 %_builddir %{l_prefix}/RPM/TMP
michael@13 269 %_tmppath %{l_prefix}/RPM/TMP
michael@13 270 %_sourcedir %{l_prefix}/RPM/SRC/%{name}
michael@13 271 %_specdir %{l_prefix}/RPM/SRC/%{name}
michael@13 272 %_rpmdir %{l_prefix}/RPM/PKG
michael@13 273 %_srcrpmdir %{l_prefix}/RPM/PKG
michael@428 274 %_repackage_dir %{l_prefix}/RPM/TR
michael@428 275 %_cache_dbpath %{l_prefix}/RPM/CACHE
michael@428 276 %_solve_dbpath %{l_prefix}/RPM/CACHE
michael@428 277 %_solve_pkgsdir %{l_prefix}/RPM/CACHE
michael@13 278 %_defaultdocdir %{l_docdir}
michael@13 279
michael@13 280 # complement the %{SOURCE<n>} and %{PATCH<n>} with %{SOURCE <file>} and %{PATCH <file>}
michael@428 281 %_SOURCE_PATCH() %{lua: \
michael@428 282 local source1 = rpm.expand("%{_specdir}/%1") \
michael@428 283 local source2 = rpm.expand("%{_sourcedir}/%1") \
michael@428 284 if posix.stat(source1) ~= nil then \
michael@428 285 print(source1) \
michael@428 286 else \
michael@428 287 print(source2) \
michael@428 288 end }
michael@428 289 %SOURCE() %{expand:%%{_SOURCE_PATCH %1}}
michael@428 290 %PATCH() %{expand:%%{_SOURCE_PATCH %1}}
michael@13 291
michael@13 292 # override RPM's absolute tool paths with relative ones
michael@13 293 # (because if you upgrade RPM it would hard-code tools in own hierarchy, too)
michael@13 294 %__awk awk
michael@13 295 %__bzip2 %{_bzip2bin}
michael@13 296 %__cat cat
michael@13 297 %__chgrp chgrp
michael@13 298 %__chmod chmod
michael@13 299 %__chown chown
michael@13 300 %__cp cp
michael@13 301 %__grep grep
michael@13 302 %__gzip %{_gzipbin}
michael@13 303 %__id id
michael@13 304 %__install install
michael@13 305 %__ln_s ln -s
michael@13 306 %__make make
michael@13 307 %__mkdir mkdir
michael@13 308 %__mkdir_p %{l_shtool} mkdir -p
michael@13 309 %__mv mv
michael@13 310 %__patch %{_patchbin}
michael@13 311 %__perl perl
michael@13 312 %__pgp %{_pgpbin}
michael@13 313 %__rm rm
michael@13 314 %__rsh rsh
michael@13 315 %__sed sed
michael@13 316 %__ssh ssh
michael@13 317 %__tar %{_tarbin}
michael@428 318 %__xz %{_xzbin}
michael@13 319
michael@13 320 # override some more RPM macros where the default value is not acceptable
michael@428 321 %_dbapi %{l_once _dbapi %(if [ -f "%{_dbpath}/VERSION" ]; then \
michael@428 322 . "%{_dbpath}/VERSION"; \
michael@428 323 fi; \
michael@428 324 echo "${DBAPI:-3}")}
michael@428 325 %__dbi_other %{?_tmppath:tmpdir=%{_tmppath}} %{?__dbi_cdb} %{?__dbi_private:private}
michael@428 326 %__file_context_path %{nil}
michael@428 327 %__check_files %{nil}
michael@428 328 %_patch_suffix -b --suffix .orig
michael@428 329 %_excludedocs 1
michael@13 330 %_dependency_whiteout %{nil}
michael@13 331 %__debug_install_post %{nil}
michael@13 332 %_unpackaged_files_terminate_build 0
michael@13 333
michael@13 334 # provide fixed paths to tools (standard)
michael@13 335 %_gzipbin %{l_prefix}/lib/openpkg/gzip
michael@13 336 %_bzip2bin %{l_prefix}/lib/openpkg/bzip2
michael@428 337 %_xzbin %{l_prefix}/lib/openpkg/xz
michael@13 338 %_patchbin %{l_prefix}/lib/openpkg/patch
michael@13 339 %_tarbin %{l_prefix}/lib/openpkg/tar
michael@428 340 %__bsdtar %{l_prefix}/lib/openpkg/bsdtar
michael@428 341 %__cpio %{l_prefix}/lib/openpkg/bsdcpio
michael@428 342 %__unzip %{__bsdtar}
michael@13 343
michael@13 344 # provide path to platform identification file
michael@13 345 %__platform %{l_prefix}/etc/openpkg/platform
michael@13 346
michael@13 347 # provide fixed paths to tools (additional)
michael@428 348 %l_rc %{l_prefix}/bin/openpkg --keep-privileges rc
michael@13 349 %l_rpm %{l_prefix}/libexec/openpkg/rpm
michael@13 350 %l_rpm2cpio %{l_prefix}/libexec/openpkg/rpm2cpio
michael@13 351 %l_rpm_config %{l_prefix}/libexec/openpkg/rpm-config
michael@13 352 %l_lsync %{l_prefix}/libexec/openpkg/lsync
michael@13 353 %l_rpmtool %{l_prefix}/lib/openpkg/rpmtool
michael@13 354 %l_shtool %{l_prefix}/lib/openpkg/shtool
michael@13 355 %l_curl %{l_prefix}/lib/openpkg/curl
michael@13 356 %l_bash %{l_prefix}/lib/openpkg/bash
michael@13 357 %l_uuid %{l_prefix}/lib/openpkg/uuid
michael@13 358
michael@13 359 # provide smart paths to tools
michael@428 360 %l_tool_locate() %{lua: \
michael@428 361 if rpm.expand("%{expand:%%{?use_%1}}") ~= "" then \
michael@428 362 print(rpm.expand("%{expand:%%{use_%1}}")) \
michael@428 363 elseif posix.stat(rpm.expand("%{l_prefix}/bin/%2")) ~= nil then \
michael@428 364 print(rpm.expand("%{l_prefix}/bin/%2")) \
michael@428 365 elseif posix.stat(rpm.expand("%{l_prefix}/lib/openpkg/%2")) ~= nil then \
michael@428 366 print(rpm.expand("%{l_prefix}/lib/openpkg/%2")) \
michael@428 367 else \
michael@428 368 print(rpm.expand("%2")) \
michael@428 369 end }
michael@428 370 %l_gzip %{l_once l_gzip %{l_tool_locate gzip gzip}}
michael@428 371 %l_bzip2 %{l_once l_bzip2 %{l_tool_locate bzip2 bzip2}}
michael@428 372 %l_xz %{l_once l_xz %{l_tool_locate xz xz}}
michael@428 373 %l_tar %{l_once l_tar %{l_tool_locate tar tar}}
michael@428 374 %l_make %{l_once l_make %{l_tool_locate make make}}
michael@428 375 %l_cc %{l_once l_cc %{l_tool_locate cc cc}}
michael@428 376 %l_ar %{l_once l_ar %{l_tool_locate ar ar}}
michael@428 377 %l_ld %{l_once l_ld %{l_tool_locate ld ld}}
michael@428 378 %l_as %{l_once l_as %{l_tool_locate as as}}
michael@428 379 %l_strip %{l_once l_strip %{l_tool_locate strip strip}}
michael@428 380 %l_cxx %{l_once l_cxx %{l_tool_locate cxx c++}}
michael@428 381 %l_patch %{l_once l_patch %{l_tool_locate patch patch}}
michael@428 382 %l_sed %{l_once l_sed %{l_tool_locate sed sed}}
michael@428 383 %l_grep %{l_once l_grep %{l_tool_locate grep grep}}
michael@428 384 %l_awk %{l_once l_awk %{l_tool_locate awk awk}}
michael@428 385 %l_autoconf %{l_once l_autoconf %{l_tool_locate autoconf autoconf}}
michael@428 386 %l_automake %{l_once l_automake %{l_tool_locate automake automake}}
michael@428 387 %l_libtool %{l_once l_libtool %{l_tool_locate libtool libtool}}
michael@428 388 %l_flex %{l_once l_flex %{l_tool_locate flex flex}}
michael@428 389 %l_bison %{l_once l_bison %{l_tool_locate bison bison}}
michael@428 390 %l_perl %{l_once l_perl %{l_tool_locate perl perl}}
michael@428 391 %l_miniperl %{l_once l_miniperl %{l_tool_locate miniperl miniperl}}
michael@428 392 %l_openssl %{l_once l_openssl %{l_tool_locate openssl openssl}}
michael@428 393 %l_xmkmf %{l_once l_xmkmf %{l_tool_locate xmkmf xmkmf}}
michael@428 394 %l_vcheck %{l_once l_vcheck %{l_tool_locate vcheck vcheck}}
michael@13 395
michael@13 396 # tool options
michael@13 397 %l_mflags(O) %(%{l_sane_env}; %{l_rpmtool} mflags %{-O:-O} "%{l_make}")
michael@13 398 %l_cflags(O) %(%{l_sane_env}; %{l_rpmtool} cflags %{-O:-O} "%{l_cc}")
michael@13 399 %l_cxxflags(O) %(%{l_sane_env}; %{l_rpmtool} cflags %{-O:-O} "%{l_cxx}")
michael@13 400 %l_cppflags(i) %(%{l_sane_env}; %{l_rpmtool} cppflags -p%{l_prefix} %{-i:-i} -- %*)
michael@13 401 %l_ldflags() %(%{l_sane_env}; %{l_rpmtool} ldflags -p%{l_prefix} -- %*)
michael@13 402
michael@13 403 # OSSP fake syslog library
michael@428 404 %l_fsl_ldflags() %(if [ ".%{with_fsl}" = ".yes" ]; then \
michael@428 405 flags=`(%{l_prefix}/bin/fsl-config --all --ldflags) 2>/dev/null`; \
michael@428 406 else \
michael@428 407 flags=''; \
michael@428 408 fi; \
michael@428 409 echo $flags)
michael@428 410 %l_fsl_libs() %(if [ ".%{with_fsl}" = ".yes" ]; then \
michael@428 411 flags=`(%{l_prefix}/bin/fsl-config --all --libs) 2>/dev/null`; \
michael@428 412 else \
michael@428 413 flags=''; \
michael@428 414 fi; \
michael@428 415 echo $flags)
michael@13 416
michael@13 417 # determine the current username
michael@428 418 %l_whoami %{l_once l_whoami %((id -un) 2>/dev/null || \\\
michael@428 419 (whoami) 2>/dev/null || \\\
michael@428 420 (who am i | cut "-d " -f1) 2>/dev/null || \\\
michael@428 421 echo $LOGNAME)}
michael@13 422
michael@13 423 # macros for dynamically generating a %files list
michael@13 424 %l_files_defattr '%%defattr(-,%{l_musr},%{l_mgrp})'
michael@13 425 %l_files_all '%{l_prefix}'
michael@13 426 %l_files_noshared '%%not %%dir {%{l_prefix},%{l_prefix}/*,%{l_prefix}/etc/rc.d,%{l_prefix}/man/*}'
michael@13 427 %l_files_std() %l_files_defattr %l_files_all %l_files_noshared
michael@13 428
michael@428 429 # default %defattr when rolling SRPMS
michael@428 430 %_srcdefattr (-,openpkg,openpkg)
michael@428 431
michael@13 432 # path to local build root
michael@428 433 %l_buildroot %{_tmppath}/%{name}-%{version}-%{release}-buildroot
michael@427 434 %buildroot %{l_buildroot}
michael@13 435
michael@13 436 # path to local temporary location
michael@13 437 %l_tmpdir() %{_tmppath}
michael@13 438 %l_tmpfile() %{l_tmpdir}/%{name}-%{version}-%{release}-tmp%{?1:-%1}
michael@13 439
michael@13 440 # executable path for %post/%pre
michael@13 441 %_install_script_path %{l_prefix}/bin:%{l_prefix}/sbin:/bin:/sbin:/usr/bin:/usr/sbin
michael@13 442
michael@13 443 # names of RPM files
michael@13 444 %l_srcrpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.src.rpm
michael@13 445 %l_binrpmfilename %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}-%%{OS}-%{l_tag}.rpm
michael@13 446
michael@13 447 # override the name scheme for RPM files
michael@13 448 %_rpmfilename %{l_binrpmfilename}
michael@13 449 %_build_name_fmt %{l_binrpmfilename}
michael@13 450 %_repackage_name_fmt %{l_binrpmfilename}
michael@428 451 %_solve_name_fmt %{?_solve_pkgsdir}/%{l_binrpmfilename}
michael@428 452 %_query_all_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}
michael@428 453 %___NVRA %%{NAME}-%%{VERSION}-%%{RELEASE}
michael@428 454
michael@428 455 # do not repackage automatically
michael@428 456 %_repackage_all_erasures 0
michael@13 457
michael@13 458 # override the payload compression for the CPIO parts of an RPM
michael@13 459 # (we use the equivalent of "bzip2 -9")
michael@13 460 %_source_payload w9.bzdio
michael@13 461 %_binary_payload w9.bzdio
michael@13 462
michael@13 463 # package signature type is OpenPGP via GnuPG
michael@428 464 %__gpg %{l_tool_locate gpg gpg}
michael@13 465 %_signature gpg
michael@13 466
michael@13 467 # two macro-processor add-ons (should be part of forthcoming RPM releases)
michael@13 468 %ifdef() %if %{expand:%%{?%{1}:1}%%{!?%{1}:0}}
michael@13 469 %ifndef() %if %{expand:%%{?%{1}:0}%%{!?%{1}:1}}
michael@13 470
michael@13 471 # macro for package option configuration
michael@428 472 %option() %{lua: \
michael@428 473 local package_name = rpm.expand("%{name}") \
michael@428 474 local option_name = rpm.expand("%1") \
michael@428 475 if rpm.expand("%{?" .. option_name .. ":defined}") ~= "defined" then \
michael@428 476 rpm.expand("%global " .. rpm.expand("%*")) \
michael@428 477 end \
michael@428 478 local option_value = rpm.expand("%{" .. option_name .. "}") \
michael@428 479 option_value = util.rsubst(option_value, "(?s)%", "%%%%") \
michael@428 480 option_value = util.rsubst(option_value, "(?s) ", "%%20") \
michael@428 481 option_value = util.rsubst(option_value, "(?s)\\t", "%%09") \
michael@428 482 rpm.expand("%global _options %{?_options:%{_options}:}" .. option_name .. "=" .. option_value) \
michael@428 483 print(string.format("Provides: %s::%s = %s\\n", package_name, option_name, option_value)) \
michael@428 484 }
michael@13 485
michael@13 486 # macros for NoSource/NoPatch (distribution restriction) integrity handling
michael@428 487 %NoSource() %(if [ ".%{?restriction}" != ".no" ]; then \
michael@428 488 echo "NoSource: %1"; \
michael@428 489 fi) \
michael@428 490 %{expand:%%global _restricted %{?_restricted:%{_restricted}} %%{SOURCEURL%1}}
michael@428 491 %NoPatch() %(if [ ".%{?restriction}" != ".no" ]; then \
michael@428 492 echo "NoPatch: %1"; fi) \
michael@428 493 %{expand:%%global _restricted %{?_restricted:%{_restricted}} %%{PATCHURL%1}}
michael@13 494 %integrity() %{l_check_nosource}
michael@13 495
michael@13 496 # macros for checking build environment
michael@428 497 %l_check_nosource() %(%{l_sane_env}; checkok=1; \
michael@428 498 checkinfo=`echo "Sorry, this OpenPKG package contains a DISTRIBUTION RESTRICTED source file."; \\\
michael@428 499 echo "Before you can proceed building this package, fetch missing files MANUALLY:"`; \
michael@428 500 for url in . %{?_restricted}; do \
michael@428 501 [ ".$url" = .. ] && continue; \
michael@428 502 eval `echo "$url" | \\\
michael@428 503 sed -e 's!^\\(.*\\)::/\\([^/][^/]*\\)$!;url=\\"\\1\\"; file=\\"\\2\\"!' \\\
michael@428 504 -e 's!^\\([^:;][^:]*://.*/\\)\\([^/][^/]*\\)$!;url=\\"\\1\\"; file=\\"\\2\\"!' \\\
michael@428 505 -e 's:^\\([^;].*\\)$:;url="(unknown location) "; file="\\1":' \\\
michael@428 506 -e 's:^;::'`; \
michael@428 507 if [ ! -f "%{_specdir}/$file" ] && [ ! -f "%{_sourcedir}/$file" ]; then \\\
michael@428 508 checkok=0; \
michael@428 509 checkinfo=`echo "${checkinfo}"; \\\
michael@428 510 echo ""; \\\
michael@428 511 echo "from ${url}"; \\\
michael@428 512 echo "file ${file}"; \\\
michael@428 513 echo "here %{_sourcedir}/$file"`; \
michael@428 514 fi; \
michael@428 515 done; \
michael@428 516 if [ $checkok -ne 1 ]; then \
michael@428 517 echo "set +x"; \
michael@428 518 echo "$checkinfo" | \\\
michael@428 519 %{l_rpmtool} msg -b -t error | \\\
michael@428 520 sed -e 's;^;echo ";' -e 's;$;";'; \
michael@428 521 echo "exit 1"; \
michael@428 522 fi)
michael@428 523 %l_check_class() %(%{l_sane_env}; \
michael@428 524 class=`echo "@:%{?class}:%{?distribution}" | \\\
michael@428 525 sed -e 's;^@:\\([^:][^:]*\\):.*$;\\1;' \\\
michael@428 526 -e 's;^@:.*\\[\\(.*\\)\\].*$;\\1;' \\\
michael@428 527 -e 's;^@:.*$;JUNK;'`; \
michael@428 528 %{l_rpmtool} check-class "$class")
michael@13 529 %prep %%prep\
michael@13 530 %{l_check_nosource} \
michael@13 531 %{l_check_class} \
michael@13 532 %{nil}
michael@13 533
michael@13 534 # macro-processor add-on for testing external conditions
michael@428 535 %l_test(pfd) %(if [ ".%{?-p:yes}" = .yes ]; then \
michael@428 536 %{l_rpm} -q %1 >/dev/null 2>&1; rc=$?; \
michael@428 537 elif [ ".%{?-f:yes}" = .yes ]; then \
michael@428 538 test -f %1; rc=$?; \
michael@428 539 elif [ ".%{?-d:yes}" = .yes ]; then \
michael@428 540 test -d %1; rc=$?; \
michael@428 541 fi; \
michael@428 542 if [ ".$rc" = .0 ]; then \
michael@428 543 echo "yes"; \
michael@428 544 else \
michael@428 545 echo "no"; \
michael@428 546 fi)
michael@13 547
michael@13 548 # sane build environment setup
michael@428 549 %l_build_path %{l_once l_build_path %(if [ -d %{l_prefix}/lib/openpkg/override ]; then \
michael@428 550 echo "%{l_prefix}/lib/openpkg/override:"; \
michael@428 551 fi)%{l_prefix}/bin:%{l_prefix}/sbin:@l_build_path@%(\
michael@428 552 if [ -d %{l_prefix}/lib/openpkg/fallback ]; then \
michael@428 553 echo ":%{l_prefix}/lib/openpkg/fallback"; \
michael@428 554 fi)}
michael@13 555 %l_build_ldlp %{l_prefix}/lib:@l_build_ldlp@
michael@13 556 %l_build_ulim @l_build_ulim@
michael@13 557 %l_build_shell_cmd %{l_prefix}/lib/openpkg/bash
michael@13 558 %l_build_shell_opt --norc --noprofile --posix
michael@13 559
michael@13 560 # sane build environment for manual usage in macros (currently just $PATH)
michael@428 561 %l_sane_env PATH="%{l_build_path}"; \
michael@428 562 export PATH; \
michael@428 563 LD_LIBRARY_PATH="%{l_build_ldlp}"; \
michael@428 564 export LD_LIBRARY_PATH
michael@13 565
michael@13 566 # sane build environment for %prep/%build/%install
michael@13 567 %_buildshell env -i %{l_build_shell_cmd} %{l_build_shell_opt}
michael@428 568 %___build_pre HOME="%{l_prefix}"\
michael@428 569 SHELL="%{l_build_shell_cmd}"\
michael@428 570 TERM="%{getenv:TERM}"\
michael@428 571 TMPDIR="%{_tmppath}"\
michael@428 572 USER="%{getenv:USER}"\
michael@428 573 LOGNAME="%{getenv:LOGNAME}"\
michael@428 574 PATH="%{l_build_path}"\
michael@428 575 LD_LIBRARY_PATH="%{l_build_ldlp}"\
michael@428 576 export HOME SHELL TMPDIR USER LOGNAME PATH LD_LIBRARY_PATH\
michael@428 577 RPM_SOURCE_DIR=\"%{u2p:%{_sourcedir}}\"\
michael@428 578 RPM_BUILD_DIR=\"%{u2p:%{_builddir}}\"\
michael@428 579 RPM_OPT_FLAGS=\"%{optflags}\"\
michael@428 580 RPM_ARCH=\"%{l_host_arch}\"\
michael@428 581 RPM_OS=\"%{l_host_os}\"\
michael@428 582 RPM_DOC_DIR=\"%{_docdir}\"\
michael@428 583 RPM_PACKAGE_NAME=\"%{name}\"\
michael@428 584 RPM_PACKAGE_VERSION=\"%{version}\"\
michael@428 585 RPM_PACKAGE_RELEASE=\"%{release}\"\
michael@428 586 export RPM_SOURCE_DIR RPM_BUILD_DIR RPM_OPT_FLAGS RPM_ARCH RPM_OS RPM_DOC_DIR\
michael@428 587 export RPM_PACKAGE_NAME RPM_PACKAGE_VERSION RPM_PACKAGE_RELEASE\
michael@428 588 %{?buildroot:RPM_BUILD_ROOT=\"%{u2p:%{buildroot}}\"\
michael@428 589 export RPM_BUILD_ROOT}\
michael@428 590 %{l_build_ulim}\
michael@428 591 umask 022\
michael@428 592 %{verbose:set -x}%{!verbose:exec >/dev/null}\
michael@428 593 cd %{u2p:%{_builddir}}
michael@428 594
michael@428 595 # improved %patch macro
michael@428 596 %patch(b:p:P:REz:F:d:e:m:) %{lua: \
michael@428 597 local subst = "" \
michael@428 598 local options = rpm.expand("%**") \
michael@428 599 local regex = "-e\\\\s*('[^']*'|\\"[^\\"]*\\"|\\\\S+)" \
michael@428 600 local pcre = rex_pcre.new(regex) \
michael@428 601 local n = 0 \
michael@428 602 while true do \
michael@428 603 local s, e, t = pcre:tfind(options, n) \
michael@428 604 if s == nil then break end \
michael@428 605 subst = subst .. " -e " .. t[1] \
michael@428 606 n = e + 1 \
michael@428 607 end \
michael@428 608 local regex = "-m\\\\s*('[^']*'|\\"[^\\"]*\\"|\\\\S+)" \
michael@428 609 local pcre = rex_pcre.new(regex) \
michael@428 610 local n = 0 \
michael@428 611 while true do \
michael@428 612 local s, e, t = pcre:tfind(options, n) \
michael@428 613 if s == nil then break end \
michael@428 614 subst = subst .. " -e 's;@" .. t[1] .. "@;%{" .. t[1] .. "};g'" \
michael@428 615 n = e + 1 \
michael@428 616 end \
michael@428 617 if subst ~= "" then \
michael@428 618 subst = "| sed" .. subst \
michael@428 619 rpm.define("__patch_subst " .. subst) \
michael@428 620 else \
michael@428 621 rpm.define("__patch_subst %{nil}") \
michael@428 622 end \
michael@428 623 }%{shrink: \
michael@428 624 %define __patch_number %{-P:%{-P*}}%{!-P:0} \
michael@428 625 %define __patch_file %{P:%{__patch_number}} \
michael@428 626 %define __patch_suffix %{-b:-b --suffix %{-b*}}%{!-b:-b --suffix .orig} %{-z:--suffix %{-z*}} \
michael@428 627 %define __patch_options -s %{-p:-p%{-p*}} %{-F:-F%{-F*}} %{-d:-d%{-d*}} %{-R} %{-E} %{__patch_suffix} \
michael@428 628 echo "Patch #%{__patch_number} (%{basename:%{__patch_file}}):"; \
michael@428 629 %{uncompress:%{__patch_file}} %{__patch_subst} | %{__patch} %{__patch_options}}\
michael@428 630 %{nil}
michael@13 631
michael@13 632 # special %track section support
michael@428 633 %__spec_track_pre\
michael@428 634 VCFILE="%{_tmppath}/%{name}-%{version}-%{release}.track.vc"\
michael@13 635 rm -f $VCFILE\
michael@13 636 set -o noclobber\
michael@13 637 sed -e 's;^ *#.*$;;' -e 's;^ ;;' >$VCFILE <<'EOF'\
michael@13 638 %{nil}
michael@13 639 %__spec_track_post EOF\
michael@13 640 if [ ".%{?___track_dump}" = .yes ]; then\
michael@13 641 cat $VCFILE\
michael@13 642 else\
michael@13 643 if [ ! -f "%{l_vcheck}" ]; then\
michael@13 644 echo "rpm:ERROR: Vendor source tracking functionality currently not available because"\
michael@13 645 echo "rpm:ERROR: URL tracking tool vcheck(1) not found under \\"%{l_vcheck}\\"."\
michael@13 646 echo "rpm:ERROR: You have to install the OpenPKG \\"vcheck\\" package first or set"\
michael@13 647 echo "rpm:ERROR: the RPM macro \\"%%{l_vcheck}\\" to the path of your vcheck(1) tool."\
michael@13 648 exit 0\
michael@13 649 fi\
michael@13 650 ( echo "config = {"\
michael@13 651 echo "}"\
michael@13 652 ) >>$VCFILE\
michael@428 653 %{l_vcheck} %{verbose:--verbose}%{!verbose:--noverbose} -f $VCFILE || true\
michael@13 654 fi\
michael@13 655 rm -f $VCFILE\
michael@13 656 %{nil}
michael@13 657
michael@428 658 # support additional .spec tags
michael@428 659 %_arbitrary_tags Class:Track:TrackProg:BuildDependency:BuildEnvironment:My*:Local*
michael@428 660
michael@428 661 # disable /bin/sh dependency (which doesn't fit into OpenPKG's environment)
michael@428 662 %_disable_shell_interpreter_deps 1
michael@428 663
michael@428 664 # support downloading files via cURL (instead of internal RPMIO)
michael@428 665 # and optionally also from global and local mirror and backup location(s)
michael@428 666 %__urlgetfile_urls_mirror() \
michael@428 667 %{nil}
michael@428 668 %__urlgetfile_urls_backup() %{lua: \
michael@428 669 local url = rpm.expand("%1") \
michael@428 670 local name = rpm.expand("%{name}") \
michael@428 671 if name ~= "" and url ~= "" then \
michael@428 672 local cache = "http://download.openpkg.org/components/cache/" .. name .. "/" \
michael@428 673 url = util.rsubst(url, "^.+/([^/]+)$", cache .. "%1") \
michael@428 674 print(url) \
michael@428 675 end \
michael@428 676 }
michael@428 677 %__urlgetfile_urls() \
michael@428 678 %{?__urlgetfile_urls_mirror %1} %1 %{?__urlgetfile_urls_backup %1}
michael@428 679 %__urlgetfile() %{lua: \
michael@428 680 local url_orig = rpm.expand("%1") \
michael@428 681 local file = rpm.expand("%2") \
michael@428 682 local urls = util.rsplit(rpm.expand("%{?__urlgetfile_urls " .. url_orig .. "}"), "\\\\s+") \
michael@428 683 local result = "ERROR" \
michael@428 684 local type = "mirror" \
michael@428 685 for i, url in ipairs(urls) do \
michael@428 686 if url ~= "" then
michael@428 687 if url == url_orig then \
michael@428 688 type = "original" \
michael@428 689 elseif type == "original" then \
michael@428 690 type = "backup" \
michael@428 691 end \
michael@428 692 io.stdout:write(string.format("Fetching(%s): %s\\n", type, url)) \
michael@428 693 local rc = rpm.expand( \
michael@428 694 "%(%{l_prefix}/bin/openpkg curl '-#' -L -R -k " .. \
michael@428 695 "-o '" .. file .. "'" .. " '" .. url .. "' 1>&2; echo $?)" \
michael@428 696 ) \
michael@428 697 if rc == "0" then \
michael@428 698 result = "OK" \
michael@428 699 break \
michael@428 700 end \
michael@428 701 end
michael@428 702 end \
michael@428 703 print(result) \
michael@428 704 }
michael@428 705
michael@428 706 # increase size of line buffer for .spec file parsing
michael@428 707 # from 10KB to 4MB to support rather large BuildEnvironment tags
michael@428 708 %_spec_line_buffer_size 4000000
michael@428 709
michael@428 710 # configure auto-generation of OpenPKG "BuildDependency" and "BuildEnvironment" tags
michael@428 711 %__autogen_builddependency 0
michael@428 712 %__autogen_buildenvironment 0
michael@428 713
michael@428 714 # hook into %description
michael@428 715 %description\
michael@428 716 %{?__hook_description_1}\
michael@428 717 %{?__hook_description_2}\
michael@428 718 %{?__hook_description_3}\
michael@428 719 %{?__hook_description_4}\
michael@428 720 %{?__hook_description_5}\
michael@428 721 %{?__hook_description_6}\
michael@428 722 %{?__hook_description_7}\
michael@428 723 %{?__hook_description_8}\
michael@428 724 %{?__hook_description_9}\
michael@428 725 %%description
michael@428 726
michael@428 727 # magically provide additional tags which are required but are always the same
michael@427 728 %__hook_description_1 %{lua: \
michael@427 729 local prefix = rpm.expand("%{l_prefix_static}") \
michael@427 730 if rpm.expand("%{?prefix}") ~= prefix then \
michael@427 731 print(string.format("Prefix: %s\\n", prefix)) \
michael@427 732 end \
michael@427 733 print("AutoReq: no\\n") \
michael@427 734 print("AutoReqProv: no\\n") \
michael@427 735 }
michael@427 736
michael@428 737 # auto-generate arbitrary tag "Marker" (via "rpm --marker <marker>")
michael@428 738 %__hook_description_2 %{?__marker:Marker: %{__marker}}\
michael@428 739 %{nil}
michael@428 740
michael@428 741 # auto-generate arbitrary tag "BuildDependency" from the standard tag(s) "BuildPreReq"
michael@428 742 # in order to forward-carry this build-time information to the binary RPM and to the RPMDB.
michael@428 743 %__hook_description_3 %{?__autogen_builddependency:%{?buildprereq:BuildDependency: %{@buildprereq:, }}}\
michael@428 744 %{nil}
michael@428 745
michael@428 746 # magically pickup all patched packaging source files (.orig/.rej)
michael@428 747 %__hook_description_4 %{lua: \
michael@428 748 -- assemble RPM's information about SourceN and PatchN \
michael@428 749 local sources = {} \
michael@428 750 local macros = rpm.macros() \
michael@428 751 for name, value in pairs(macros) do \
michael@428 752 local s, _, m = util.rmatch(name, "^(?i)(SOURCE|PATCH)((?:URL)?)(\\\\d+)$") \
michael@428 753 if s ~= nil and value["body"] ~= nil then \
michael@428 754 local n = string.upper(string.sub(m[1], 1, 1)) .. string.lower(string.sub(m[1], 2)) .. m[3] \
michael@428 755 if sources[n] == nil then \
michael@428 756 sources[n] = { url = "", file = "" } \
michael@428 757 end \
michael@428 758 if m[2] ~= nil and m[2] ~= "" then \
michael@428 759 sources[n].url = value["body"] \
michael@428 760 else \
michael@428 761 sources[n].file = value["body"] \
michael@428 762 end \
michael@428 763 end \
michael@428 764 end \
michael@428 765 \
michael@428 766 -- add implicit .spec source file \
michael@428 767 sources["Source999"] = { \
michael@428 768 url = rpm.expand("%{name}.spec"), \
michael@428 769 file = rpm.expand("%{_specdir}/%{name}.spec") \
michael@428 770 } \
michael@428 771 \
michael@428 772 -- auto-generate tags for local SourceN and PatchN files \
michael@428 773 -- where any corresponding .orig/.rej files exists \
michael@428 774 for id, s in pairs(sources) do \
michael@428 775 if util.rmatch(s.url, "^(?:ftp|https?)://.+") == nil then \
michael@428 776 for i, ext in ipairs({ ".orig", ".rej" }) do \
michael@428 777 if posix.access(s.file .. ext, "r") == 0 then \
michael@428 778 local _, _, m = util.rmatch(id, "^(?i)(Source|Patch)(\\\\d+)$") \
michael@428 779 local tag = string.format("%s%d: %s\\n", m[1], 10000 * i + m[2], s.url .. ext) \
michael@428 780 print(tag) \
michael@428 781 end \
michael@428 782 end \
michael@428 783 end \
michael@428 784 end \
michael@428 785 }
michael@428 786
michael@428 787 # recursive package environment tracking configuration
michael@428 788 %__environment_delete_nve_regex ^gpg-pubkey-[^-]+-[^-]+$
michael@428 789 %__environment_prune_nve_regex ^%{name}-[^-]+-[^-]+$
michael@428 790 %__environment_prune_depth_number 3
michael@428 791 %__environment_debug 0
michael@428 792
michael@428 793 # recursive package environment implementation
michael@428 794 %__hook_description_5 %{nil}
michael@428 795 %__hook_description_5_orig %{?__autogen_buildenvironment:%{lua: \
michael@428 796 -- determine current debug status quo
michael@428 797 local debug = tonumber(rpm.expand("%{?__environment_debug}%{!?__environment_debug:0}")) \
michael@428 798 \
michael@428 799 -- determine current environment in serialized format \
michael@428 800 -- (which actually is the Lua table constructor syntax) \
michael@428 801 local result = {} \
michael@428 802 for _, line in ipairs(rpm.query( \
michael@428 803 "Q:\\\\[\\"%{name}-%{version}-%{release}\\"\\\\]=" .. \
michael@428 804 "%|buildenvironment?{%{buildenvironment}}:{\\\\{\\\\}}|,", \
michael@428 805 true, "*")) do \
michael@428 806 local s, _, m = util.rmatch(line, "(?s)^Q:(.+)$") \
michael@428 807 if s ~= nil then \
michael@428 808 table.insert(result, m[1]) \
michael@428 809 end \
michael@428 810 end \
michael@428 811 local constructor = "{" .. table.concat(result , "") .. "}" \
michael@428 812 \
michael@428 813 -- parse current environment \
michael@428 814 -- (by evaluating the constructor as a Lua script) \
michael@428 815 local environment = {} \
michael@428 816 local f = loadstring("return " .. constructor) \
michael@428 817 if f ~= nil then \
michael@428 818 environment = f() \
michael@428 819 else \
michael@428 820 io.stderr:write("rpm: WARNING: failed to parse Lua table constructor: " .. constructor .. "\\n") \
michael@428 821 end \
michael@428 822 if debug > 0 then \
michael@428 823 io.stdout:write("BuildEnvironment(original): " .. util.dump_object(environment, false) .. "\\n") \
michael@428 824 end
michael@428 825 \
michael@428 826 -- prune environment according to configuration \
michael@428 827 function prune_environment (environment, depth) \
michael@428 828 local delete_nve_regex = tostring(rpm.expand("%{?__environment_delete_nve_regex}")) \
michael@428 829 local prune_nve_regex = tostring(rpm.expand("%{?__environment_prune_nve_regex}")) \
michael@428 830 local prune_depth_number = tonumber(rpm.expand("%{?__environment_prune_depth_number}")) \
michael@428 831 if type(environment) == "table" then \
michael@428 832 for nve, _ in pairs(environment) do \
michael@428 833 if (prune_depth_number ~= nil and prune_depth_number > 0 and depth > prune_depth_number) or \
michael@428 834 (delete_nve_regex ~= "" and util.rmatch(nve, delete_nve_regex) ~= nil) then \
michael@428 835 environment[nve] = nil \
michael@428 836 elseif prune_nve_regex ~= nil and util.rmatch(nve, prune_nve_regex) ~= nil then \
michael@428 837 environment[nve] = {} \
michael@428 838 else \
michael@428 839 prune_environment(environment[nve], depth + 1) \
michael@428 840 end \
michael@428 841 end \
michael@428 842 end \
michael@428 843 end \
michael@428 844 prune_environment(environment, 1) \
michael@428 845 if debug > 0 then \
michael@428 846 io.stdout:write("BuildEnvironment(pruned): " .. util.dump_object(environment, false) .. "\\n") \
michael@428 847 end \
michael@428 848 \
michael@428 849 -- export serialized environment as an RPM tag \
michael@428 850 if type(environment) == "table" then \
michael@428 851 local tag = "BuildEnvironment: " .. util.dump_object(environment, true) .. "\\n" \
michael@428 852 print(tag) \
michael@428 853 if debug > 0 then \
michael@428 854 io.stdout:write(tag) \
michael@428 855 end \
michael@428 856 end \
michael@428 857 }}
michael@428 858
michael@428 859 # recursive package environment XML query support
michael@428 860 %__environment_to_xml %{lua: \
michael@428 861 local lua = io.stdin:read("*all") \
michael@428 862 local f = loadstring("return " .. lua) \
michael@428 863 local xml = ""
michael@428 864 if f ~= nil then \
michael@428 865 xml = xml .. "<?xml version=\\"1.0\\" encoding=\\"ISO-8859-1\\" standalone=\\"no\\"?>\\n" \
michael@428 866 xml = xml .. "<!DOCTYPE environment\\n" \
michael@428 867 xml = xml .. " PUBLIC \\"-//rpm5.org//DTD BuildEnvironment 1.0//EN\\"\\n" \
michael@428 868 xml = xml .. " \\"http://rpm5.org/dtd/environment-1.0.dtd\\">\\n" \
michael@428 869 function genxml (environment, prefix) \
michael@428 870 local xml = prefix .. "<environment>\\n" \
michael@428 871 for id, e in pairs(environment) do \
michael@428 872 xml = xml .. prefix .. " <package>\\n" \
michael@428 873 xml = xml .. prefix .. " <id>" .. id .. "</id>\\n" \
michael@428 874 if e ~= nil and next(e) ~= nil then \
michael@428 875 xml = xml .. genxml(e, prefix .. " ") \
michael@428 876 end \
michael@428 877 xml = xml .. prefix .. " </package>\\n" \
michael@428 878 end \
michael@428 879 xml = xml .. prefix .. "</environment>\\n" \
michael@428 880 return xml
michael@428 881 end \
michael@428 882 local environment = f() \
michael@428 883 xml = xml .. genxml(environment, "") \
michael@428 884 end \
michael@428 885 print(xml)
michael@428 886 }
michael@428 887
michael@428 888 # PGP public key information
michael@428 889 %l_pgpkey(n:F:) %{lua: \
michael@428 890 local name = rpm.expand("%{?-n:%{-n*}}%{!?-n:openpkg.org}") \
michael@428 891 local format = rpm.expand("%{?-F:%{-F*}}%{!?-F:%%f:%%i}") \
michael@428 892 local fn = "?" \
michael@428 893 local id = "?" \
michael@428 894 if name == "openpkg.com" then \
michael@428 895 fn = rpm.expand("%{l_prefix}/etc/openpkg/openpkg.com.pgp") \
michael@428 896 id = "7D121A8FC05DC18A4329E9EF67042EC961B7AE34" \
michael@428 897 elseif name == "openpkg.net" then \
michael@428 898 fn = rpm.expand("%{l_prefix}/etc/openpkg/openpkg.net.pgp") \
michael@428 899 id = "3BD10E1171B22598D7708C48AEBE764552197903" \
michael@428 900 elseif name == "openpkg.org" then \
michael@428 901 fn = rpm.expand("%{l_prefix}/etc/openpkg/openpkg.org.pgp") \
michael@428 902 id = "6D96EFCFCF75328810DB40C2807593E063C4CB9F" \
michael@428 903 end \
michael@428 904 local result = util.rsubst(format, "%([nfi])", { ["n"] = name, ["f"] = fn, ["i"] = id }) \
michael@428 905 print(result) \
michael@428 906 }
michael@428 907
michael@428 908 # integrity checking configuration
michael@428 909 %_integrity_spec_cfg_idx %{l_prefix}/etc/openpkg/license
michael@428 910 %_integrity_spec_cfg_dir %{l_prefix}/etc/openpkg/license.d
michael@428 911 %_integrity_spec_cfg %{lua: \
michael@428 912 local idx = rpm.slurp(rpm.expand("%{_integrity_spec_cfg_idx}")) \
michael@428 913 idx = util.rsubst(idx, "(?s)\\\\s*(.+?)\\\\s*$", "%1") \
michael@428 914 local cfg = rpm.expand("%{_integrity_spec_cfg_dir}") .. "/" .. idx \
michael@428 915 print(cfg) \
michael@428 916 }
michael@428 917 %_integrity_proc_lua %{l_prefix}/lib/openpkg/license.lua
michael@428 918 %_integrity_pkey_pgp %{l_prefix}/etc/openpkg/openpkg.com.pgp
michael@428 919
michael@428 920 ##
michael@428 921 ## Support for OpenPKG Flexible Filesystem Layout
michael@428 922 ##
michael@428 923
michael@428 924 # layout definition: RPM to OpenPKG variable mapping
michael@428 925 %_specdir %{expand:%%global _specdir %%{__openpkg_layout variable=specdir %{?openpkg_layout_specdir} %{!?openpkg_layout_specdir: %{openpkg_layout}}}}%{_specdir}
michael@428 926 %_sourcedir %{expand:%%global _sourcedir %%{__openpkg_layout variable=sourcedir %{?openpkg_layout_sourcedir}%{!?openpkg_layout_sourcedir:%{openpkg_layout}}}}%{_sourcedir}
michael@428 927 %_builddir %{expand:%%global _builddir %%{__openpkg_layout variable=builddir %{?openpkg_layout_builddir} %{!?openpkg_layout_builddir: %{openpkg_layout}}}}%{_builddir}
michael@428 928 %_tmppath %{expand:%%global _tmppath %%{__openpkg_layout variable=tmppath %{?openpkg_layout_tmppath} %{!?openpkg_layout_tmppath: %{openpkg_layout}}}}%{_tmppath}
michael@428 929 %_rpmdir %{expand:%%global _rpmdir %%{__openpkg_layout variable=rpmdir %{?openpkg_layout_rpmdir} %{!?openpkg_layout_rpmdir: %{openpkg_layout}}}}%{_rpmdir}
michael@428 930 %_srcrpmdir %{expand:%%global _srcrpmdir %%{__openpkg_layout variable=srcrpmdir %{?openpkg_layout_srcrpmdir}%{!?openpkg_layout_srcrpmdir:%{openpkg_layout}}}}%{_srcrpmdir}
michael@428 931
michael@428 932 # default OpenPKG filesystem layout
michael@428 933 %openpkg_layout macrosfile=%{macrosfile} layout=global
michael@428 934
michael@428 935 # layout determination: RPM macro to RPM Lua entry point
michael@428 936 %__openpkg_layout() %{lua: print(openpkg.layout(rpm.expand("%*"))) }
michael@428 937
michael@428 938 # calculated base directory (placeholder definition only)
michael@428 939 %__openpkg_basedir %{l_prefix}
michael@428 940
michael@428 941 # temporary path determination
michael@428 942 %__openpkg_tmpdir %{lua: print(openpkg.tmpdir()) }
michael@428 943
michael@428 944 # shared environment (SE) support
michael@428 945 %__openpkg_SE_id %{l_hostname}-%{l_platform}-%{l_tag}
michael@428 946 %__openpkg_SE_subdir %{?__openpkg_shared:/%{__openpkg_SE_id}}
michael@428 947
michael@428 948 # layout definition: GLOBAL filesystem layout
michael@428 949 %__openpkg_layout_global_specdir() %{l_prefix}/RPM/SRC/%{?name}
michael@428 950 %__openpkg_layout_global_sourcedir() %{l_prefix}/RPM/SRC/%{?name}
michael@428 951 %__openpkg_layout_global_builddir() %{l_prefix}/RPM/TMP
michael@428 952 %__openpkg_layout_global_tmppath() %{l_prefix}/RPM/TMP
michael@428 953 %__openpkg_layout_global_rpmdir() %{l_prefix}/RPM/PKG
michael@428 954 %__openpkg_layout_global_srcrpmdir() %{l_prefix}/RPM/PKG
michael@428 955
michael@428 956 # layout definition: LOCAL filesystem layout
michael@428 957 %__openpkg_layout_local_specdir() %{__openpkg_basedir}
michael@428 958 %__openpkg_layout_local_sourcedir() %{__openpkg_basedir}
michael@428 959 %__openpkg_layout_local_builddir() %{__openpkg_basedir}/.openpkg-tmp:+%{__openpkg_SE_subdir}
michael@428 960 %__openpkg_layout_local_tmppath() %{__openpkg_basedir}/.openpkg-tmp:+%{__openpkg_SE_subdir}
michael@428 961 %__openpkg_layout_local_rpmdir() %{__openpkg_basedir}
michael@428 962 %__openpkg_layout_local_srcrpmdir() %{__openpkg_basedir}
michael@428 963
michael@428 964 # layout definition: SIMPLE local filesystem layout
michael@428 965 %__openpkg_layout_simple_specdir() %{__openpkg_basedir}
michael@428 966 %__openpkg_layout_simple_sourcedir() %{__openpkg_basedir}
michael@428 967 %__openpkg_layout_simple_builddir() %{__openpkg_tmpdir}:+%{__openpkg_SE_subdir}
michael@428 968 %__openpkg_layout_simple_tmppath() %{__openpkg_tmpdir}:+%{__openpkg_SE_subdir}
michael@428 969 %__openpkg_layout_simple_rpmdir() %{realpath:%{__openpkg_basedir}/..}
michael@428 970 %__openpkg_layout_simple_srcrpmdir() %{realpath:%{__openpkg_basedir}/..}
michael@428 971
michael@428 972 # layout definition: STRUCTURED local filesystem layout
michael@428 973 %__openpkg_layout_structured_specdir() %{__openpkg_basedir}/src
michael@428 974 %__openpkg_layout_structured_sourcedir() %{__openpkg_basedir}/dst %{__openpkg_basedir}/src
michael@428 975 %__openpkg_layout_structured_builddir() %{__openpkg_basedir}/tmp:+%{__openpkg_SE_subdir} %{__openpkg_tmpdir}:+%{__openpkg_SE_subdir}
michael@428 976 %__openpkg_layout_structured_tmppath() %{__openpkg_basedir}/tmp:+%{__openpkg_SE_subdir} %{__openpkg_tmpdir}:+%{__openpkg_SE_subdir}
michael@428 977 %__openpkg_layout_structured_rpmdir() %{__openpkg_basedir}/pkg/bin %{__openpkg_basedir}/pkg %{__openpkg_basedir}
michael@428 978 %__openpkg_layout_structured_srcrpmdir() %{__openpkg_basedir}/pkg/src %{__openpkg_basedir}/pkg %{__openpkg_basedir}
michael@428 979
michael@428 980 # layout definition: DISTRIBUTED local filesystem layout
michael@428 981 %__openpkg_layout_distributed_specdir() %{__openpkg_basedir}/src/%{?name}
michael@428 982 %__openpkg_layout_distributed_sourcedir() %{__openpkg_basedir}/dst/%{?name} %{__openpkg_basedir}/src/%{?name}
michael@428 983 %__openpkg_layout_distributed_builddir() %{__openpkg_basedir}/tmp:+%{__openpkg_SE_subdir} %{__openpkg_tmpdir}:+%{__openpkg_SE_subdir}
michael@428 984 %__openpkg_layout_distributed_tmppath() %{__openpkg_basedir}/tmp:+%{__openpkg_SE_subdir} %{__openpkg_tmpdir}:+%{__openpkg_SE_subdir}
michael@428 985 %__openpkg_layout_distributed_rpmdir() %{__openpkg_basedir}/pkg/bin %{__openpkg_basedir}/pkg %{__openpkg_basedir}
michael@428 986 %__openpkg_layout_distributed_srcrpmdir() %{__openpkg_basedir}/pkg/src %{__openpkg_basedir}/pkg %{__openpkg_basedir}
michael@428 987

mercurial