rearchitect as a gem

embedding Ruby in C did not go so well
This commit is contained in:
josh committed 2018-02-12 20:13:44 -05:00
1 parent 9188bb42e2
commit 432bd7458e
19 files changed
+136 -559

No files matched your search

+8 -3
View File
@@ -1,3 +1,8 @@
/.lock-waf*
/.waf*
/build/
/.bundle/
/.yardoc
/_yardoc/
/coverage/
/doc/
/pkg/
/spec/reports/
/tmp/
+4
View File
@@ -0,0 +1,4 @@
source 'https://rubygems.org'
# Specify your gem's dependencies in svi.gemspec
gemspec
+20
View File
@@ -0,0 +1,20 @@
PATH
remote: .
specs:
svi (0.1.0)
GEM
remote: https://rubygems.org/
specs:
rake (10.4.2)
PLATFORMS
ruby
DEPENDENCIES
bundler (~> 1.10)
rake (~> 10.0)
svi!
BUNDLED WITH
1.10.6
+21
View File
@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2018 Josh Holtrop
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-19
View File
@@ -1,19 +0,0 @@
.PHONY: build
build:
./waf "$@"
.PHONY: distclean
distclean:
./waf "$@"
.PHONY: clean
clean:
./waf "$@"
.PHONY: install
install:
./waf "$@"
.PHONY: uninstall
uninstall:
./waf "$@"
+41
View File
@@ -0,0 +1,41 @@
# Svi
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/svi`. To experiment with that code, run `bin/console` for an interactive prompt.
TODO: Delete this and the text above, and describe your gem
## Installation
Add this line to your application's Gemfile:
```ruby
gem 'svi'
```
And then execute:
$ bundle
Or install it yourself as:
$ gem install svi
## Usage
TODO: Write usage instructions here
## Development
After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
## Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/svi.
## License
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
+1
View File
@@ -0,0 +1 @@
require "bundler/gem_tasks"
Vendored
-2
View File
@@ -1,2 +0,0 @@
#!/bin/sh
exec ./waf configure "$@"
+6
View File
@@ -0,0 +1,6 @@
require_relative "svi/svn_runner"
require_relative "svi/version"
module Svi
# Your code goes here...
end
File renamed without changes.
+3
View File
@@ -0,0 +1,3 @@
module Svi
VERSION = "0.1.0"
end
-9
View File
@@ -1,9 +0,0 @@
begin
load "#{$SHARE_DIR}/lib/svi.rb"
rescue Interrupt => e
rescue Exception => e
$stderr.puts "#{e.class}: #{e}"
e.backtrace.each do |entry|
$stderr.puts "> #{entry}"
end
end
-12
View File
@@ -1,12 +0,0 @@
$LOAD_PATH.unshift("#{$SHARE_DIR}/lib")
require "yawpa"
require_relative "svi/svn_runner"
module Svi
class << self
def run(args)
end
end
end
Svi.run($ARGS)
-202
View File
@@ -1,202 +0,0 @@
require "yawpa/version"
# Yet Another Way to Parse Arguments is an argument-parsing library for Ruby.
#
# Yawpa does not try to provide a fancy DSL.
# It does not require you to define a class or inherit from a class.
# it just provides a simple functional interface for parsing options,
# supporting subcommands and arbitrary numbers of arguments for each option.
#
# Features:
# - POSIX or non-POSIX mode (supports subcommands using POSIX mode)
# - Options can require an arbitrary number of parameters
# - Options can be defined with a range specifying the allowed number of
# parameters
module Yawpa
# Exception class raised when an unknown option is observed.
class ArgumentParsingException < Exception; end
class << self
# Parse input parameters looking for options according to rules given in
# flags.
# Syntax:
# opts, args = parse(params, options, flags = {})
#
# An ArgumentParsingException will be raised if an unknown option is
# observed or insufficient arguments are present for an option.
#
# Example +options+:
#
# {
# version: nil,
# verbose: {short: 'v'},
# server: {nargs: (1..2)},
# username: {nargs: 1},
# password: {nargs: 1},
# color: :boolean,
# }
#
# The keys of the +options+ Hash can be either strings or symbols.
#
#
# @param params [Array]
# List of program parameters to parse.
# @param options [Hash]
# Hash containing the long option names as keys, and values containing
# special flags for the options as values (examples above).
# Possible values:
# +nil+:: No special flags for this option (equivalent to +{}+)
# +:boolean+::
# The option is a toggleable boolean option (equivalent to
# +{boolean: true}+)
# Hash::
# Possible option flags:
# - +:short+: specify a short option letter to associate with the long
# option
# - +:nargs+: specify an exact number or range of possible numbers of
# arguments to the option
# - +:boolean+: if true, specify that the option is a toggleable
# boolean option and allow a prefix of "no" to turn it off.
# @param flags [Hash]
# Optional flags dictating how {.parse} should do its job.
# @option flags [Boolean] :posix_order
# Stop processing parameters when a non-option argument is seen.
# Set this to +true+ if you want to implement subcommands.
#
# @return [Array]
# Two-element array containing +opts+ and +args+ return values.
# +opts+::
# The returned +opts+ value will be a Hash with the observed
# options as keys and any option arguments as values.
# +args+::
# The returned +args+ will be an Array of the unprocessed
# parameters (if +:posix_order+ was passed in +flags+, this array might
# contain further options that were not processed after observing a
# non-option parameters).
def parse(params, options, flags = {})
options = _massage_options(options)
opts = {}
args = []
i = 0
while i < params.length
param = params[i]
if param =~ /^--([^=]+)(?:=(.+))?$/
param_name, val = $1, $2
bool_val = true
if options[param_name].nil?
if param_name =~ /^no(.*)$/
test_param_name = $1
if options[test_param_name]
param_name = test_param_name
bool_val = false
end
end
end
opt_config = options[param_name]
raise ArgumentParsingException.new("Unknown option '#{param_name}'") unless opt_config
param_key = opt_config[:key]
if opt_config[:boolean]
opts[param_key] = bool_val
elsif opt_config[:nargs].last == 0
opts[param_key] = true
else
opts[param_key] = []
i += _gather(opt_config[:nargs], i + 1, params, val, param_key, opts[param_key])
end
elsif param =~ /^-(.+)$/
short_flags = $1
short_idx = 0
while short_idx < short_flags.length
opt_config = _find_opt_config_by_short_name(options, short_flags[short_idx])
if opt_config.nil?
raise ArgumentParsingException.new("Unknown option '-#{short_flags[short_idx]}'")
end
param_key = opt_config[:key]
if opt_config[:nargs].last == 0
opts[param_key] = true
else
opts[param_key] = []
i += _gather(opt_config[:nargs],
i + 1,
params,
short_flags[short_idx + 1, short_flags.length],
param_key,
opts[param_key])
break
end
short_idx += 1
end
elsif flags[:posix_order]
args = params[i, params.length].map(&:dup)
break
else
args << params[i].dup
end
i += 1
end
# Condense 1-element arrays of option values to just the element itself
opts.each_key do |k|
if opts[k].is_a?(Array) and opts[k].length == 1
opts[k] = opts[k].first
end
end
return [opts, args]
end
private
# Internal helper method to gather arguments for an option
def _gather(nargs, start_idx, params, initial, param_key, result)
n_gathered = 0
if initial and initial != ''
result << initial
n_gathered += 1
end
num_indices_used = 0
index = start_idx
while n_gathered < nargs.last and
index < params.length and
params[index][0] != '-' do
result << params[index].dup
index += 1
num_indices_used += 1
n_gathered += 1
end
if n_gathered < nargs.first
raise ArgumentParsingException.new("Not enough arguments supplied for option '#{param_key}'")
end
num_indices_used
end
# Internal helper method to format the options in a consistent format
def _massage_options(options)
{}.tap do |newopts|
options.each_pair do |k, v|
v = {} if v.nil?
v = {boolean: true} if v == :boolean
newkey = k.to_s
newopts[newkey] = {key: k}
nargs = v[:nargs] || 0
nargs = (nargs..nargs) if nargs.is_a?(Integer)
newopts[newkey][:nargs] = nargs
newopts[newkey][:short] = v[:short] || ''
newopts[newkey][:boolean] = v[:boolean]
end
end
end
# Internal helper method to find an option configuration by short name
def _find_opt_config_by_short_name(options, short_name)
options.each_pair do |k, v|
return v if v[:short] == short_name
end
nil
end
end
end
-4
View File
@@ -1,4 +0,0 @@
module Yawpa
# gem version
VERSION = "1.3.0"
end
-120
View File
@@ -1,120 +0,0 @@
#include <ruby.h>
#include <string>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
VALUE svi_ruby_protect_eval_string_rescue(VALUE exception, VALUE exception_object)
{
*(bool *)exception = true;
fprintf(stderr, "Unhandled exception: %s\n",
rb_obj_classname(exception_object));
return Qnil;
}
VALUE svi_ruby_protect_eval_string(const char * ruby_expression, bool * exception)
{
*exception = false;
return rb_rescue((VALUE(*)(...))rb_eval_string, (VALUE)ruby_expression,
(VALUE(*)(...))svi_ruby_protect_eval_string_rescue, (VALUE)exception);
}
static char * read_file(const char * filename)
{
int fd = ::open(filename, O_RDONLY, 0);
if (fd < 0)
{
return nullptr;
}
off_t size = ::lseek(fd, 0, SEEK_END);
if (size <= 0)
{
return nullptr;
}
::lseek(fd, 0, SEEK_SET);
char * buffer = new char[size];
off_t n_bytes_read = 0u;
for (;;)
{
off_t rd_size = ::read(fd, &buffer[n_bytes_read], size - n_bytes_read);
if (rd_size <= 0)
break;
n_bytes_read += rd_size;
if (n_bytes_read >= size)
break;
}
::close(fd);
if (n_bytes_read == size)
{
return buffer;
}
else
{
delete[] buffer;
return nullptr;
}
}
std::string get_exe_path()
{
pid_t pid = getpid();
char proc_path[25];
sprintf(proc_path, "/proc/%d/exe", pid);
char exe_path[100];
ssize_t n = readlink(proc_path, exe_path, sizeof(exe_path));
if ((n > 0) && (n < (ssize_t)sizeof(exe_path)))
{
return exe_path;
}
return "";
}
static std::string share_dir;
const char * read_bootstrap_file()
{
auto exe_path = get_exe_path();
size_t index = exe_path.rfind('/');
if ((index != std::string::npos) && (index > 0u))
{
index = exe_path.rfind('/', index - 1u);
if (index != std::string::npos)
{
share_dir = std::string(exe_path, 0u, index) + "/share/svi";
char * bootstrap = read_file((share_dir + "/lib/bootstrap.rb").c_str());
if (bootstrap != nullptr)
{
return bootstrap;
}
}
}
share_dir = SHARE_DIR;
return read_file(SHARE_DIR "/lib/bootstrap.rb");
}
int main(int argc, char * argv[])
{
bool exception = false;
const char * ruby_startup = read_bootstrap_file();
if (ruby_startup == nullptr)
{
fprintf(stderr, "Could not read Ruby startup file\n");
return 1;
}
{
RUBY_INIT_STACK;
ruby_init();
rb_gv_set("$SHARE_DIR", rb_str_new(share_dir.c_str(), share_dir.size()));
VALUE argv_ruby_value = rb_ary_new();
rb_gv_set("$ARGS", argv_ruby_value);
for (int i = 0; i < argc; i++)
{
rb_ary_push(argv_ruby_value, rb_str_new_cstr(argv[i]));
}
svi_ruby_protect_eval_string(ruby_startup, &exception);
}
delete[] ruby_startup;
return exception ? 1 : 0;
}
+32
View File
@@ -0,0 +1,32 @@
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'svi/version'
Gem::Specification.new do |spec|
spec.name = "svi"
spec.version = Svi::VERSION
spec.authors = ["Josh Holtrop"]
spec.email = ["jholtrop@gmail.com"]
spec.summary = %q{TODO: Write a short summary, because Rubygems requires one.}
spec.description = %q{TODO: Write a longer description or delete this line.}
spec.homepage = "TODO: Put your gem's website or public repo URL here."
spec.license = "MIT"
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
# delete this section to allow pushing this gem to any host.
if spec.respond_to?(:metadata)
spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
else
raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
end
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
spec.bindir = "exe"
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
spec.require_paths = ["lib"]
spec.add_development_dependency "bundler", "~> 1.10"
spec.add_development_dependency "rake", "~> 10.0"
end
Vendored
-169
View File
@@ -1,169 +0,0 @@
#!/usr/bin/env python
# encoding: ISO8859-1
# Thomas Nagy, 2005-2016
"""
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
"""
import os, sys, inspect
VERSION="1.8.19"
REVISION="886d9b5813e0debe701577920d3d2c10"
GIT="x"
INSTALL=''
C1='#.'
C2='#,'
C3='#*'
cwd = os.getcwd()
join = os.path.join
WAF='waf'
def b(x):
return x
if sys.hexversion>0x300000f:
WAF='waf3'
def b(x):
return x.encode()
def err(m):
print(('\033[91mError: %s\033[0m' % m))
sys.exit(1)
def unpack_wafdir(dir, src):
f = open(src,'rb')
c = 'corrupt archive (%d)'
while 1:
line = f.readline()
if not line: err('run waf-light from a folder containing waflib')
if line == b('#==>\n'):
txt = f.readline()
if not txt: err(c % 1)
if f.readline() != b('#<==\n'): err(c % 2)
break
if not txt: err(c % 3)
txt = txt[1:-1].replace(b(C1), b('\n')).replace(b(C2), b('\r')).replace(b(C3), b('\x00'))
import shutil, tarfile
try: shutil.rmtree(dir)
except OSError: pass
try:
for x in ('Tools', 'extras'):
os.makedirs(join(dir, 'waflib', x))
except OSError:
err("Cannot unpack waf lib into %s\nMove waf in a writable directory" % dir)
os.chdir(dir)
tmp = 't.bz2'
t = open(tmp,'wb')
try: t.write(txt)
finally: t.close()
try:
t = tarfile.open(tmp)
except:
try:
os.system('bunzip2 t.bz2')
t = tarfile.open('t')
tmp = 't'
except:
os.chdir(cwd)
try: shutil.rmtree(dir)
except OSError: pass
err("Waf cannot be unpacked, check that bzip2 support is present")
try:
for x in t: t.extract(x)
finally:
t.close()
for x in ('Tools', 'extras'):
os.chmod(join('waflib',x), 493)
if sys.hexversion<0x300000f:
sys.path = [join(dir, 'waflib')] + sys.path
import fixpy2
fixpy2.fixdir(dir)
os.remove(tmp)
os.chdir(cwd)
try: dir = unicode(dir, 'mbcs')
except: pass
try:
from ctypes import windll
windll.kernel32.SetFileAttributesW(dir, 2)
except:
pass
def test(dir):
try:
os.stat(join(dir, 'waflib'))
return os.path.abspath(dir)
except OSError:
pass
def find_lib():
src = os.path.abspath(inspect.getfile(inspect.getmodule(err)))
base, name = os.path.split(src)
#devs use $WAFDIR
w=test(os.environ.get('WAFDIR', ''))
if w: return w
#waf-light
if name.endswith('waf-light'):
w = test(base)
if w: return w
err('waf-light requires waflib -> export WAFDIR=/folder')
dirname = '%s-%s-%s' % (WAF, VERSION, REVISION)
for i in (INSTALL,'/usr','/usr/local','/opt'):
w = test(i + '/lib/' + dirname)
if w: return w
#waf-local
dir = join(base, (sys.platform != 'win32' and '.' or '') + dirname)
w = test(dir)
if w: return w
#unpack
unpack_wafdir(dir, src)
return dir
wafdir = find_lib()
sys.path.insert(0, wafdir)
if __name__ == '__main__':
from waflib import Scripting
Scripting.waf_entry_point(cwd, VERSION, wafdir)
#==>
#BZh91AY&SY"hœÕP÷ÿÿ°#*Óÿÿÿÿÿÿÿÿÿÿÿ„ Y� Âc%H4�#*`(b|÷yn�#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*¯1L õ¦Ü¹©öÒí°Õ6ÐííÝÍÝ÷ŒµÜ[Ý×_G»Ý’í¥IÝÙÞ»¤yÝÛîÑÚ—·Q°E>^ú}É©g]S©‡IbH>’{µì=´çwkBv×¶ëZ½çnw½OZéŠï£ï¾nc­îîëß}óF·N}Vï7`vÛ�ß{ß'púÖ.ñ½§mmÞû7îæ»½p§Þùï#*#*#*P#*æÍ#*Àô[ ùÑC€+ܘ¹€UÖu lÚMc»\o»f€[(P«{ÞÝ:=í-€UeSm)­Š`m…ì5PQ"ª#.%Ov⧬PT�’H#*•%wsŠ«ÞáÍ^ÌwÙª®�l={ÒÜž¹é¨LNÁŽÊéÔ�Þö}ö´ñÍZO¥2ï�»‡ÙÝ�žíö7ß[]vo±‰vùÝÝÛÎwݾnï�ݾͲöÜÛ�}Ÿ]÷Ø7wmîËÕ÷Ï}Ìqô#*Û[`UÐ5l§²E#,h#,(³;w¹ïnïQ½‡^�ƒ­ïr¢Ém*7žñ]áèŠ%TFš¯cE=QO@ï{vš)mpÛ¬9uÛ›=ঌ<²]Ï·3ã¸=uØeÎàµn�>=Ά›yÝÙZݤj»>ÑÚW½#*y»¹ ïù^ît½ç{§__5Ó_}ƒŸ}œú(iW¶wßxyöu÷žîõuÎÛJžîï»îË Ë»Îïo;Mvîï½{]ïv¶Þï\½^í×ÛÜÔ{gwN,éön÷t®#,Ýêî7œ�·ÛqKZ}޼°õ³æ4iôrx›í&Ûs를YÛÝéã╲Û[o™¸Ûã=Ö$wÛ¯¹¹}w·»Ûw‰�ôïjÒºõÌ[Ýôkï8}ÎÞÏϽï7{O$öù:Àëß|îùßAöùóÞ.³�àèÐ4Ê=±R�@Ù©N›€Je'Þéâ¡ë¯xÜözÈ,ÆKwY­ê÷uáì»\tç^íÏf¢;«Ù*#,zô»îëÑï€#*g»Ž¤#*Aïxå»w“Ëëï{i«µôûºÛ½ï¯N/£ï{ôG¹÷²öë¤'q®º<©ë�³ÝÎòöÛní9#,×b!Þ÷�[ÜÛ6Î/|ùÁöÞöø½mÕ¯}áÒõ&÷õw‡ÓÝ—Ùs^‡Ý©5ôsÛxžûϽ×u—…·wÏn½Ç‹9XöíÜ>7¶Þîâùö}õ¾w·i7Û{|íæ1€6´P}ÜnÏZzx>íëØï…Ëu ×Û Ñx¾Z]ê¶Û;÷´û¹Þ–û­#*`(•Hª—×{£W¯ußnŽ½ÎžñÒ½ëi½Öl}²Þ¯¾øwJ¾øîvêÛÝç{�Æùè/»å¹öãèí´¬”#,#*zÝeìh{op®µ®õ�н5‹œQ£ Ó½æ÷‡Ý†�&€AyŽöîk¡×¼èŽMg�å}ò'·¸¾ì€™AZ÷žzûï¸ïº€C¯mËr®ÎØÏOkŽjªÎßtöÙ9Ý·QvÈ#.I#wgkwtO­.¦ó9©feôî“6}wÓ'ª+Öšnwzêëã‡}ò�Ý`í½:n˜’iÑÓ½·smãŽÑ�n{Ý|½ÜÚÛv�ä©>÷¹7ÛjÒ�·]•æ×†§.íŽGßnš@€2#*™4#*� &ši‘ 4##Bž‘?JÒd4�d¤oE¦�A4#*‰„Ñ©Oa#,Éâ£Ó(¡ê #*#*#*#* ‘@šÄÐMÂ&)<F”óOUÒ&ž#Qµ#*H#*#*Ð#*#*ž©E$Ѩ#*#@ôzSõ&M=!êi¦€ÐÑ Ð#* jhh#*#*Ð#*#*I  #*Ð ¡1OCM=SO ž£FPÐz�P#*#*#*#*j"#*! �#*L‰èÔi=OBŸªy'¦„§¨ž§  €ÐÈ#*>¿à¶Ú¿þæ&?¨mk›[˜×\—ííµ; 2„Ãç¶Õ× ‘!#ÁYˆ³ @òB( î?òýz$Ö¢Hýn§õÊNöa+—¹ºœJ™x‘\繪I£yw…Óš3?¾t>Cÿa)ôˆµù¡ 8I `î’Aáá‘—¼Ï á.¬ð|pøÍ¥V®ñ‡*à‰·¬bq1TA37n÷ŒW¾Zá'ã¾¾£yG#.D "‘…C©jÒµZ*Ú1µmª@nª@ªHªÁ@y&d#*¼ @U²¡[#*a÷®›kËjÚV´·tj�b­VÛ_‚ÖÕj™�B$‰c3L@LˆhÆm2¢$¦¤KJQ¥ÛIPŠ™$±@°š6¦¢©(0ˆ”&h›([)Œ•™AF’XКaJ#.�$RlE¢”Ú"’”´¦E¨€@K-$$Á0e$RØ¢Ú-&¨ƒ)eE,MJ2PRJ)¥0³5�EiVÒ«R’mDÉ™2hت µ+XÍ0Í™¦mIc4Û`–›b$jZšdÔÂȦI5@ÈÔ�+I¬„TšM™%#.$´�Z)Mc$3dÑ0BÁFfšc4ØÄÁ*i`�‚1 fb “"QPÙ6¤�"– !“C$Fd!# ,Í,Rdƒi0ÆJi-¤¨´LjTІ,“#,i¤ ØQ$¢M‘J&1bb Ù2›E$ËHe$M,�)’¥S2,m�¨dQ,(‹$„‘#.lE¤°6j2AQ#.D”Tj"#.‰)#.fÄI©,Rb� )É2fŒÂ2[2¦A°•!BT›!$šJÁ‰),Yf`Ù´FšF�„”BÊHIš#,"S5K6YJ(1–a“K$ÔÓ(ÐK–dlhÊÈLÄ’(´-,�*$°†ÊƒM™A�FÍ#c ¦–$¦¶š#, Bf‘E˜ˆÔ™)4�¦’–Z4YR¢¢‰…LI‘%()ŒhFHi˜ DC*f[HŠÂ•HC)R6L…)#.m%¤¢Ù#XÒL’J‹%5‘l&�™ ™¢##,’M•&™MDb1–T33Jb¡S&ˆ©¢1f¦Å&QddÄ”ŠT’BÊ*dX”Ó#h1I“e$Ì6M“FL…CHÀ„j(I–R²“#, ²l”�&B&K&Q�Šfƒ$e2‘–&a-%*›4Tm„Ê ‘)"#,¨Å±¤™¬ŠLla$0Œ¨Ò(TJ(Ö*Y0£XË52DÍL3,ˆ”!ŠY#*j4””e¤6kjm¶ÐQl`’¦�i(1”‘¢Å2S$Æ“FÙ-)f�1I˜Êf–T›)bÔÈÆÂÙ%6Q”ŒÐ!¦Ë_Ãmv4…•¤¤%J2SX«EbÑQ²IšTDÓ%KAQ°Š’V¦"†Æ–!™e) RF³*Ô&Ú,Šk&Cc)–•E¡bd¦5-*c$�&,32•Y£e”#k*ER©X¦Ê$²£)µdÔˆÖɦVD©5 [%YYJSL+f(i‘5£KMD–’�%ƱXÕ3h¶ÛH3`±ªÂF¤Ñ¶ÆÑ±²Qª3LÄ5E!¨4jÅQ°ÍHmbY0¢5³Rhe1%‚h±„5(”Ú–Äm$šÆ5!b´’šµ³VÓA,#ei6F&³l‰3)©¥#.I–Õ6¢–’”Ô²¤¶š¦ÒZ¦˜“²¦Rɶ–m¦ÌZ4f¶k32I¬±¡›¤ÛKYRSJ(ˆ C5J4‰ŒQ°�b„- 3–ѵ$JME2š£iI¥�FLš#,%0ŠE,¨�ŠAieH€i¢˜)’�e6hbÄ„¤TZ,É b•š’ÀclË3K1š`©¨™Ñ2FLlBÌK!I´lI¤£&h4‹2‹S2TÅ4Rma3`Ñ#.TXÌ1S6 RÉBlE†54Ú3 3h¨±±±F„hÆÉ©¡"“aK-�“$¤¦L¦Á’Ø…3R‰2I²ÒˆJ¨²Ô™¢6”ÒlÆÒei+Ä#”dfM”“BTš“)FÌÓj[,Ø´”³I²lbTQfŠJfdÑ©–´Œ”¥¢ÁH‘›$FY‘1¢Òš#@ÖY6Jhbb&“I F¢5BTm�mˆ­1¤ÃI2ÄÊ &‘h¦•É K#.¥e$š� *5“0²ie24´›mIkhЙfÚ‚H´–ÅA£ ,#,›R”J�QliIš¨Ù&k2*H’£I"Ë*ÔÆ†MEc&&VJˆ¦”¡Q¥%4ET±*Je)FÛ`µ$Qd£dª0Ê6Kd¤Ô›j”ÑIEJj�µ&ÅCI3d†RTXiH‹- ””ÆhÁ´˜#.‰3BÁª”FÈÊV&#JKEhƲEd„6%`Š1”¶#h¬¤”T€h1E& “V”ZST¦Òj-±¬VÍ1Y-f�¢©š’‹Å(#(1³B$¡4l”Á£VÄm�‹hØÒšÖHe¢#.Æ&¢Ñ�­6Ë6£h´TZÆI5©fÍ�ÒÊĪ1h³,UMIHÛ(Ë)DÒFÊÅ`’Æ’Ù-�d¢Ô–±I´¦eM¢Â‘QIF‹kT­´ŒeCI¢$©”Z66† ÒZ[$ÛIŒÉl‚›%Eµ$¶ŠÑ­‹FÛhÚ¡K&ÖÄZ¦¥e´J2ŠbFÒL`©lMšlT‘²È¨ ™�‰1$™I2$¡jM±fV¦?¥óþšþ’ÿI¯ä7ÏÎÞûÅíͦD˜º›a?îØÀ¥þL¶‹l‚››+»Ieî÷Ëúkø½zþ�ôzú´/¨ÝNDÿíNƒTlÿsäAQ‡œ 3·I¼‡H¼«M.Y#,É`¥q#LèÄW\ª’�ô;=q‡¼³üwhÁæY“þ×øyòÇú7V2ñÆ]QTÈ¥�ÕÜ…£á; 'tݹÃéÁ¾,>?—KßV£#.g…ÔÂ~ò‹o-5ƒ±Z8bå¥åâð£L|HÞâ#�Õ´t„º¢°YWVÚ¶…ˆ°yÔ)ÁQÅTUva¥¥di2Ó†®Y×[#¿+Êní·eâøW…òë…_%|=?Ÿ×²½Uð.nZ65³A5_e×’yʉ-wË«¼»�Ö‰ü�S/†æ’Å‚(,jìµc–£[ܰðÑþK�„ L!ÆÂ¤#,j½©6eŒU=Ôe±‚ȱ~?é¹aßÝZ3#*©Ñ#.7ªAOS(C (`)<s¡Xÿ;’˜ÒµT’Ø–Q Gåœgþ‘ɨðM,"60I§´ÓÕ©–:–ùCP›#,�]{A‹ÿL>L>X�nëv#.D`Äcy¹j(0ª) »�ÍÌšB“VH5)ð��¶#*°Ÿ* é^WIæ�¢3v’™IöÔ –%(16ãd‡ÎÈ—:tò$À"¶RÇ5$¡ès(´„:†%Š¿ÁU|§ªù6ÝJ¯†á v(Ã"ƒáôÞÞ–FDR�OH«G,ŠiR°›�€ÜFF1ºë±:ë¦*#,õ-o/;ý»ì»È�¢Vhh”#v‰[)[ˆ‘A_®ª#=tV¿ž´ÇZì½0L°¶ŠM’Š'}Li6ÂJ°¹@`@hQÆ?ÊW1�ïåÉ#,.¢0í¥ýf°Àª´�ÆN9ªù#,tüâçïò陸ŠÕgxVzêæ$Ï5 u¨âyÌïÿ\‹ØÎÔah�^Ðy*ZíŒ9ÐÙ¡:.Z¡ÝÜûRÒ;Éê¹Úî—´0 ÷°9!àášjУij?+9j&gJå4“ÑÂÑ�íJ[›¥ó¸IàÌ$[IàXRÁ`—§[ÇÜü±FÈÛZ,Ù* ±)AKh[òeÔ˜ø›·õkX&ÃRÒ7hïú$KÙ!¦ÚÆM÷]¦É(È߃®×Þ»£f|†q²‰—[+›‘/W(Eÿ‰¥ð*‘æ×H¯LŽVÚiþ]!F1d"}äom’êmcF¼s2ɼk—-�Wî<¦£O¼àÑ·­ßƒ«õ3ýu}ßäö¾—ÅÚ1ËsF«º¸±¢ÈIˆÃ-'½×+Ï;jJèÐÈ«:r£ „‹Å#.ÈK…¼UÓV7«Éù}è¥/›•#.g)q‘T´)c>Ñ…ÑK³E%²a|»WF÷¾¯<‡š,kM_IþÃx¾Jäm~7P�yÝ£ˆz^#,C@ÿÒ8¬D`Æ—ø�:£ù¨œòT0ˆÄWJÚÍ�ò@00b"m}]ûO+›u7Î]HÑ\âXÓ�P¤ÝÜd-7ª ­¸,´­jÔ’Ö,p•Œ¦B„º‰4֔ݟ$×R…E`xÕÒ¢&½÷|Ä#.ÇÏnx2O­ë“ Nþë´ˆ,“%R0žVQɆ¨ZdiG•R[´NŽ •w<@Ñ-#,2ÒUX¢ŒÔ¥TîhÊï‚ØŠœ+ÒèVsî¨z3#*£É{à–xÕ6�®¸4 P쎘=¶RþhËUc=®³äEZžºcL°x‚?±Ï„ôPƒʹ>¨hs1óÅV|êX š¡/'.H°#Åé#~DòÚ˜†‘�¦ÃˆEaå/Âiÿ��X¤Ç×/ä™» À§oÙ4 ÿWÍøMtèN˜H5§‹Ó¤xWí8Line truncated
#<==
-19
View File
@@ -1,19 +0,0 @@
import re
def options(opt):
opt.load("compiler_cxx")
def configure(conf):
conf.load("compiler_cxx")
conf.define("SHARE_DIR", re.sub(r'/$', "", conf.options.prefix) + "/share/svi")
conf.check_cfg(package = "ruby", args = "--cflags --libs", uselib_store = "ruby")
def build(bld):
bld(features = "cxx cxxprogram",
target = "svi",
source = bld.path.ant_glob("src/**/*.cc"),
cxxflags = ["-Wall", "-std=gnu++14"],
uselib = ["ruby"])
share_dir = bld.path.find_dir("share/svi")
bld.install_files("${PREFIX}/share/svi", share_dir.ant_glob("**/*"),
cwd = share_dir, relative_trick = True)