First cut at the Wrap dependency downloader.

pull/34/head
Jussi Pakkanen 10 years ago
parent be9bf62cd7
commit f23e6c72f4
  1. 8
      interpreter.py
  2. 12
      manual tests/1 basic/main.c
  3. 11
      manual tests/1 basic/meson.build
  4. 10
      manual tests/1 basic/subprojects/sqlite.wrap
  5. 92
      wrap.py

@ -19,6 +19,7 @@ import dependencies
import mlog import mlog
import build import build
import optinterpreter import optinterpreter
import wrap
import os, sys, platform, subprocess, shutil, uuid import os, sys, platform, subprocess, shutil, uuid
class InterpreterException(coredata.MesonException): class InterpreterException(coredata.MesonException):
@ -915,7 +916,12 @@ class Interpreter():
subdir = os.path.join('subprojects', dirname) subdir = os.path.join('subprojects', dirname)
abs_subdir = os.path.join(self.build.environment.get_source_dir(), subdir) abs_subdir = os.path.join(self.build.environment.get_source_dir(), subdir)
if not os.path.isdir(abs_subdir): if not os.path.isdir(abs_subdir):
raise InterpreterException('Subproject directory does not exist.') r = wrap.Resolver(os.path.join(self.build.environment.get_source_dir(), 'subprojects'))
resolved = r.resolve(dirname)
if resolved is None:
raise InterpreterException('Subproject directory does not exist and can not be downloaded.')
subdir = os.path.join('subprojects', resolved)
abs_subdir = os.path.join(self.build.environment.get_source_dir(), 'subprojects', subdir)
self.global_args_frozen = True self.global_args_frozen = True
mlog.log('\nExecuting subproject ', mlog.bold(dirname), '.\n', sep='') mlog.log('\nExecuting subproject ', mlog.bold(dirname), '.\n', sep='')
subi = Interpreter(self.build, dirname, subdir) subi = Interpreter(self.build, dirname, subdir)

@ -0,0 +1,12 @@
#include<sqlite3.h>
#include<stdio.h>
int main(int argc, char **argv) {
sqlite3 *db;
if(sqlite3_open(":memory:", &db) != SQLITE_OK) {
printf("Sqlite failed.\n");
return 1;
}
sqlite3_close(db);
return 0;
}

@ -0,0 +1,11 @@
project('downloader', 'c')
s = subproject('sqlite')
e = executable('dtest', 'main.c',
include_directories : s.get_variable('sqinc'),
link_args : ['-pthread', '-ldl'],
c_args : '-pthread',
link_with : s.get_variable('sqlib'))
test('dltest', e)

@ -0,0 +1,10 @@
[mesonwrap]
directory = sqlite-amalgamation-3080802
source_url = http://sqlite.com/2015/sqlite-amalgamation-3080802.zip
source_filename = sqlite-amalgamation-3080802.zip
source_hash = 5ebeea0dfb75d090ea0e7ff84799b2a7a1550db3fe61eb5f6f61c2e971e57663
patch_url = https://dl.dropboxusercontent.com/u/37517477/sqlite-meson.tar.gz
patch_filename = sqlite-meson.tar.gz
patch_hash = 8c9d00702d5fe4a6bf25a36b821a332f6b2dfd117c66fe818b88b23d604635e9

@ -0,0 +1,92 @@
# Copyright 2015 The Meson development team
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import mlog
import glob, urllib.request, os, hashlib, shutil
class PackageDefinition:
def __init__(self, fname):
self.values = {}
ifile = open(fname)
first = ifile.readline().strip()
if first != '[mesonwrap]':
raise RuntimeError('Invalid format of package file')
for line in ifile:
line = line.strip()
if line == '':
continue
(k, v) = line.split('=', 1)
k = k.strip()
v = v.strip()
self.values[k] = v
def get(self, key):
return self.values[key]
def has_patch(self):
return 'patch_url' in self.values
class Resolver:
def __init__(self, subdir_root):
self.subdir_root = subdir_root
self.cachedir = os.path.join(self.subdir_root, 'packagecache')
def resolve(self, packagename):
fname = os.path.join(self.subdir_root, packagename + '.wrap')
if not os.path.isfile(fname):
return None
p = PackageDefinition(fname)
self.download(p, packagename)
self.extract_package(p)
return p.get('directory')
def get_data(self, url):
u = urllib.request.urlopen(url)
data = u.read()
u.close()
h = hashlib.sha256()
h.update(data)
hashvalue = h.hexdigest()
return (data, hashvalue)
def download(self, p, packagename):
ofname = os.path.join(self.cachedir, p.get('source_filename'))
if os.path.exists(ofname):
print('Using', packagename, 'from cache.')
return
srcurl = p.get('source_url')
print('Dowloading', packagename, 'from', srcurl)
(srcdata, dhash) = self.get_data(srcurl)
expected = p.get('source_hash')
if dhash != expected:
raise RuntimeError('Incorrect hash for source %s:\n %s expected\n %s actual.' % (packagename, expected, dhash))
if p.has_patch():
purl = p.get('patch_url')
print('Downloading patch from', purl)
(pdata, phash) = self.get_data(purl)
expected = p.get('patch_hash')
if phash != expected:
raise RuntimeError('Incorrect hash for patch %s:\n %s expected\n %s actual.' % (packagename, expected, phash))
open(os.path.join(self.cachedir, p.get('patch_filename')), 'wb').write(pdata)
else:
print('Package does not require patch.')
open(ofname, 'wb').write(srcdata)
def extract_package(self, package):
if os.path.isdir(os.path.join(self.subdir_root, package.get('directory'))):
return
print(os.path.join(self.cachedir, package.get('source_filename')))
shutil.unpack_archive(os.path.join(self.cachedir, package.get('source_filename')), self.subdir_root)
if package.has_patch():
shutil.unpack_archive(os.path.join(self.cachedir, package.get('patch_filename')), self.subdir_root)
Loading…
Cancel
Save