BaseTools: Remove unused txt files

externals.txt is to refer to the binary Win32. It is not used any longer.
BuildNotes.txt is to freeze BaseTools python. It is not used any longer.
BinaryFiles.txt is to list the file in Bin directory. But, Bin dir is empty.
building-gcc.txt and gcc is for mingw-gcc. It is not used any longer.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Liming Gao <liming.gao@intel.com>
Acked-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Bob Feng <bob.c.feng@intel.com>
This commit is contained in:
Liming Gao 2019-02-15 22:32:18 +08:00
parent 08283b966e
commit 3384f56803
6 changed files with 0 additions and 814 deletions

View File

@ -1 +0,0 @@
Win32 https://svn.code.sf.net/p/edk2-toolbinaries/code/trunk/Win32

View File

@ -1,83 +0,0 @@
Intel(R) Platform Innovation Framework for EFI
BuildTools Project, BaseTools Sub-Project
Root Package 1.00
2007-08-31
Intel is a trademark or registered trademark of Intel Corporation or its
subsidiaries in the United States and other countries.
* Other names and brands may be claimed as the property of others.
Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.
-------------------------------------------------------------------------------
Quick Start
-----------
Windows:
a) Go to the <buildtools_project>/BaseTools and run "toolsetup" script
Unix-like:
a) make -C <buildtools_project>/BaseTools
b) Look over https://github.com/tianocore/tianocore.github.io/wiki/Getting%20Started%20with%20EDK%20II
for a helpful step-by-step guide for building 'Hello World' on
various operating systems with edk2.
Supported build targets (toolsetup)
-----------------------------------
build(or none) - Incremental Build of all C based tools. This is the default target
rebuild - Clean all generated files and directories during build, and rebuild all tools
-------------------------------------------------------------------------------
Tools in Python
---------------
* Convert Python source to exe file
The tools written in Python can be converted into executable program which can
be executed without installing a Python interpreter. (Generally it is easier
to run the scripts from their source on operating systems other than Windows.)
For Windows and Linux, the conversion tool package is called cx_Freeze, its
home page is:
http://sourceforge.net/projects/cx-freeze/
If you have installed cx_Freeze at c:\cx_Freeze-3.0.3. Use following command
lines to convert MyBuild.py to MyBuild.exe (note this is an example, there is
no MyBuild Python project in the BaseTools\Python tree.
set PYTHONPATH=<BaseToolsDirPath>\Source\Python
c:\cx_Freeze-3.0.3\FreezePython.exe --include-modules=encodings.cp437,encodings.gbk,encodings.utf_16,encodings.utf_16_le,encodings.utf_8 --install-dir=.\mybuild MyBuild.py
The generated .exe (and .dll) files are put in "mybuild" subdirectory.
The following is a real example with the BuildTools/trunk/BaseTools project
installed in: C:\Work\BaseTools
C:\Work\BaseTools\Source\Python> set PYTHONPATH=C:\Work\BaseTools\Source\Python
C:\Work\BaseTools\Source\Python> c:\cx_Freeze-3.0.3\FreezePython.exe --include-modules=encodings.cp437,encodings.gbk,encodings.utf_16,encodings.utf_16_le,encodings.utf_8 --install-dir=C:\Work\BaseTools\Bin\Win32 build\build.py
---------------
* Execute tools written in Python without conversion
Unix-like systems:
The edk2/edksetup.sh script will setup everything which is needed to
run the scripts from their source.
Windows:
The tools written in Python can be executed directly from its source directory
as long as the Python interpreter (Python 2.5) has been installed. Before the execution,
please make sure the environment variable PYTHONPATH is set to
<buildtools_project>/BaseTools/Source/Python
There're five tools written in Python. The entrance file of each tool is listed
below.
build <buildtools_project>/BaseTools/Source/Python/build/build.py
GenFds <buildtools_project>/BaseTools/Source/Python/GenFds/GenFds.py
Trim <buildtools_project>/BaseTools/Source/Python/Trim/Trim.py
MigrationMsa2Inf <buildtools_project>/BaseTools/Source/Python/MigrationMsa2Inf/MigrationMsa2Inf.py
UPT <buildtools_project>/BaseTools/Source/Python/UPT/UPT.py

View File

@ -1,79 +0,0 @@
## @file
# This file lists all of the tool files that must be present in the Bin trees.
#
# This file is used by the EDK II Build Server that automatically builds the
# BaseTools Win32 binaries.
# When new tools are create, the tool executable must be listed in the [Bin.Win32]
# section.
# If a tool requires additional files, the developer must list those files in the
# [ExtraFiles.Win32] section.
# The [CxFreeze.Win32] section is maintained by the owner of the Build Server who
# must ensure that files that are required by the cx_freeze frozen binaries are
# present in the Bin\Win32 directory.
#
# Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
#
# This program and the accompanying materials are licensed and made available under
# the terms and conditions of the BSD License which accompanies this distribution.
# The full text of the license may be found at:
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
##
[Bin.Win32]
build.exe
BPDG.exe
Common.PyUtility.pyd
Ecc.exe
EfiCompressor.pyd
EfiRom.exe
Eot.EfiCompressor.pyd
Eot.LzmaCompressor.pyd
GenCrc32.exe
GenDepex.exe
GenFds.exe
GenFfs.exe
GenFv.exe
GenFw.exe
GenPatchPcdTable.exe
GenSec.exe
ImportTool.bat
LzmaCompress.exe
LzmaF86Compress.bat
PatchPcdValue.exe
Rsa2048Sha256GenerateKeys.exe
Rsa2048Sha256Sign.exe
Split.exe
TargetTool.exe
TianoCompress.exe
Trim.exe
UPT.exe
VfrCompile.exe
VolInfo.exe
Pkcs7Sign.exe
DevicePath.exe
[ExtraFiles.Win32]
TestSigningPrivateKey.pem
config.ini
exception.xml
TestCert.pem
TestCert.pub.pem
TestRoot.pem
TestRoot.pub.pem
TestSub.pem
TestSub.pub.pem
[CxFreeze.Win32]
_ctypes.pyd
_hashlib.pyd
_socket.pyd
_sqlite3.pyd
_ssl.pyd
pyexpat.pyd
python27.dll
select.pyd
sqlite3.dll

View File

@ -1,15 +0,0 @@
To use GCC with the BaseTools project for edk2 based development purposes,
you will need to build a GCC based cross-compiler (in addition to binutils).
Instructions for building GCC for this purpose can be found under the
BaseTools source tree. (In addition to the instructions, you will also
find scripts to help automate the build process.)
If you do not have a tianocore.org account, you can make use of the 'guest'
account with an empty password.
In a web browser, you can 'browse' the relevant source at this location:
http://sourceforge.net/p/edk2-buildtools/code/HEAD/tree/trunk/BaseTools/gcc
Or, with subversion, you can download the relevant source with this command:
svn co https://svn.code.sf.net/p/edk2-buildtools/code/trunk/BaseTools/gcc

View File

@ -1,71 +0,0 @@
You may run these scripts to build a UEFI/PI gcc cross compiler.
Cross compilers built with these scripts are tested on
Linux, OS X and Cygwin.
Please note that you may need to modify your edk2 tree's Conf/tools_def.txt
file to point to the location where you installed the cross compiler.
=== tianoCross-gcc-4.1 ===
This script will build an x86 (ia32) cross compiler.
The results of this script are very similar to the 'mingw' cross compiler
which is commonly available on linux and OS X. But, since the cross
compiler produced by this script is tested, it is the only 'supported' way
to build UEFI/PI images.
To use this script, you will need:
* A recent version (3.0 or later should be fine) of gcc that is able to produce
executables for the machine that you want to run this compiler on (the host
machine).
* wget or curl
* tar
* bzip
* gzip
* bash
* As well as (possibly) others tools and development packages
=== x86_64-mingw-gcc-build.py ==
This script will build an x86_64 (x64/Intel 64/amd64) cross compiler.
To use this script, you will need:
* A recent version (3.0 or later should be fine) of gcc that is able to
produce executables for the machine that you want to run this compiler
on (the host machine).
* Python 2.5
* texinfo
* bison
* flex
* libmpfr
* libgmp
* As well as (possibly) others tools and development packages
=== Ubuntu Notes ===
On Ubuntu, the following command should install all the necessary build
packages to utilize the x86_64-mingw-gcc-build.py script:
sudo apt-get install build-essential texinfo bison flex libgmp3-dev libmpfr-dev
=== CYGWIN Notes ===
You should setup cygwin to use binmode on all mounts. When you initially
install cygwin it gives you the choice of Unix file mode (recommended) or DOS
file mode. Unix mode will cause all the cygwin directories to be mounted in
binmode, while DOS will mount the dirs in textmode. Here is an example of a
cygwin install where the dirs are (properly) mounted in binmode.
C:\cygwin\bin on /usr/bin type user (binmode)
C:\cygwin\lib on /usr/lib type user (binmode)
c:\workspace on /workspace type system (binmode)
C:\cygwin on / type user (binmode)
If you use textmode, it is likely that the build will fail in a way that is
hard to debug.
Cygwin is pretty slow, so it is not recommended for large builds.

View File

@ -1,565 +0,0 @@
#!/usr/bin/env python
## @file
#
# Automation of instructions from:
# http://mingw-w64.svn.sourceforge.net/viewvc/mingw-w64/trunk/mingw-w64-doc/
# howto-build/mingw-w64-howto-build.txt?revision=216&view=markup
#
# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
from __future__ import print_function
from optparse import OptionParser
import os
import shutil
import subprocess
import sys
import tarfile
import urllib
import urlparse
try:
from hashlib import md5
except Exception:
from md5 import md5
if sys.version_info < (2, 5):
#
# This script (and edk2 BaseTools) require Python 2.5 or newer
#
print('Python version 2.5 or later is required.')
sys.exit(-1)
#
# Version and Copyright
#
VersionNumber = "0.01"
__version__ = "%prog Version " + VersionNumber
__copyright__ = "Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved."
class Config:
"""class Config
Stores the configuration options for the rest of the script.
Handles the command line options, and allows the code within
the script to easily interact with the 'config' requested by
the user.
"""
def __init__(self):
self.base_dir = os.getcwd()
(self.options, self.args) = self.CheckOptions()
self.__init_dirs__()
def CheckOptions(self):
Parser = \
OptionParser(
description=__copyright__,
version=__version__,
prog="mingw-gcc-build",
usage="%prog [options] [target]"
)
Parser.add_option(
"--arch",
action = "store", type = "string",
default = '',
dest = "arch",
help = "Processor architecture to build gcc for."
)
Parser.add_option(
"--src-dir",
action = "store", type = "string", dest = "src_dir",
default = os.path.join(self.base_dir, 'src'),
help = "Directory to download/extract binutils/gcc sources"
)
Parser.add_option(
"--build-dir",
action = "store", type = "string", dest = "build_dir",
default = os.path.join(self.base_dir, 'build'),
help = "Directory to download/extract binutils/gcc sources"
)
Parser.add_option(
"--prefix",
action = "store", type = "string", dest = "prefix",
default = os.path.join(self.base_dir, 'install'),
help = "Prefix to install binutils/gcc into"
)
Parser.add_option(
"--skip-binutils",
action = "store_true", dest = "skip_binutils",
default = False,
help = "Will skip building binutils"
)
Parser.add_option(
"--skip-gcc",
action = "store_true", dest = "skip_gcc",
default = False,
help = "Will skip building GCC"
)
Parser.add_option(
"--symlinks",
action = "store", type = "string", dest = "symlinks",
default = os.path.join(self.base_dir, 'symlinks'),
help = "Directory to create binutils/gcc symbolic links into."
)
Parser.add_option(
"-v", "--verbose",
action="store_true",
type=None, help="Print verbose messages"
)
(Opt, Args) = Parser.parse_args()
self.arch = Opt.arch.lower()
allowedArchs = ('ia32', 'x64', 'ipf')
if self.arch not in allowedArchs:
Parser.error(
'Please use --arch to specify one of: %s' %
', '.join(allowedArchs)
)
self.target_arch = {'ia32': 'i686', 'x64': 'x86_64', 'ipf': 'ia64'}[self.arch]
self.target_sys = {'ia32': 'pc', 'x64': 'pc', 'ipf': 'pc'}[self.arch]
self.target_bin = {'ia32': 'mingw32', 'x64': 'mingw32', 'ipf': 'elf'}[self.arch]
self.target_combo = '-'.join((self.target_arch, self.target_sys, self.target_bin))
return (Opt, Args)
def __init_dirs__(self):
self.src_dir = os.path.realpath(os.path.expanduser(self.options.src_dir))
self.build_dir = os.path.realpath(os.path.expanduser(self.options.build_dir))
self.prefix = os.path.realpath(os.path.expanduser(self.options.prefix))
self.symlinks = os.path.realpath(os.path.expanduser(self.options.symlinks))
def IsConfigOk(self):
building = []
if not self.options.skip_binutils:
building.append('binutils')
if not self.options.skip_gcc:
building.append('gcc')
if len(building) == 0:
print("Nothing will be built!")
print()
print("Please try using --help and then change the configuration.")
return False
print("Current directory:")
print(" ", self.base_dir)
print("Sources download/extraction:", self.Relative(self.src_dir))
print("Build directory :", self.Relative(self.build_dir))
print("Prefix (install) directory :", self.Relative(self.prefix))
print("Create symlinks directory :", self.Relative(self.symlinks))
print("Building :", ', '.join(building))
print()
answer = raw_input("Is this configuration ok? (default = no): ")
if (answer.lower() not in ('y', 'yes')):
print()
print("Please try using --help and then change the configuration.")
return False
if self.arch.lower() == 'ipf':
print()
print('Please note that the IPF compiler built by this script has')
print('not yet been validated!')
print()
answer = raw_input("Are you sure you want to build it? (default = no): ")
if (answer.lower() not in ('y', 'yes')):
print()
print("Please try using --help and then change the configuration.")
return False
print()
return True
def Relative(self, path):
if path.startswith(self.base_dir):
return '.' + path[len(self.base_dir):]
return path
def MakeDirs(self):
for path in (self.src_dir, self.build_dir, self.prefix, self.symlinks):
if not os.path.exists(path):
os.makedirs(path)
class SourceFiles:
"""class SourceFiles
Handles the downloading of source files used by the script.
"""
def __init__(self, config):
self.config = config
self.source_files = self.source_files[config.arch]
if config.options.skip_binutils:
del self.source_files['binutils']
if config.options.skip_gcc:
del self.source_files['gcc']
del self.source_files['mingw_hdr']
source_files_common = {
'binutils': {
'url': 'http://www.kernel.org/pub/linux/devel/binutils/' + \
'binutils-$version.tar.bz2',
'version': '2.20.51.0.5',
'md5': '6d2de7cdf7a8389e70b124e3d73b4d37',
},
}
source_files_x64 = {
'gcc': {
'url': 'http://ftpmirror.gnu.org/gcc/' + \
'gcc-$version/gcc-$version.tar.bz2',
'version': '4.3.0',
'md5': '197ed8468b38db1d3481c3111691d85b',
},
}
source_files_ia32 = {
'gcc': source_files_x64['gcc'],
}
source_files_ipf = source_files_x64.copy()
source_files_ipf['gcc']['configure-params'] = (
'--with-gnu-as', '--with-gnu-ld', '--with-newlib',
'--verbose', '--disable-libssp', '--disable-nls',
'--enable-languages=c,c++'
)
source_files = {
'ia32': [source_files_common, source_files_ia32],
'x64': [source_files_common, source_files_x64],
'ipf': [source_files_common, source_files_ipf],
}
for arch in source_files:
mergedSourceFiles = {}
for source_files_dict in source_files[arch]:
mergedSourceFiles.update(source_files_dict)
for downloadItem in mergedSourceFiles:
fdata = mergedSourceFiles[downloadItem]
fdata['filename'] = fdata['url'].split('/')[-1]
if 'extract-dir' not in fdata:
for ext in ('.tar.gz', '.tar.bz2', '.zip'):
if fdata['filename'].endswith(ext):
fdata['extract-dir'] = fdata['filename'][:-len(ext)]
break
replaceables = ('extract-dir', 'filename', 'url')
for replaceItem in fdata:
if replaceItem in replaceables: continue
if not isinstance(fdata[replaceItem], str): continue
for replaceable in replaceables:
if not isinstance(fdata[replaceable], str): continue
if replaceable in fdata:
fdata[replaceable] = \
fdata[replaceable].replace(
'$' + replaceItem,
fdata[replaceItem]
)
source_files[arch] = mergedSourceFiles
#print 'source_files:', source_files
def GetAll(self):
def progress(received, blockSize, fileSize):
if fileSize < 0: return
wDots = (100 * received * blockSize) / fileSize / 10
if wDots > self.dots:
for i in range(wDots - self.dots):
print('.', end=' ')
sys.stdout.flush()
self.dots += 1
maxRetries = 1
for (fname, fdata) in self.source_files.items():
for retries in range(maxRetries):
try:
self.dots = 0
local_file = os.path.join(self.config.src_dir, fdata['filename'])
url = fdata['url']
print('Downloading %s:' % fname, url)
if retries > 0:
print('(retry)', end=' ')
sys.stdout.flush()
completed = False
if os.path.exists(local_file):
md5_pass = self.checkHash(fdata)
if md5_pass:
print('[md5 match]', end=' ')
else:
print('[md5 mismatch]', end=' ')
sys.stdout.flush()
completed = md5_pass
if not completed:
urllib.urlretrieve(url, local_file, progress)
#
# BUGBUG: Suggest proxy to user if download fails.
#
# export http_proxy=http://proxyservername.mycompany.com:911
# export ftp_proxy=http://proxyservername.mycompany.com:911
if not completed and os.path.exists(local_file):
md5_pass = self.checkHash(fdata)
if md5_pass:
print('[md5 match]', end=' ')
else:
print('[md5 mismatch]', end=' ')
sys.stdout.flush()
completed = md5_pass
if completed:
print('[done]')
break
else:
print('[failed]')
print(' Tried to retrieve', url)
print(' to', local_file)
print('Possible fixes:')
print('* If you are behind a web-proxy, try setting the', end=' ')
print('http_proxy environment variable')
print('* You can try to download this file separately', end=' ')
print('and rerun this script')
raise Exception()
except KeyboardInterrupt:
print('[KeyboardInterrupt]')
return False
except Exception as e:
print(e)
if not completed: return False
return True
def checkHash(self, fdata):
local_file = os.path.join(self.config.src_dir, fdata['filename'])
expect_md5 = fdata['md5']
data = open(local_file).read()
md5sum = md5()
md5sum.update(data)
return md5sum.hexdigest().lower() == expect_md5.lower()
def GetModules(self):
return self.source_files.keys()
def GetFilenameOf(self, module):
return self.source_files[module]['filename']
def GetMd5Of(self, module):
return self.source_files[module]['md5']
def GetExtractDirOf(self, module):
return self.source_files[module]['extract-dir']
def GetAdditionalParameters(self, module, step):
key = step + '-params'
if key in self.source_files[module]:
return self.source_files[module][key]
else:
return tuple()
class Extracter:
"""class Extracter
Handles the extraction of the source files from their downloaded
archive files.
"""
def __init__(self, source_files, config):
self.source_files = source_files
self.config = config
def Extract(self, module):
src = self.config.src_dir
extractDst = os.path.join(src, self.config.arch)
local_file = os.path.join(src, self.source_files.GetFilenameOf(module))
moduleMd5 = self.source_files.GetMd5Of(module)
extracted = os.path.join(extractDst, os.path.split(local_file)[1] + '.extracted')
if not os.path.exists(extractDst):
os.mkdir(extractDst)
extractedMd5 = None
if os.path.exists(extracted):
extractedMd5 = open(extracted).read()
if extractedMd5 != moduleMd5:
print('Extracting %s:' % self.config.Relative(local_file))
tar = tarfile.open(local_file)
tar.extractall(extractDst)
open(extracted, 'w').write(moduleMd5)
else:
pass
#print 'Previously extracted', self.config.Relative(local_file)
def ExtractAll(self):
for module in self.source_files.GetModules():
self.Extract(module)
class Builder:
"""class Builder
Builds and installs the GCC tool suite.
"""
def __init__(self, source_files, config):
self.source_files = source_files
self.config = config
def Build(self):
if not self.config.options.skip_binutils:
self.BuildModule('binutils')
if not self.config.options.skip_gcc:
self.BuildModule('gcc')
self.MakeSymLinks()
def IsBuildStepComplete(self, step):
return \
os.path.exists(
os.path.join(
self.config.build_dir, self.config.arch, step + '.completed'
)
)
def MarkBuildStepComplete(self, step):
open(
os.path.join(
self.config.build_dir, self.config.arch, step + '.completed'
),
"w"
).close()
def BuildModule(self, module):
base_dir = os.getcwd()
build_dir = os.path.join(self.config.build_dir, self.config.arch, module)
module_dir = self.source_files.GetExtractDirOf(module)
module_dir = os.path.realpath(os.path.join('src', self.config.arch, module_dir))
configure = os.path.join(module_dir, 'configure')
prefix = self.config.prefix
if not os.path.exists(build_dir):
os.makedirs(build_dir)
os.chdir(build_dir)
cmd = (
configure,
'--target=%s' % self.config.target_combo,
'--prefix=' + prefix,
'--with-sysroot=' + prefix,
'--disable-werror',
)
if os.path.exists('/opt/local/include/gmp.h'):
cmd += ('--with-gmp=/opt/local',)
if module == 'gcc': cmd += ('--oldincludedir=/opt/local/include',)
cmd += self.source_files.GetAdditionalParameters(module, 'configure')
self.RunCommand(cmd, module, 'config', skipable=True)
cmd = ('make',)
if module == 'gcc':
cmd += ('all-gcc',)
self.RunCommand(cmd, module, 'build')
cmd = ('make',)
if module == 'gcc':
cmd += ('install-gcc',)
else:
cmd += ('install',)
self.RunCommand(cmd, module, 'install')
os.chdir(base_dir)
print('%s module is now built and installed' % module)
def RunCommand(self, cmd, module, stage, skipable=False):
if skipable:
if self.IsBuildStepComplete('%s.%s' % (module, stage)):
return
popen = lambda cmd: \
subprocess.Popen(
cmd,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT
)
print('%s [%s] ...' % (module, stage), end=' ')
sys.stdout.flush()
p = popen(cmd)
output = p.stdout.read()
p.wait()
if p.returncode != 0:
print('[failed!]')
logFile = os.path.join(self.config.build_dir, 'log.txt')
f = open(logFile, "w")
f.write(output)
f.close()
raise Exception('Failed to %s %s\n' % (stage, module) + \
'See output log at %s' % self.config.Relative(logFile))
else:
print('[done]')
if skipable:
self.MarkBuildStepComplete('%s.%s' % (module, stage))
def MakeSymLinks(self):
links_dir = os.path.join(self.config.symlinks, self.config.arch)
if not os.path.exists(links_dir):
os.makedirs(links_dir)
startPrinted = False
for link in ('ar', 'ld', 'gcc'):
src = os.path.join(
self.config.prefix, 'bin', self.config.target_combo + '-' + link
)
linkdst = os.path.join(links_dir, link)
if not os.path.lexists(linkdst):
if not startPrinted:
print('Making symlinks in %s:' % self.config.Relative(links_dir), end=' ')
startPrinted = True
print(link, end=' ')
os.symlink(src, linkdst)
if startPrinted:
print('[done]')
class App:
"""class App
The main body of the application.
"""
def __init__(self):
config = Config()
if not config.IsConfigOk():
return
config.MakeDirs()
sources = SourceFiles(config)
result = sources.GetAll()
if result:
print('All files have been downloaded & verified')
else:
print('An error occurred while downloading a file')
return
Extracter(sources, config).ExtractAll()
Builder(sources, config).Build()
App()