summaryrefslogtreecommitdiffstats
path: root/source-builder
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2019-09-12 20:09:13 +1000
committerChris Johns <chrisj@rtems.org>2019-09-16 08:21:40 +1000
commit4b7af073000d612b21b9dece538d2bcc85c0c240 (patch)
tree06d63a8d5a04974af5af8215d547d261ebd073d9 /source-builder
parentsb/setbuilder: Add a trace to help installing. (diff)
downloadrtems-source-builder-4b7af073000d612b21b9dece538d2bcc85c0c240.tar.bz2
5/llvm: Add LLVM as a package for RTEMS.
- Add '%source download <source>' to only download the source and do not unpack and prep. This can used when a package internally needs another source package. - Install the staging root only if it is present. A package may internally build another package that is not staged as it is not suitable for installing. Updates #3250 Updatew #3797
Diffstat (limited to 'source-builder')
-rw-r--r--source-builder/config/llvm-common-1.cfg152
-rw-r--r--source-builder/config/swig-4-1.cfg97
-rw-r--r--source-builder/defaults.mc3
-rw-r--r--source-builder/sb/build.py99
-rw-r--r--source-builder/sb/darwin.py1
-rw-r--r--source-builder/sb/freebsd.py1
-rw-r--r--source-builder/sb/options.py2
-rw-r--r--source-builder/sb/setbuilder.py54
-rw-r--r--source-builder/sb/sources.py27
9 files changed, 363 insertions, 73 deletions
diff --git a/source-builder/config/llvm-common-1.cfg b/source-builder/config/llvm-common-1.cfg
new file mode 100644
index 0000000..c75769f
--- /dev/null
+++ b/source-builder/config/llvm-common-1.cfg
@@ -0,0 +1,152 @@
+#
+# LLVM Common Support.
+#
+# This configuration file configure's, make's and install's LLVM and some of
+# it projects.
+#
+
+%include %{_configdir}/checks.cfg
+
+#
+# The package description.
+#
+Name: rtems-llvm-%{llvm_version}-%{_host}-%{release}
+Summary: LLVM v%{llvm_version} on host %{_host}
+Version: %{llvm_version}
+Release: %{release}
+URL: http://llvm.org/
+
+#
+# The LLVM version depends on the type of build we are doing.
+#
+%if %{rsb_released}
+ %define rtems_llvm_version %{rsb_version}
+%else
+ %define rtems_llvm_version %{rtems_version}
+%endif
+
+#
+# LLVM Download URL.
+#
+%define llvm_url https://github.com/llvm/llvm-project/releases/download/llvmorg-%{llvm_version}
+
+#
+# Packages
+#
+%source set cfe %{llvm_url}/cfe-%{llvm_version}.src.tar.xz
+%source set clang-tools-extra %{llvm_url}/clang-tools-extra-%{llvm_version}.src.tar.xz
+%source set compiler-rt %{llvm_url}/compiler-rt-%{llvm_version}.src.tar.xz
+%source set libcxx %{llvm_url}/libcxx-%{llvm_version}.src.tar.xz
+%source set libcxxabi %{llvm_url}/libcxxabi-%{llvm_version}.src.tar.xz
+%source set libunwind %{llvm_url}/libunwind-%{llvm_version}.src.tar.xz
+%source set lld %{llvm_url}/lld-%{llvm_version}.src.tar.xz
+%source set lldb %{llvm_url}/lldb-%{llvm_version}.src.tar.xz
+%source set llvm %{llvm_url}/llvm-%{llvm_version}.src.tar.xz
+%source set openmp %{llvm_url}/openmp-%{llvm_version}.src.tar.xz
+
+#
+# Build LLDB on all hosts except MacOS as it reqires a codesign login key of
+# name 'llvm'.
+#
+%if %{_build_os} != darwin
+ %define with_llvm_lldb 1
+%endif
+
+%if %{defined with_llvm_lldb}
+ %define lldb_codesign_identity -DLLDB_CODESIGN_IDENTITY=llvm
+%else
+ %define lldb_codesign_identity %{nil}
+%endif
+
+#
+# Prepare the source code.
+#
+%prep
+ # save the build top directory and cd back to it rather than
+ # using 'cd ..' because some shells change $PWD to a symlink's
+ # target location and 'cd ..' fails.
+ build_top=$(pwd)
+
+ llvm_source=%{?llvm_external:%{llvm_expand_name}}%{!?llvm_external:"llvm-%{llvm_version}"}
+
+ # llvm is a collection of separate packages, download them and then create
+ # the source tree.
+
+ source_dir_llvm=${llvm_source}
+
+ %source setup llvm -q
+ %{__mv} llvm-%{llvm_version}.src ${source_dir_llvm}
+
+ %source setup cfe -q
+ %{__mv} cfe-%{llvm_version}.src ${source_dir_llvm}/tools/clang
+
+ %source setup clang-tools-extra -q
+ %{__mv} clang-tools-extra-%{llvm_version}.src ${source_dir_llvm}/tools/clang/extra
+
+ %source setup compiler-rt -q
+ %{__mv} compiler-rt-%{llvm_version}.src ${source_dir_llvm}/projects/compiler-rt
+
+ %source setup libcxx -q
+ %{__mv} libcxx-%{llvm_version}.src ${source_dir_llvm}/projects/libcxx
+
+ %source setup libcxxabi -q
+ %{__mv} libcxxabi-%{llvm_version}.src ${source_dir_llvm}/projects/libcxxabi
+
+ %source setup libunwind -q
+ %{__mv} libunwind-%{llvm_version}.src ${source_dir_llvm}/projects/libunwind
+
+ %source setup lld -q
+ %{__mv} lld-%{llvm_version}.src ${source_dir_llvm}/tools/lld
+
+ %if %{defined with_llvm_lldb}
+ %source setup lldb -q
+ %{__mv} lldb-%{llvm_version}.src ${source_dir_llvm}/tools/lldb
+ %endif
+
+ %source setup openmp -q
+ %{__mv} openmp-%{llvm_version}.src ${source_dir_llvm}/tools/openmp
+
+ %patch setup llvm -p1
+
+ cd ${build_top}
+
+%build
+ build_top=$(pwd)
+
+ # SWIG will be built and installed into %{swig_prefix} if defined
+ # so add it as a path.
+ %if %{defined swig_prefix}
+ export PATH=%{swig_prefix}/bin:$PATH
+ %endif
+
+ %{build_directory}
+
+ mkdir -p ${build_dir}
+ cd ${build_dir}
+
+ %{__cmake} -Wno-dev \
+ -G "Unix Makefiles" \
+ -DCMAKE_BUILD_TYPE=Release \
+ -DCMAKE_INSTALL_PREFIX=%{_prefix} \
+ -DPACKAGE_VERSION="%{llvm_version} (%{llvm_version_message})" \
+ %{lldb_codesign_identity} \
+ ../${source_dir_llvm}
+
+ version_inc="tools/clang/include/clang/Basic/Version.inc"
+ %{__cat} ${version_inc} | \
+ sed -e 's/CLANG_VERSION_STRING "[0-9]*\.[0-9]*\.[0-9]*/& \(%{llvm_version_message}\)/g' \
+ > ${version_inc}.tmp
+ %{__mv} ${version_inc}.tmp ${version_inc}
+
+ %{__make} %{?_smp_mflags}
+
+ cd ${build_top}
+
+%install
+ build_top=$(pwd)
+
+ %{__rmdir} $SB_BUILD_ROOT
+
+ cd ${build_dir}
+ %{__make} DESTDIR=$SB_BUILD_ROOT install
+ cd ${build_top}
diff --git a/source-builder/config/swig-4-1.cfg b/source-builder/config/swig-4-1.cfg
new file mode 100644
index 0000000..6c10114
--- /dev/null
+++ b/source-builder/config/swig-4-1.cfg
@@ -0,0 +1,97 @@
+#
+# SWIG 4.xx Version 1.
+#
+# This configuration file configure's, make's and install's m4
+#
+# Warning: this package is only for bootstrapping within a build.
+#
+
+
+Name: swig-%{swig_version}-%{_host}-%{release}
+Summary: SWIG v%{swig_version} for host %{_host}
+Version: %{swig_version}
+Release: %{release}
+URL: http://www.swig.org/
+
+#
+# Source
+#
+%source set swig --rsb-file=swig-rel-%{swig_version}.tar.gz https://github.com/swig/swig/archive/rel-%{swig_version}.tar.gz
+%source set pcre https://ftp.pcre.org/pub/pcre/pcre-%{pcre_version}.tar.bz2
+
+#
+# See if a special swig prefix is provided
+#
+%if %{defined swig_prefix}
+ %define _disable_collecting yes
+ %define _disable_packaging yes
+ %define _disable_reporting yes
+ %define _disable_installing yes
+%endif
+
+#
+# Prepare the source code.
+#
+%prep
+ build_top=$(pwd)
+
+ source_dir_swig="swig-rel-%{swig_version}"
+
+ %source setup swig -q -n swig-rel-%{swig_version}
+ %source download pcre
+
+ %patch setup swig -p1
+
+ # SWIG does not ship from github with it's generated files. We
+ # need to generate them.
+ # Add the path to the internal autoconf tools
+ SWIG_XPATH=$PATH
+ %if %{defined _internal_autotools_path}
+ export PATH=%{_internal_autotools_path}/bin:$PATH
+ %endif
+ ./autogen.sh
+ export PATH=$SWIG_XPATH
+
+ cd ${build_top}
+
+%build
+ build_top=$(pwd)
+
+ %{build_directory}
+
+ mkdir -p ${build_dir}
+ cd ${build_dir}
+
+ %{host_build_flags}
+
+ # build PCRE using the SWIG script as it is a static link
+ %{__cp} %{_sourcedir}/pcre-%{pcre_version}.tar.bz2 pcre-%{pcre_version}.tar.bz2
+ ../${source_dir_swig}/Tools/pcre-build.sh
+
+ %if %{defined swig_prefix}
+ prefix=%{swig_prefix}
+ %else
+ prefix=%{_prefix}
+ %endif
+
+ ../${source_dir_swig}/configure \
+ --host=%{_host} \
+ --prefix=${prefix}
+
+ %{__make} %{?_smp_mflags}
+
+ cd ${build_top}
+
+%install
+ build_top=$(pwd)
+
+ %{__rmdir} ${SB_BUILD_ROOT}
+
+ cd ${build_dir}
+ %if %{!defined swig_prefix}
+ %define destdir DESTDIR=${SB_BUILD_ROOT}
+ %else
+ %define destdir %{nil}
+ %endif
+ %{__make} %{destdir} install
+ cd ${build_top}
diff --git a/source-builder/defaults.mc b/source-builder/defaults.mc
index 9d5dd44..273bd31 100644
--- a/source-builder/defaults.mc
+++ b/source-builder/defaults.mc
@@ -157,6 +157,7 @@ __cc: exe, required, 'gcc'
__chgrp: exe, required, '/usr/bin/chgrp'
__chmod: exe, required, '/bin/chmod'
__chown: exe, required, '/usr/sbin/chown'
+__cmake: exe, optional, '/usr/bin/cmake'
__cp: exe, required, '/bin/cp'
__cpp: exe, none, '%{__cc} -E'
__cvs: exe, optional, '/usr/bin/cvs'
@@ -205,7 +206,7 @@ ___build_cmd: none, none, '%{?_sudo:%{_sudo} }%{?_remsh:%{_remsh}
___build_post: none, none, 'exit 0'
# Prebuild set up script.
-___build_pre: none, none, '''# ___build_pre in as set up in defaults.py
+___build_pre: none, none, '''# ___build_pre as set up in defaults.py
# Save the original path away.
export SB_ORIG_PATH=${PATH}
# Directories
diff --git a/source-builder/sb/build.py b/source-builder/sb/build.py
index abc50c0..69f95cf 100644
--- a/source-builder/sb/build.py
+++ b/source-builder/sb/build.py
@@ -203,7 +203,7 @@ class build:
not _disable_installing and \
not _canadian_cross
- def source(self, name, strip_components):
+ def source(self, name, strip_components, download_only):
#
# Return the list of sources. Merge in any macro defined sources as
# these may be overridden by user loaded macros.
@@ -238,31 +238,37 @@ class build:
if o.startswith('--rsb-file'):
os_ = o.split('=')
if len(os_) != 2:
- raise error.general('invalid --rsb-file option: %s' % (' '.join(args)))
+ raise error.general('invalid --rsb-file option: %s' % \
+ (' '.join(args)))
if os_[0] != '--rsb-file':
- raise error.general('invalid --rsb-file option: %s' % (' '.join(args)))
+ raise error.general('invalid --rsb-file option: %s' % \
+ (' '.join(args)))
file_override = os_[1]
opts = [o for o in opts if not o.startswith('--rsb-')]
url = self.config.expand(' '.join(url))
- src = download.parse_url(url, '_sourcedir', self.config, self.opts, file_override)
+ src = download.parse_url(url, '_sourcedir',
+ self.config, self.opts, file_override)
download.get_file(src['url'], src['local'], self.opts, self.config)
- if strip_components > 0:
- tar_extract = '%%{__tar_extract} --strip-components %d' % (strip_components)
- else:
- tar_extract = '%{__tar_extract}'
- if 'symlink' in src:
- sname = name.replace('-', '_')
- src['script'] = '%%{__ln_s} %s ${source_dir_%s}' % (src['symlink'], sname)
- elif 'compressed' in src:
- #
- # Zip files unpack as well so do not use tar.
- #
- src['script'] = '%s %s' % (src['compressed'], src['local'])
- if src['compressed-type'] != 'zip':
- src['script'] += ' | %s -f -' % (tar_extract)
- else:
- src['script'] = '%s -f %s' % (tar_extract, src['local'])
- srcs += [src]
+ if not download_only:
+ if strip_components > 0:
+ tar_extract = '%%{__tar_extract} --strip-components %d' % \
+ (strip_components)
+ else:
+ tar_extract = '%{__tar_extract}'
+ if 'symlink' in src:
+ sname = name.replace('-', '_')
+ src['script'] = '%%{__ln_s} %s ${source_dir_%s}' % \
+ (src['symlink'], sname)
+ elif 'compressed' in src:
+ #
+ # Zip files unpack as well so do not use tar.
+ #
+ src['script'] = '%s %s' % (src['compressed'], src['local'])
+ if src['compressed-type'] != 'zip':
+ src['script'] += ' | %s -f -' % (tar_extract)
+ else:
+ src['script'] = '%s -f %s' % (tar_extract, src['local'])
+ srcs += [src]
return srcs
def source_setup(self, package, args):
@@ -270,7 +276,7 @@ class build:
setup_name = args[1]
args = args[1:]
try:
- opts, args = getopt.getopt(args[1:], 'qDcn:bas:')
+ opts, args = getopt.getopt(args[1:], 'qDcn:bas:g')
except getopt.GetoptError as ge:
raise error.general('source setup error: %s' % str(ge))
quiet = False
@@ -282,6 +288,7 @@ class build:
changed_dir = False
strip_components = 0
opt_name = None
+ download_only = False
for o in opts:
if o[0] == '-q':
quiet = True
@@ -297,30 +304,37 @@ class build:
unpack_before_chdir = False
elif o[0] == '-s':
if not o[1].isdigit():
- raise error.general('source setup error: invalid strip count: %s' % (o[1]))
+ raise error.general('source setup error: invalid strip count: %s' % \
+ (o[1]))
strip_components = int(o[1])
+ elif o[0] == '-g':
+ download_only = True
name = None
- for source in self.source(setup_name, strip_components):
+ for source in self.source(setup_name, strip_components, download_only):
if name is None:
if opt_name is None:
if source:
opt_name = source['name']
else:
- raise error.general('setup source tag not found: %d' % (source_tag))
+ raise error.general('setup source tag not found: %d' % \
+ (source_tag))
else:
name = opt_name
- self.script_build.append(self.config.expand('cd %{_builddir}'))
- if not deleted_dir and delete_before_unpack:
- self.script_build.append(self.config.expand('%{__rm} -rf ' + name))
- deleted_dir = True
- if not created_dir and create_dir:
- self.script_build.append(self.config.expand('%{__mkdir_p} ' + name))
- created_dir = True
- if not changed_dir and (not unpack_before_chdir or create_dir):
- self.script_build.append(self.config.expand('cd ' + name))
- changed_dir = True
- self.script_build.append(self.config.expand(source['script']))
- if not changed_dir and (unpack_before_chdir and not create_dir):
+ if not download_only:
+ self.script_build.append(self.config.expand('cd %{_builddir}'))
+ if not deleted_dir and delete_before_unpack and name is not None:
+ self.script_build.append(self.config.expand('%{__rm} -rf ' + name))
+ deleted_dir = True
+ if not created_dir and create_dir and name is not None:
+ self.script_build.append(self.config.expand('%{__mkdir_p} ' + name))
+ created_dir = True
+ if not changed_dir and (not unpack_before_chdir or create_dir) and \
+ name is not None:
+ self.script_build.append(self.config.expand('cd ' + name))
+ changed_dir = True
+ self.script_build.append(self.config.expand(source['script']))
+ if not changed_dir and (unpack_before_chdir and not create_dir) and \
+ name is not None and not download_only:
self.script_build.append(self.config.expand('cd ' + name))
changed_dir = True
self.script_build.append(self.config.expand('%{__setup_post}'))
@@ -345,7 +359,7 @@ class build:
else:
url += [pp]
if len(url) == 0:
- raise error.general('patch URL not found: %s' % (' '.join(args)))
+ raise error.general('patch URL not found: %s' % (' '.join(opts)))
#
# Look for --rsb-file as an option we use as a local file name.
# This can be used if a URL has no reasonable file name the
@@ -357,9 +371,11 @@ class build:
if o.startswith('--rsb-file'):
os_ = o.split('=')
if len(os_) != 2:
- raise error.general('invalid --rsb-file option: %s' % (' '.join(args)))
+ raise error.general('invalid --rsb-file option: %s' % \
+ (' '.join(opts)))
if os_[0] != '--rsb-file':
- raise error.general('invalid --rsb-file option: %s' % (' '.join(args)))
+ raise error.general('invalid --rsb-file option: %s' % \
+ (' '.join(opts)))
file_override = os_[1]
opts = [o for o in opts if not o.startswith('--rsb-')]
if len(opts) == 0:
@@ -371,7 +387,8 @@ class build:
#
# Parse the URL first in the source builder's patch directory.
#
- patch = download.parse_url(url, '_patchdir', self.config, self.opts, file_override)
+ patch = download.parse_url(url, '_patchdir', self.config,
+ self.opts, file_override)
#
# Download the patch
#
diff --git a/source-builder/sb/darwin.py b/source-builder/sb/darwin.py
index d79cf47..a21a6bc 100644
--- a/source-builder/sb/darwin.py
+++ b/source-builder/sb/darwin.py
@@ -52,6 +52,7 @@ def load():
'_var': ('dir', 'optional', '/usr/local/var'),
'_prefix': ('dir', 'optional', '%{_usr}'),
'__ldconfig': ('exe', 'none', ''),
+ '__cmake': ('exe', 'optional', 'cmake'),
'__cvs': ('exe', 'optional', 'cvs'),
'__xz': ('exe', 'required', 'xz'),
'with_zlib': ('none', 'none', '--with-zlib=no'),
diff --git a/source-builder/sb/freebsd.py b/source-builder/sb/freebsd.py
index decd1c9..8fc7db1 100644
--- a/source-builder/sb/freebsd.py
+++ b/source-builder/sb/freebsd.py
@@ -63,6 +63,7 @@ def load():
'_var': ('dir', 'optional', '/usr/local/var'),
'__bash': ('exe', 'optional', '/usr/local/bin/bash'),
'__bison': ('exe', 'required', '/usr/local/bin/bison'),
+ '__cmake': ('exe', 'optional', '/usr/local/bin/cmake'),
'__git': ('exe', 'required', '/usr/local/bin/git'),
'__svn': ('exe', 'optional', '/usr/local/bin/svn'),
'__unzip': ('exe', 'optional', '/usr/local/bin/unzip'),
diff --git a/source-builder/sb/options.py b/source-builder/sb/options.py
index 9fe0269..8063734 100644
--- a/source-builder/sb/options.py
+++ b/source-builder/sb/options.py
@@ -293,6 +293,8 @@ class command_line:
'--without-log',
'--without-error-report',
'--without-release-url']
+ if a == '--dry-run':
+ self.args += ['--without-error-report']
arg += 1
def post_process(self, logfile = True):
diff --git a/source-builder/sb/setbuilder.py b/source-builder/sb/setbuilder.py
index 380fa00..3d10d58 100644
--- a/source-builder/sb/setbuilder.py
+++ b/source-builder/sb/setbuilder.py
@@ -405,18 +405,6 @@ class buildset:
if nesting_count != 1:
if self.installing():
self.macros['install_mode'] = 'staging'
- #
- # Prepend staging areas, bin directory tothe
- # path. Lets the later package depend on the eailier
- # ones.
- #
- pathprepend = ['%{stagingroot}/bin'] + \
- macro_expand(self.macros, '%{_pathprepend}').split(':')
- pathprepend = [pp for pp in pathprepend if len(pp)]
- if len(pathprepend) == 1:
- self.macros['_pathprepend'] = pathprepend[0]
- else:
- self.macros['_pathprepend'] = ':'.join(pathprepend)
#
# Only the outter build set can have staging to install. Get the staging
@@ -430,6 +418,20 @@ class buildset:
log.trace('_bset: %2d: %s: configs: %s' % (nesting_count,
self.bset, ', '.join(configs)))
+ if nesting_count == 1 and len(configs) > 1:
+ #
+ # Prepend staging areas, bin directory to the
+ # path. Lets the later package depend on the earlier
+ # ones.
+ #
+ pathprepend = ['%{stagingroot}/bin'] + \
+ macro_expand(self.macros, '%{_pathprepend}').split(':')
+ pathprepend = [pp for pp in pathprepend if len(pp)]
+ if len(pathprepend) == 1:
+ self.macros['_pathprepend'] = pathprepend[0]
+ else:
+ self.macros['_pathprepend'] = ':'.join(pathprepend)
+
sizes_valid = False
builds = []
for s in range(0, len(configs)):
@@ -519,7 +521,7 @@ class buildset:
log.trace('_bset: %2d: %s: builds: %s' % \
(nesting_count, self.install_mode(),
', '.join([b.name() for b in builds])))
- if deps is None and not have_errors:
+ if deps is None and not self.opts.no_install() and not have_errors:
for b in builds:
log.trace('_bset: : %s: %r' % (self.install_mode(),
b.installable()))
@@ -586,18 +588,22 @@ class buildset:
# If builds have been staged install into the finaly prefix.
#
if have_staging and not self.opts.no_install() and not have_errors:
- log.trace('_bset: %2d: install staging' % (nesting_count))
stagingroot = macro_expand(self.macros, '%{stagingroot}')
- prefix = macro_expand(self.macros, '%{_prefix}')
- self.install(self.install_mode(), self.bset, stagingroot, prefix)
- staging_size = path.get_size(stagingroot)
- if not self.opts.no_clean() or self.opts.always_clean():
- log.notice('clean staging: %s' % (self.bset))
- log.trace('removing: %s' % (stagingroot))
- if not self.opts.dry_run():
- if path.exists(stagingroot):
- path.removeall(stagingroot)
- log.notice('Staging Size: %s' % (build.humanize_number(staging_size, 'B')))
+ have_stagingroot = path.exists(stagingroot)
+ log.trace('_bset: %2d: install staging, present: %s' % \
+ (nesting_count, have_stagingroot))
+ if have_stagingroot:
+ prefix = macro_expand(self.macros, '%{_prefix}')
+ self.install(self.install_mode(), self.bset, stagingroot, prefix)
+ staging_size = path.get_size(stagingroot)
+ if not self.opts.no_clean() or self.opts.always_clean():
+ log.notice('clean staging: %s' % (self.bset))
+ log.trace('removing: %s' % (stagingroot))
+ if not self.opts.dry_run():
+ if path.exists(stagingroot):
+ path.removeall(stagingroot)
+ log.notice('Staging Size: %s' % \
+ (build.humanize_number(staging_size, 'B')))
except error.general as gerr:
if not build_error:
log.stderr(str(gerr))
diff --git a/source-builder/sb/sources.py b/source-builder/sb/sources.py
index 967becc..c5f0037 100644
--- a/source-builder/sb/sources.py
+++ b/source-builder/sb/sources.py
@@ -49,8 +49,8 @@ def add(label, args, macros, error):
def set(label, args, macros, error):
args = _args(args)
if len(args) < 2:
- error('%%%s requires at least 2 arguments' % (label))
- return
+ error('%%%s set requires at least 2 arguments' % (label))
+ return []
_map = '%s-%s' % (label, args[0])
macros.create_map(_map)
key = _make_key(label, 0)
@@ -63,12 +63,26 @@ def set(label, args, macros, error):
def setup(label, args, macros, error):
args = _args(args)
if len(args) < 2:
- error('%%%s requires at least 2 arguments: %s' % (label, ' '.join(args)))
+ error('%%%s setup requires at least 2 arguments: %s' % (label, ' '.join(args)))
ss = '%%setup %s %s' % (label, ' '.join(args))
_map = '%s-%s' % (label, args[0])
if 'setup' in macros.map_keys(_map):
error('%%%s already setup source: %s' % (label, ' '.join(args)))
- return
+ return []
+ macros.set_write_map(_map)
+ macros.define('setup', ss)
+ macros.unset_write_map()
+ return [ss]
+
+def download(label, args, macros, error):
+ args = _args(args)
+ if len(args) != 1:
+ error('%%%s download requires 1 argument: %s' % (label, ' '.join(args)))
+ ss = '%%setup %s %s -g' % (label, ' '.join(args))
+ _map = '%s-%s' % (label, args[0])
+ if 'setup' in macros.map_keys(_map):
+ error('%%%s already setup source: %s' % (label, ' '.join(args)))
+ return []
macros.set_write_map(_map)
macros.define('setup', ss)
macros.unset_write_map()
@@ -79,15 +93,14 @@ def process(label, args, macros, error):
error('invalid source type: %s' % (label))
args = _args(args)
log.trace('sources: %s' % (' '.join(args)))
- if len(args) < 3:
- error('%%%s requires at least 3 arguments: %s' % (label, ' '.join(args)))
- return
if args[0] == 'set':
return set(label, args[1:], macros, error)
elif args[0] == 'add':
return add(label, args[1:], macros, error)
elif args[0] == 'setup':
return setup(label, args[1:], macros, error)
+ elif args[0] == 'download':
+ return download(label, args[1:], macros, error)
error('invalid %%%s command: %s' % (label, args[0]))
def hash(args, macros, error):