ruby: refactor package to use more macros

ruby subpackages now are generated by a macro. This reduces the
Makefile size by half and the chance of errors.

No change in packages contents, install-size or dependencies, except
for some removed doc files.

Improved ruby_missingfiles and ruby_find_pkgsdeps script

Signed-off-by: Luiz Angelo Daros de Luca <luizluca@gmail.com>
This commit is contained in:
Luiz Angelo Daros de Luca 2015-12-30 04:32:08 -02:00
parent 9569df4961
commit e8bfef392f
3 changed files with 536 additions and 1209 deletions

File diff suppressed because it is too large Load Diff

View File

@ -6,13 +6,14 @@
# Must run inside a openwrt with all *ruby* packages installed
#
RUBY_SIMPLE_VERSION = RUBY_VERSION.split(".")[0..1].join(".")
failed = false
puts "Looking for installed ruby packages..."
packages=`opkg list-installed '*ruby*' | cut -d' ' -f 1`.split("\n")
puts "Looking for packages files..."
package_files=Hash.new([])
package_files=Hash.new { |h,k| h[k]=[] }
packages.each do
|pkg|
files=`opkg files "#{pkg}" | sed -e 1d`.split("\n")
@ -24,7 +25,7 @@ require_regex_ignore=/^require ([a-zA-Z\$]|["']$|.*\/$)/
require_ignore=%w{drb/invokemethod16 foo rubygems/defaults/operating_system win32console java Win32API
builder/xchar json/pure simplecov win32/sspi rdoc/markdown/literals_1_8 enumerator win32/resolv rbtree
nqxml/streamingparser nqxml/treeparser xmlscan/parser xmlscan/scanner xmltreebuilder xml/parser xmlparser xml/encoding-ja xmlencoding-ja
iconv uconv win32ole gettext/po_parser gettext/mo libxml}
iconv uconv win32ole gettext/po_parser gettext/mo libxml psych.jar jar-dependencies}
builtin_enc=[
Encoding.find("ASCII-8BIT"),
@ -34,7 +35,7 @@ builtin_enc=[
]
puts "Looking for requires in files..."
files_requires=Hash.new([])
files_requires=Hash.new { |h,k| h[k]=[] }
packages.each do
|pkg|
package_files[pkg].each do
@ -93,7 +94,7 @@ packages.each do
next
end
files_requires[file]=files_requires[file] + [require]
files_requires[file] += [require]
when /Encoding::/
encs=line.scan(/Encoding::[[:alnum:]_]+/).collect {|enc| eval(enc) }.select {|enc| enc.kind_of? Encoding }
@ -104,7 +105,7 @@ packages.each do
required_encs = (encs - builtin_enc).collect {|enc| "enc/#{enc.name.downcase.gsub("-","_")}" }
required_encs << "enc/encdb" if need_encdb
files_requires[file] = files_requires[file] + required_encs
files_requires[file] += required_encs
end
end
end
@ -119,10 +120,18 @@ package_files.each do |(pkg,files)| files.each do |file|
end
end; end
puts "Merging requirements into packages..."
package_requires = Hash[packages.collect { |pkg| [pkg, package_files[pkg].collect {|file| files_requires[file] }.inject([],:+).uniq] }]
puts "Grouping package requirements per package"
package_requires_files = Hash.new{|h,k| h[k] = Hash.new { |h2,k2| h2[k2] = [] } }
package_files.each do |(pkg,files)|
package_requires_files[pkg]
files.each do |file|
files_requires[file].each do |requires|
package_requires_files[pkg][requires] << file
end
end
end
weak_dependency=Hash.new([])
weak_dependency=Hash.new { |h,k| h[k]=[] }
weak_dependency.merge!({
"ruby-misc"=>["ruby-openssl","ruby-fiddle"], #securerandom.rb
"ruby-debuglib"=>["ruby-readline"], #debug.rb
@ -136,6 +145,7 @@ weak_dependency.merge!({
"ruby-rdoc"=>["ruby-gems","ruby-readline","ruby-webrick", #/usr/bin/rdoc and others
"ruby-io-console"], #rdoc/stats/normal.rb
"ruby-webrick"=>["ruby-openssl"], #webrick/ssl.rb
"ruby-testunit"=>["ruby-io-console"], #gems/test-unit-3.1.5/lib/test/unit/ui/console/testrunner.rb
})
puts "Preloading gems..."
@ -143,12 +153,12 @@ Gem::Specification.all.each{ |x| gem x.name }
puts "Looking for package dependencies..."
package_provides = {}
package_dependencies = Hash.new([])
package_requires.each do
|(pkg,requires)|
package_dependencies = Hash.new { |h,k| h[k]=[] }
package_requires_files.each do
|(pkg,requires_files)|
requires.each do
|require|
requires_files.each do
|(require,files)|
if package_provides.include?(require)
found = package_provides[require]
else
@ -159,13 +169,13 @@ package_requires.each do
next
end
found = found.first
package_provides[require]=found
package_provides[require] = found
end
if weak_dependency[pkg].include?(found)
puts "#{pkg}: #{found} provides #{require} (ignored WEAK dep)"
puts "#{pkg}: #{found} provides #{require} (weak depedendency ignored)"
else
puts "#{pkg}: #{found} provides #{require}"
package_dependencies[pkg]=package_dependencies[pkg] + [found]
puts "#{pkg}: #{found} provides #{require} for #{files.collect {|file| file.sub("/usr/lib/ruby/","") }.join(",")}"
package_dependencies[pkg] += [found]
end
end
end
@ -174,20 +184,16 @@ if failed
puts "Please, fix the missing files or ignore them on require_ignore var"
exit(1)
end
package_dependencies.each do
|(pkg,deps)|
package_dependencies[pkg]=deps.uniq.sort - [pkg]
end
# Remove self dependency
package_dependencies = Hash[package_dependencies.collect {|(pkg,deps)| [pkg,package_dependencies[pkg]=deps.uniq.sort - [pkg]]}]
package_dependencies.default = []
puts "Expanding dependencies..."
begin
changed=false
package_dependencies.each do
|(pkg,deps)|
next if deps.empty?
deps_new = deps.collect {|dep| [dep] + package_dependencies[dep] }.inject([],:+).uniq.sort
if not deps == deps_new
puts "#{pkg}: #{deps.join(",")}"
@ -198,6 +204,12 @@ begin
end
end if not changed
puts "Removing redundant dependencies..."
package_dependencies.each do
|(pkg,deps)|
package_dependencies[pkg]=deps.uniq - [pkg]
end
puts "Checking for mutual dependencies..."
package_dependencies.each do
|(pkg,deps)|
@ -208,11 +220,6 @@ package_dependencies.each do
end
exit(1) if failed
puts "Removing redundant dependencies..."
package_dependencies.each do
|(pkg,deps)|
package_dependencies[pkg]=deps.uniq - [pkg]
end
package_dependencies2=package_dependencies.dup
package_dependencies.each do
@ -256,15 +263,4 @@ end
puts "All dependencies are OK." if ok
__END__
puts RUBY_VERSION, RUBY_PLATFORM
puts 123
puts Object.contants
#RUBY_VER=2.1
#RUBY_ARCH=i486-linux-gnu
#RUBYLIB=/usr/lib/ruby/$RUBY_VER/
#RUBYLIB_A=/usr/lib/ruby/$RUBY_ARCH/$RUBY_VER/

View File

@ -1,20 +1,28 @@
#!/bin/bash
#
# bash feeds/packages/lang/ruby/ruby_missingfiles staging_dir/target-i386_i486_musl-1.1.11/ bin/x86/packages/packages/*ruby*_2.3.0*
#
function list_staging_files {
cd staging_dir/target-*/; find \
cd "$1"; find \
\( \( -name "root-x86" -or -name "packages" -or -name "stamp" -or -name "pkginfo" \) -prune \) -or -true \
\( -path "*ruby*" -or -name "erb" -or -name "gem" -or -name "irb" -or -name "rake" -or -name "rdoc" -or -name "ri" -or -name "testrb" \) \
-not -path "*/usr/include/*" -not -path "*/usr/lib/pkgconfig/*" -not -path "*/usr/lib/lib*.a" \
-not -path "*/usr/lib/ruby/gems/*/cache/*" \
-print | sort
}
function list_ipkg_files {
for OPKG in bin/*/packages/packages/*ruby*; do
for OPKG; do
tar --to-stdout -xzf "$OPKG" ./data.tar.gz | tar tz | sed -e 's%/$%%'
done | sort -u
}
echo " Staging Packages"
diff -y <(list_staging_files) <(list_ipkg_files)
echo " Staging Packages"
: ${1:?First arg is staging_dir}
: ${2:?Second and following args are ruby ipkg packages}
STAGING_DIR=$1; shift
diff -d -y <(list_staging_files "$STAGING_DIR") <(list_ipkg_files "$@")