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.

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

mercurial