All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] Yocto 1656: rebase on autospectacle.pl
@ 2012-04-26  8:10 Kang Kai
  2012-04-26  8:10 ` [PATCH 1/2] autospectacle.pl: pull it from meego as a base Kang Kai
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Kang Kai @ 2012-04-26  8:10 UTC (permalink / raw)
  To: sgw, poky

Hi Saul,

I sent these patches to poky mail list on March 13, and didn't see the
comments. If I miss your comment, would you like to comment them again?

Thanks a lot.

I rebase Yocto 1656: Recipe creation/import script on autospectacle.pl and
add feature to create recipe file.

The following changes since commit 492a58cabdc053b2312712681dbcffa8270d4ea4:

  self-hosted-image: Update poky revision to point at the 1.2 release branch (2012-04-24 10:21:11 +0100)

are available in the git repository at:
  git://git.pokylinux.org/poky-contrib kangkai/autospectacle
  http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=kangkai/autospectacle

Kang Kai (2):
  autospectacle.pl: pull it from meego as a base
  autospectacle.pl: create recipe file

 scripts/autospectacle.pl | 1926 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1926 insertions(+), 0 deletions(-)
 create mode 100755 scripts/autospectacle.pl

-- 
1.7.5.4



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] autospectacle.pl: pull it from meego as a base
  2012-04-26  8:10 [PATCH 0/2] Yocto 1656: rebase on autospectacle.pl Kang Kai
@ 2012-04-26  8:10 ` Kang Kai
  2012-04-26  8:10 ` [PATCH 2/2] autospectacle.pl: create recipe file Kang Kai
  2012-04-26 15:47 ` [PATCH 0/2] Yocto 1656: rebase on autospectacle.pl Saul Wold
  2 siblings, 0 replies; 5+ messages in thread
From: Kang Kai @ 2012-04-26  8:10 UTC (permalink / raw)
  To: sgw, poky

This autospectacle.pl is from meego project
http://meego.gitorious.org/meego-developer-tools/autospectacle

And take its latest
commit f462b759c6f569f35283d0885c97ae53b010bb03
as base of Yocto 1656: Recipe creation/import script.

Signed-off-by: Kang Kai <kai.kang@windriver.com>
---
 scripts/autospectacle.pl | 1837 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1837 insertions(+), 0 deletions(-)
 create mode 100755 scripts/autospectacle.pl

diff --git a/scripts/autospectacle.pl b/scripts/autospectacle.pl
new file mode 100755
index 0000000..bb9f8dc
--- /dev/null
+++ b/scripts/autospectacle.pl
@@ -0,0 +1,1837 @@
+#!/usr/bin/perl -w
+
+#      Copyright (C) 2010 Intel Corporation
+#
+#   
+#   This program is free software: you can redistribute it and/or modify
+#   it under the terms of the GNU General Public License as published by
+#   the Free Software Foundation, either version 3 of the License.
+#   
+#   This program is distributed in the hope that it will be useful,
+#   but WITHOUT ANY WARRANTY; without even the implied warranty of
+#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#   GNU General Public License for more details.
+#   
+#   You should have received a copy of the GNU General Public License
+#   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+#   As a special exception, you may create a larger work that contains
+#   part or all of the autospectacle output and distribute that work
+#   under terms of your choice.
+#   Alternatively, if you modify or redistribute autospectacle itself, 
+#   you may (at your option) remove this special exception.
+#   
+#   This special exception was modeled after the bison exception 
+#   (as done by the Free Software Foundation in version 2.2 of Bison)
+#
+
+
+use File::Temp qw(tempdir);
+use File::Path qw(mkpath rmtree); 
+use File::Spec (); 
+
+
+my $name = "";
+my $version = "TO BE FILLED IN";
+my $description = "";
+my $summary = "";
+my $url = "";
+my $configure = "";
+my $localename = "";
+my @sources;
+my @mainfiles;
+my @patches;
+
+my $printed_subpackages = 0;
+my $fulldir = "";
+
+my $builder = "";
+
+
+my $oscmode = 0;
+
+my @banned_pkgconfig;
+my %failed_commands;
+my %failed_libs;
+my %failed_headers;
+
+
+
+######################################################################
+#
+# License management
+#
+# We store the sha1sum of common COPYING files in an associative array
+# %licenses. 
+#
+# For all matching sha1's in the tarbal, we then push the result
+# in the @license array (which we'll dedupe at the time of printing).
+# 
+
+my %licenses;
+my @license;
+
+sub setup_licenses
+{
+	$licenses{"06877624ea5c77efe3b7e39b0f909eda6e25a4ec"} = "GPLv2";
+	$licenses{"075d599585584bb0e4b526f5c40cb6b17e0da35a"} = "GPLv2";
+	$licenses{"10782dd732f42f49918c839e8a5e2894c508b079"} = "GPLv2";
+	$licenses{"2d29c273fda30310211bbf6a24127d589be09b6c"} = "GPLv2";
+	$licenses{"4df5d4b947cf4e63e675729dd3f168ba844483c7"} = "LGPLv2.1";
+	$licenses{"503df7650052cf38efde55e85f0fe363e59b9739"} = "GPLv2";
+	$licenses{"5405311284eab5ab51113f87c9bfac435c695bb9"} = "GPLv2";
+	$licenses{"5fb362ef1680e635fe5fb212b55eef4db9ead48f"} = "LGPLv2";
+	$licenses{"68c94ffc34f8ad2d7bfae3f5a6b996409211c1b1"} = "GPLv2";
+	$licenses{"66c77efd1cf9c70d4f982ea59487b2eeb6338e26"} = "LGPLv2.1";
+	$licenses{"74a8a6531a42e124df07ab5599aad63870fa0bd4"} = "GPLv2";
+	$licenses{"8088b44375ef05202c0fca4e9e82d47591563609"} = "LGPLv2.1";
+	$licenses{"8624bcdae55baeef00cd11d5dfcfa60f68710a02"} = "GPLv3";
+	$licenses{"8e57ffebd0ed4417edc22e3f404ea3664d7fed27"} = "MIT";
+	$licenses{"99b5245b4714b9b89e7584bfc88da64e2d315b81"} = "BSD";
+	$licenses{"aba8d76d0af67d57da3c3c321caa59f3d242386b"} = "MPLv1.1";
+	$licenses{"bf50bac24e7ec325dbb09c6b6c4dcc88a7d79e8f"} = "LGPLv2";
+	$licenses{"caeb68c46fa36651acf592771d09de7937926bb3"} = "LGPLv2.1";
+	$licenses{"dfac199a7539a404407098a2541b9482279f690d"} = "GPLv2";
+	$licenses{"e60c2e780886f95df9c9ee36992b8edabec00bcc"} = "LGPLv2.1";
+	$licenses{"c931aad3017d975b7f20666cde0953234a9efde3"} = "GPLv2";
+}
+
+sub guess_license_from_file {
+	my ($copying) = @_;
+
+	if (!-e $copying)  {
+		return;
+	}
+
+	my $sha1output = `sha1sum $copying`;
+	$sha1output =~ /^([a-zA-Z0-9]*) /;
+	my $sha1 = $1;
+
+	chomp($sha1);
+
+	#
+	# if sha1 matches.. push there result
+	#
+	if (defined($licenses{$sha1})) {
+		my $lic = $licenses{$sha1};
+		push(@license, $lic);
+	}
+	
+	#
+	# We also must make sure that the COPYING/etc files
+	# end up in the main package as %doc..
+	#
+	$copying =~ s/$fulldir//g;
+	$copying =~ s/^\///g;
+	$copying = "\"\%doc " . $copying ."\"";
+	
+	push(@mainfiles, $copying);
+}
+
+sub print_license
+{
+	my $count = @license;
+	if ($count == 0) {
+		print OUTFILE "License: TO BE FILLED IN\n";
+		return;
+	}
+
+	# remove dupes
+	undef %saw;
+	@saw{@license} = ();
+    	@out = sort keys %saw;
+
+	print OUTFILE "License    : ";
+	foreach (@out) {
+		print OUTFILE "$_ ";
+	}
+	print OUTFILE "\n";
+}
+
+# end of license section
+#
+#######################################################################
+
+######################################################################
+#
+# Package group management
+#
+# We set up an associative array of regexp patterns, where the content
+# of the array is the name of the group.
+#
+# These are "strings of regexps", which means one needs to escape
+# everything, and if you want the actual regexp to have a \,
+# it needs to be a \\ in this string.
+
+my %group_patterns;
+my @groups;
+my $group   = "TO_BE/FILLED_IN";
+
+sub setup_group_rules
+{
+	$group_patterns{"^\\/usr\\/lib\\/.*so"} = "System/Libraries";
+	$group_patterns{"^\\/lib\\/.*so"} = "System/Libraries";
+	$group_patterns{"^\\/bin\\/.*"} = "Applications/System";
+	$group_patterns{"^\\/sbin\\/.*"} = "Applications/System";
+	$group_patterns{"^\\/usr\\/sbin\\/.*"} = "Applications/System";
+}
+
+sub guess_group_from_file
+{
+	my ($filename) = @_;	
+	while (($key,$value) = each %group_patterns) {
+		if ($filename =~ /$key/) {
+			push(@groups, $value);
+		}
+	}
+				
+}
+
+# end of group section
+#
+######################################################################
+
+
+######################################################################
+#
+# Files and package section
+#
+# This section creates the %files section, but also decides which
+# subpackages (devel and/or doc) we need to have.
+#
+# We start out with the @allfiles array, which will contain all the
+# files installed by the %build phase of the package. The task is
+# to sort these into @mainfiles, @develfiles and @docfiles.
+# In addition, an attempt is made to compress the files list by
+# replacing full filenames with "*" patterns.
+#
+# For this we use a set of regexps from the @files_match array,
+# which are then used as index to three associative arrays:
+# %files_target : numerical index for which package the regexp
+#                 would place the file at hand.
+#                  0 - main package
+#                  1 - devel package
+#                  2 - doc package
+#                 99 - don't package this at all
+#
+# %files_from: regexp to match the file against for filename-wildcarding
+# %files_to  : pattern to append to the ()'d part of %files_from to end up
+#              with the filename-wildcard.
+ 
+my @allfiles;
+my @develfiles;
+my @docfiles;
+
+
+my @files_match;
+my %files_target;
+my %files_from;
+my %files_to;
+
+my $totaldocs = 0;
+
+
+sub add_files_rule
+{
+	my ($match, $target, $from, $to) =@_;
+	push(@files_match, $match);
+	$files_target{"$match"} = $target;
+	
+	if (length($from) > 0) {
+		$files_from{"$match"} = $from;
+	}
+
+	if (length($to) > 0) {
+		$files_to{"$match"} = $to;
+	}
+}
+
+sub setup_files_rules
+{
+
+#
+# Files for the Main package
+# 
+
+	add_files_rule("^\\/usr\\/lib\\/[a-z0-9A-Z\\_\\-\\.]+\\.so\\.", 0, 
+			"(\\/usr\\/lib\\/.*\\.so\\.).*", "\*");
+
+
+	add_files_rule("^\\/usr\\/share\\/omf\\/", 0, 
+			"(\\/usr\\/share\\/omf\\/.*?\\/).*", "\*");
+			
+#
+# Files for the Devel subpackage
+#
+	add_files_rule("^\\/usr\\/share\\/gir-1\\.0\\/[a-z0-9A-Z\\_\\-\\.]+\\.gir\$", 1, 
+			"(\\/usr\\/share\\/gir-1\\.0\/).*", "\*\.gir");
+	add_files_rule("^\\/usr\\/lib\\/girepository-1\\.0\\/[a-z0-9A-Z\\_\\-\\.]+\\.typelib\$", 1, 
+			"(\\/usr\\/lib\\/girepository-1\\.0\/).*", "\*\.typelib");
+	add_files_rule("^\\/usr\\/include\\/[a-z0-9A-Z\\_\\-\\.]+\\.h\$", 1, 
+			"(\\/usr\\/include\/).*", "\*\.h");
+	add_files_rule("^\\/usr\\/include\\/[a-z0-9A-Z\\_\\-\\.]+\\/.*?\\.h\$", 1, 
+			"(\\/usr\\/include\\/[a-z0-9A-Z\\_\\-\\.]+\\/.*?)[a-z0-9A-Z\\_\\-\\.]+\\.h", "\*\.h");
+	add_files_rule("^\\/usr\\/lib\\/[a-z0-9A-Z\\_\\-\\.]+\\.so\$", 1, 
+			"(\\/usr\\/lib\\/).*\\.so\$", "\*.so");
+	add_files_rule("^\\/usr\\/lib\\/pkgconfig\\/[a-z0-9A-Z\\_\\-\\.\+]+\\.pc\$", 1, 
+			"(\\/usr\\/lib\\/pkgconfig\\/).*\\.pc\$", "\*.pc");
+	add_files_rule("^\\/usr\\/share\\/aclocal", 1, "", "");
+	add_files_rule("^\\/usr\\/lib\\/qt4\\/mkspecs/", 1, "", "");
+
+
+
+
+#
+# Files for the documentation subpackage
+#
+	add_files_rule("^\\/usr\\/share\\/gtk\-doc\\/html\\/[a-z0-9A-Z\\_\\-\\.]+\\/.\*", 2, 
+		       "(\\/usr\\/share\\/gtk\-doc\\/html\\/[a-z0-9A-Z\\_\\-\\.]+\\/).\*", "\*");
+	add_files_rule("^\\/usr\\/share\\/doc\\/[a-zA-Z0-9\-]*", 2, 
+                       "(\\/usr\\/share\\/doc\\/[a-zA-Z0-9\-]+\\/).*", "\*");
+	add_files_rule("^\\/usr\\/share\\/man\\/man[0-9]\\/[a-zA-Z0-9\-]*", 2, 
+                       "(\\/usr\\/share\\/man\\/man[0-9]\\/[a-zA-Z0-9\-]+\\/).*", "\*");
+	add_files_rule("^\\/usr\\/share\\/gnome\\/help\\/", 2, 
+			"(\\/usr\\/share\\/gnome\\/help\\/.*?\\/.*?\\/).*", "\*");
+		       
+		       
+#
+# Files to just not package at all (picked up by other things)
+#		     
+	add_files_rule("^\\/usr\\/share\\/locale", 99, "", "");
+	# compiled python things will get auto cleaned by rpm
+#	add_files_rule("\.pyo\$", 99, "", "");
+#	add_files_rule("\.pyc\$", 99, "", "");
+
+}
+
+sub apply_files_rules
+{
+	my $filenumber = @allfiles;
+	
+	if ($filenumber == 0) {
+		return;
+	}
+	
+	while (@allfiles > 0) {
+		my $filename = $allfiles[0];
+		my $destname = $filename;
+		my $handled = 0;
+	
+#
+# while we're here, try to guess what group our package is
+#	
+		guess_group_from_file($filename);
+	
+		foreach (@files_match) {
+			my $match = $_;
+			
+			if ($filename =~ /$match/) {				
+#
+# First try to see if we can turn the full filename into a
+# wildcard based filename
+#
+				if (defined($files_from{$match}) && defined($files_to{$match})) {
+					$from = $files_from{$match};
+					$to = $files_to{$match};
+					$destname =~ s/$from/$1$to/;
+#					print "changing $filename to $destname\n";
+				}
+
+# devel package
+				if ($files_target{$match} == 1) {
+					$handled = 1;
+					push(@develfiles, $destname);
+				}
+# doc rules.. also prepend %doc
+				if ($files_target{$match} == 2) {
+					$handled = 1;
+					$destname = "\"%doc " . $destname . "\"";
+					push(@docfiles, $destname);
+					$totaldocs = $totaldocs + 1;
+				}
+# don't package
+				if ($files_target{$match} == 99) {
+					$handled = 1;
+					if ($filename =~ /\/usr\/share\/locale\/.*?\/LC_MESSAGES\/(.*)\.mo/) {
+						$localename = $1;
+					}
+				}
+			}
+		}
+		
+
+#
+# if the destination name contains our package version,
+# use %version instead for future maintenance
+#
+		$destname =~ s/$version/\%\{version\}/g;	
+		if ($handled == 0) {
+			push(@mainfiles, $destname);
+		}	
+		shift(@allfiles);
+	}
+	
+#
+# Now.. if we have less than 5 documentation files, just stick them in the main package
+#
+
+	$filenumber = @docfiles;
+	
+	if ($filenumber <= 5) {
+		while (@docfiles > 0) {
+			my $filename = $docfiles[0];
+	
+			push(@mainfiles, $filename);
+			shift(@docfiles);
+		}
+	}
+	
+}
+
+sub print_files
+{
+	my $count = @mainfiles;
+	if ($count == 0) {
+		return;
+	}
+
+	# remove dupes
+	undef %saw;
+	@saw{@mainfiles} = ();
+    	@out = sort keys %saw;
+
+	print OUTFILE "Files:\n";
+	foreach (@out) {
+		print OUTFILE "    - $_\n";
+	}
+}
+
+sub print_devel
+{
+	my $count = @develfiles;
+	if ($count == 0) {
+		return;
+	}
+	print OUTFILE "SubPackages:\n";
+	$printed_subpackages = 1;
+	print OUTFILE "    - Name: devel\n";
+	print OUTFILE "      Summary: Development components for the $name package\n";
+	print OUTFILE "      Group: Development/Libraries\n";
+	print OUTFILE "      Description:\n";
+	print OUTFILE "         - Development files for the $name package\n";
+
+	# remove dupes
+	undef %saw;
+	@saw{@develfiles} = ();
+    	@out = sort keys %saw;
+
+	print OUTFILE "      Files:\n";
+	foreach (@out) {
+		print OUTFILE "        - $_\n";
+	}                
+}
+
+sub print_doc
+{
+	my $count = @docfiles;
+	if ($count == 0) {
+		return;
+	}
+	if ($printed_subpackages == 0) {
+		print OUTFILE "SubPackages:\n";
+		$printed_subpackages = 1;
+	}
+	print OUTFILE "    - Name: docs\n";
+	print OUTFILE "      Summary: Documentation components for the $name package\n";
+	print OUTFILE "      Group: Documentation\n";
+
+	# remove dupes
+	undef %saw;
+	@saw{@docfiles} = ();
+    	@out = sort keys %saw;
+
+	print OUTFILE "      Files:\n";
+	foreach (@out) {
+		print OUTFILE "        - $_\n";
+	}                
+}
+
+
+# end of %files section
+#
+######################################################################
+
+
+######################################################################
+#
+# What we can learn from configure.ac/configure
+#
+# - pkgconfig requirements
+# - regular build requirements
+# - package name / version
+
+
+sub setup_pkgconfig_ban
+{
+        push(@banned_pkgconfig, "^dnl\$");
+        push(@banned_pkgconfig, "^hal\$"); # we don't have nor want HAL
+        push(@banned_pkgconfig, "tslib-0.0"); # we don't want tslib-0.0 (legacy touchscreen interface)
+        push(@banned_pkgconfig, "intel-gen4asm");
+        push(@banned_pkgconfig, "^xp\$");  # xprint - deprecated and not in meego
+        push(@banned_pkgconfig, "^directfb\$");  # we use X, not directfb
+        push(@banned_pkgconfig, "^gtkmm-2.4\$");  # we use X, not directfb
+        push(@banned_pkgconfig, "^evil\$");
+        push(@banned_pkgconfig, "^directfb");
+        push(@banned_pkgconfig, "^sdl ");
+        
+        
+}
+
+sub setup_failed_commands
+{
+        $failed_commands{"doxygen"} = "doxygen";        
+        $failed_commands{"scrollkeeper-config"} = "rarian-compat";
+        $failed_commands{"dot"} = "graphviz";
+        $failed_commands{"flex"} = "flex";
+        $failed_commands{"lex"} = "flex";
+        $failed_commands{"freetype-config"} = "freetype-devel";
+        $failed_commands{"makeinfo"} = "texinfo";
+        $failed_commands{"desktop-file-install"} = "desktop-file-utils";
+        $failed_commands{"deflateBound in -lz"} = "zlib-devel";
+        $failed_commands{"gconftool-2"} = "GConf-dbus";
+        $failed_commands{"jpeglib.h"} = "libjpeg-devel";
+        $failed_commands{"expat.h"} = "expat-devel";
+        $failed_commands{"bison"} = "bison";
+        $failed_commands{"msgfmt"} = "gettext";
+        $failed_commands{"curl-config"} = "libcurl-devel";
+        $failed_commands{"doxygen"} = "doxygen";
+        $failed_commands{"X"} = "pkgconfig(x11)";
+
+        $failed_commands{"gawk"} = "gawk";
+        $failed_commands{"xbkcomp"} = "xkbcomp";
+        $failed_commands{"Vorbis"} = "libvorbis-devel";
+        # checking Expat 1.95.x... no
+        $failed_commands{"Expat 1.95.x"} = "expat-devel";
+        $failed_commands{"xml2-config path"} =  "libxml2-devel";
+
+        $failed_libs{"-lz"} = "zlib-devel";
+        $failed_libs{"-lncursesw"} = "ncurses-devel";
+        $failed_libs{"-ltiff"} = "libtiff-devel";
+        $failed_libs{"-lasound"} = "alsa-lib-devel";
+        $failed_libs{"Curses"} = "ncurses-devel";
+        
+        $failed_headers{"X11/extensions/randr.h"} = "xrandr";
+        $failed_headers{"X11/Xlib.h"} = "x11";
+        $failed_headers{"X11/extensions/XShm.h"} = "xext";
+        $failed_headers{"X11/extensions/shape.h"} = "xext";
+        $failed_headers{"ncurses.h"} = "ncursesw";
+        $failed_headers{"curses.h"} = "ncursesw";
+        $failed_headers{"pci/pci.h"} = "libpci";
+        $failed_headers{"xf86.h"} = "xorg-server";
+        $failed_headers{"sqlite.h"} = "sqlite3";
+        
+        $failed_headers{"X11/extensions/XIproto.h"} = "xi";
+        $failed_headers{"QElapsedTimer"} = "";
+}
+
+
+
+my @package_configs;
+my @buildreqs;
+my $uses_configure = 0;
+
+
+sub push_pkgconfig_buildreq
+{
+	my ($pr) = @_;
+
+	$pr =~ s/\s+//g;
+	
+	# remove collateral ] ) etc damage in the string
+	$pr =~ s/\"//g;
+	$pr =~ s/\)//g;
+	$pr =~ s/\]//g;
+	$pr =~ s/\[//g;
+
+
+	# first, undo the space packing
+
+	$pr =~ s/\>\=/ \>\= /g;
+	$pr =~ s/\<\=/ \<\= /g;
+
+	$pr =~ s/\<1.1.1/  /g;
+	
+	# don't show configure variables, we can't deal with them
+	if ($pr =~ /^\$/) {
+		return;
+	}
+	if ($pr =~ /AC_SUBST/) {
+		return;
+	}
+	
+	
+	
+
+	# process banned pkgconfig options for things that we don't
+	# have or don't want.
+	
+	
+	# remore versions that are macros or strings, not numbers
+	$pr =~ s/\s\>\= \$.*//g;
+
+	$pr =~ s/\s\>\= [a-zA-Z]+.*//g;
+
+	# don't show configure variables, we can't deal with them
+	if ($pr =~ /\$/) {
+		return;
+	}
+
+	foreach (@banned_pkgconfig) {
+	        my $ban = $_;
+	        if ($pr =~ /$ban/) {
+	                return;
+	        }
+	}
+	
+	push(@package_configs, $pr);
+}
+
+#
+# detect cases where we require both a generic pkgconfig, and a version specific
+# case
+#
+sub uniquify_pkgconfig
+{
+        # first remove real dupes
+        undef %saw;
+        @saw{@package_configs} = ();
+        @out = sort keys %saw;
+        
+        my $count = 0;
+                                        
+        while ($count < @out) {
+
+                my $entry = $out[$count];
+                
+                foreach(@out) {
+                        my $compare = $_;
+                        if ($entry eq $compare) {
+                                next;
+                        }
+                        
+                        $compare =~ s/ \>\=.*//g;
+                        if ($entry eq $compare) {
+                                $out[$count] = "";
+                        }
+                }
+                $count = $count + 1;
+        }
+        @package_configs = @out;
+}
+
+
+sub process_configure_ac
+{
+	my ($filename) = @_;
+	my $line = "";
+	my $depth = 0;
+	my $keepgoing = 1;
+	my $buffer = "";
+
+	if (!-e $filename)  {
+		return;
+	}
+	
+	$uses_configure = 1;
+
+
+
+	open(CONFIGURE, "$filename") || die "Couldn't open $filename\n";
+        seek(CONFIGURE, 0,0) or die "seek : $!";	
+	while ($keepgoing && !eof(CONFIGURE)) {
+                $buffer = getc(CONFIGURE);
+                
+		if ($buffer eq "(") {
+			$depth = $depth + 1;
+		}
+		if ($buffer eq ")" && $depth > 0) {
+			$depth = $depth - 1;
+		}
+		
+		if (!($buffer eq "\n")) {
+			$line = $line . $buffer;
+		}
+		
+		if (!($buffer eq "\n") || $depth > 0) {
+			redo unless eof(CONFIGURE);
+		}
+		
+		if ($line =~ /PKG_CHECK_MODULES\((.*)\)/) {
+			my $match = $1;
+			$match =~ s/\s+/ /g;
+			$match =~ s/, /,/g;
+			my @pkgs = split(/,/, $match);
+			my $pkg;
+			if (defined($pkgs[1])) {
+				$pkg = $pkgs[1];
+			} else {
+				next;
+			}
+			if ($pkg =~ /\[(.*)\]/) {
+				$pkg = $1;
+			}
+
+			$pkg =~ s/\s+/ /g;
+			# deal with versioned pkgconfig's by removing the spaces around >= 's 
+			$pkg =~ s/\>\=\s/\>\=/g;
+			$pkg =~ s/\s\>\=/\>\=/g;
+			$pkg =~ s/\=\s/\=/g;
+			$pkg =~ s/\s\=/\=/g;
+			$pkg =~ s/\<\=\s/\<\=/g;
+			$pkg =~ s/\<\s/\</g;
+			$pkg =~ s/\s\<\=/\<\=/g;
+			$pkg =~ s/\s\</\</g;
+
+			@words = split(/ /, $pkg);
+			foreach(@words) {
+				push_pkgconfig_buildreq($_);
+			}
+		}
+
+		if ($line =~ /PKG_CHECK_EXISTS\((.*)\)/) {
+			my $match = $1;
+			$match =~ s/\s+/ /g;
+			$match =~ s/, /,/g;
+			my @pkgs = split(/,/, $match);
+			my $pkg = $pkgs[0];
+			if ($pkg =~ /\[(.*)\]/) {
+				$pkg = $1;
+			}
+
+			$pkg =~ s/\s+/ /g;
+			# deal with versioned pkgconfig's by removing the spaces around >= 's 
+			$pkg =~ s/\>\=\s/\>\=/g;
+			$pkg =~ s/\s\>\=/\>\=/g;
+			$pkg =~ s/\<\=\s/\<\=/g;
+			$pkg =~ s/\<\s/\</g;
+			$pkg =~ s/\s\<\=/\<\=/g;
+			$pkg =~ s/\s\</\</g;
+			$pkg =~ s/\=\s/\=/g;
+			$pkg =~ s/\s\=/\=/g;
+
+			@words = split(/ /, $pkg);
+			foreach(@words) {
+				push_pkgconfig_buildreq($_);
+			}
+		}
+
+		if ($line =~ /XDT_CHECK_PACKAGE\(.*?,.*?\[(.*?)\].*\)/) {
+			my $pkg = $1;
+
+			$pkg =~ s/\s+/ /g;
+			# deal with versioned pkgconfig's by removing the spaces around >= 's 
+			$pkg =~ s/\>\=\s/\>\=/g;
+			$pkg =~ s/\s\>\=/\>\=/g;
+			$pkg =~ s/\=\s/\=/g;
+			$pkg =~ s/\s\=/\=/g;
+
+			@words = split(/ /, $pkg);
+			foreach(@words) {
+				push_pkgconfig_buildreq($_);
+			}
+		}
+
+		if ($line =~ /XDT_CHECK_OPTIONAL_PACKAGE\(.*?,.*?\[(.*?)\].*\)/) {
+			my $pkg = $1;
+
+			$pkg =~ s/\s+/ /g;
+			# deal with versioned pkgconfig's by removing the spaces around >= 's 
+			$pkg =~ s/\>\=\s/\>\=/g;
+			$pkg =~ s/\s\>\=/\>\=/g;
+			$pkg =~ s/\=\s/\=/g;
+			$pkg =~ s/\s\=/\=/g;
+
+			@words = split(/ /, $pkg);
+			foreach(@words) {
+				push_pkgconfig_buildreq($_);
+			}
+		}
+
+		if ($line =~ /AC_CHECK_LIB\(\[expat\]/) {
+			push(@buildreqs, "expat-devel");
+		}
+		if ($line =~ /AC_CHECK_FUNC\(\[tgetent\]/) {
+			push(@buildreqs, "ncurses-devel");
+		}
+		if ($line =~ /_PROG_INTLTOOL/) {
+			push(@buildreqs, "intltool");
+		}
+		if ($line =~ /GETTEXT_PACKAGE/) {
+			push(@buildreqs, "gettext");
+		}
+		if ($line =~ /GTK_DOC_CHECK/) {
+			push_pkgconfig_buildreq("gtk-doc");
+		}
+		if ($line =~ /GNOME_DOC_INIT/) {
+			 push(@buildreqs, "gnome-doc-utils");
+		}
+		if ($line =~ /AM_GLIB_GNU_GETTEXT/) {
+			push(@buildreqs, "gettext");
+		}
+
+		if ($line =~ /AC_INIT\((.*)\)/) {
+			my $match = $1;
+			$match =~ s/\s+/ /g;
+			@acinit = split(/,/, $match);
+#			$name = $acinit[0];
+			
+			if ($name =~ /\[(.*)\]/) {
+#				$name = $1;
+			}
+			
+			if (defined($acinit[3])) {
+#				$name = $acinit[3];
+				if ($name =~ /\[(.*)\]/) {
+#					$name = $1;
+				}
+			}
+			if (defined($acinit[1])) {
+				my $ver = $acinit[1];
+				$ver =~ s/\[//g;
+				$ver =~ s/\]//g;
+				if ($ver =~ /\$/){} else {
+					$version = $ver;
+					$version =~ s/\s+//g;
+				}
+			}
+		}
+		if ($line =~ /AM_INIT_AUTOMAKE\((.*)\)/) {
+			my $match = $1;
+			$match =~ s/\s+/ /g;
+			@acinit = split(/,/, $match);
+#			$name = $acinit[0];
+			
+			if ($name =~ /\[(.*)\]/) {
+#				$name = $1;
+			}
+			
+			if (defined($acinit[3])) {
+#				$name = $acinit[3];
+				if ($name =~ /\[(.*)\]/) {
+#					$name = $1;
+				}
+			}
+			if (defined($acinit[1])) {
+				my $ver = $acinit[1];
+				$ver =~ s/\[//g;
+				$ver =~ s/\]//g;
+				if ($ver =~ /\$/){} else {
+					$version = $ver;
+					$version =~ s/\s+//g;
+				}
+			}
+		}
+		
+		$line = "";
+	}
+	close(CONFIGURE);
+}
+
+sub process_qmake_pro
+{
+	my ($filename) = @_;
+	my $line = "";
+	my $depth = 0;
+	my $keepgoing = 1;
+	my $buffer = "";
+	my $prev_char = "";
+
+	if (!-e $filename)  {
+		return;
+	}
+	
+
+	open(CONFIGURE, "$filename") || die "Couldn't open $filename\n";
+        seek(CONFIGURE, 0,0) or die "seek : $!";	
+	while ($keepgoing && !eof(CONFIGURE)) {
+                $buffer = getc(CONFIGURE);
+                
+		if ($buffer eq "(") {
+			$depth = $depth + 1;
+		}
+		if ($buffer eq ")" && $depth > 0) {
+			$depth = $depth - 1;
+		}
+		
+		if (!($buffer eq "\n")) {
+			$line = $line . $buffer;
+		}
+		
+		if (!($buffer eq "\n") || ($prev_char eq "\\") ) {
+		        $prev_char = $buffer;
+			redo unless eof(CONFIGURE);
+		}
+		$prev_char = " ";
+		
+		if ($line =~ /PKGCONFIG.*?\=(.*)/) {
+		        my $l = $1;
+		        my @pkgs;
+		        
+                        $l =~ s/\\//g;
+                        $l =~ s/\s/ /g;
+                        @pkgs = split(/ /, $l);
+                        foreach (@pkgs) {
+                                if (length($_)>1) {
+                                        push_pkgconfig_buildreq($_);
+                                }
+                        }
+		}
+
+		$line = "";
+	}
+	close(CONFIGURE);
+}
+
+#
+# We also check configure if it exists, it's nice for some things
+# because various configure.ac macros have been expanded for us already.
+#
+sub process_configure
+{
+	my ($filename) = @_;
+	my $line = "";
+	my $depth = 0;
+	my $keepgoing = 1;
+
+	if (!-e $filename)  {
+		return;
+	}
+	
+	$uses_configure = 1;
+
+	open(CONFIGURE, "$filename") || die "Couldn't open $filename\n";
+        seek(CONFIGURE, 0,0) or die "seek : $!";	
+	while ($keepgoing && !eof(CONFIGURE)) {
+                $buffer = getc(CONFIGURE);
+		
+		if ($buffer eq "(") {
+			$depth = $depth + 1;
+		}
+		if ($buffer eq ")" && $depth > 0) {
+			$depth = $depth - 1;
+		}
+		
+		if (!($buffer eq "\n")) {
+			$line = $line . $buffer;
+		}
+		
+		if (!($buffer eq "\n") || $depth > 0) {
+			redo unless eof(CONFIGURE);
+		}
+		
+		
+
+		if ($line =~ /^PACKAGE_NAME=\'(.*?)\'/) {
+			$name = $1;
+		}
+		if ($line =~ /^PACKAGE_TARNAME=\'(.*?)\'/) {
+			$name = $1;
+		}
+		if ($line =~ /^PACKAGE_VERSION=\'(.*?)\'/) {
+			$version = $1;
+			$version =~ s/\s+//g;
+		}
+		if ($line =~ /^PACKAGE_URL=\'(.*?)\'/) {
+			if (length($1) > 2) {
+				$url = $1;
+			}
+		}
+		
+
+		$line = "";
+	}
+	close(CONFIGURE);
+}
+
+sub print_pkgconfig
+{
+	my $count = @package_configs;
+	if ($count == 0) {
+		return;
+	}
+
+	uniquify_pkgconfig();
+	
+	print OUTFILE "PkgConfigBR:\n";
+	foreach (@out) {
+		$line = $_;
+		$line =~ s/^\s+//g;
+		if (length($line) > 1) {
+			print OUTFILE "    - $line\n";
+		}
+	}
+}
+
+sub print_buildreq
+{
+	my $count = @buildreqs;
+	if ($count == 0) {
+		return;
+	}
+
+	# remove dupes
+	undef %saw;
+	@saw{@buildreqs} = ();
+    	@out = sort keys %saw;
+
+	print OUTFILE "PkgBR:\n";
+	foreach (@out) {
+		print OUTFILE "    - $_\n";
+	}
+}
+
+
+# end of configure section
+#
+######################################################################
+
+
+######################################################################
+#
+# Guessing the Description and Summary for a package
+#
+# We'll look at various sources of information for this:
+# - spec files in the package
+# - debain files in the package
+# - DOAP files in the package
+# - pkgconfig files in the package
+# - the README file in the package
+# - freshmeat.net online
+#
+
+sub guess_description_from_spec {
+	my ($specfile) = @_;
+
+	my $state = 0;
+	my $cummul = "";
+	
+	open(SPEC, $specfile);
+	while (<SPEC>) {
+		my $line = $_;
+		if ($state == 1 && $line =~ /^\%/) {
+			$state = 2;
+		}
+		if ($state == 1) {
+			$cummul = $cummul . $line;
+		}
+		if ($state==0 && $line =~ /\%description/) {
+			$state = 1;
+		}
+
+		if ($line =~ /Summary:\s*(.*)/ && length($summary) < 2) {
+			$summary = $1;
+		}
+		if ($line =~ /URL:\s*(.*)/ && length($url) < 2) {
+			$url = $1;
+		}
+	}
+	close(SPEC);
+	if (length($cummul) > 4) {
+		$description = $cummul;
+	}
+}
+
+#
+# DOAP is a project to create an XML/RDF vocabulary to describe software projects, and in particular open source.
+# so if someone ships a .doap file... we can learn from it.
+#
+sub guess_description_from_doap {
+	my ($doapfile) = @_;
+
+	open(DOAP, $doapfile);
+	while (<DOAP>) {
+		my $line = $_;
+		# <shortdesc xml:lang="en">Virtual filesystem implementation for gio</shortdesc>
+		if ($line =~ /\<shortdesc .*?\>(.*)\<\/shortdesc\>/) {
+			$summary = $1;
+		}
+		if ($line =~ /\<homepage .*?resource=\"(.*)\"\s*\/>/) {
+			$url = $1;
+		}
+	}
+	close(DOAP);
+}
+
+#
+# Debian control files have some interesting fields we can glean information
+# from as well.
+#
+sub guess_description_from_debian_control {
+	my ($file) = @_;
+
+	my $state = 0;
+	my $cummul = "";
+
+	$file = $file . "/debian/control";
+	
+	open(FILE, $file) || return;
+	while (<FILE>) {
+		my $line = $_;
+		if ($state == 1 && length($line) < 2) {
+			$state = 2;
+		}
+		if ($state == 1) {
+			$cummul = $cummul . $line;
+		}
+		if ($state==0 && $line =~ /\Description: (.*)/) {
+			$state = 1;
+			$cummul = $1;
+		}
+
+	}
+	close(FILE);
+	if (length($cummul) > 4) {
+		$description = $cummul;
+	}
+}
+
+#
+# the pkgconfig files have often a one line description
+# of the software... good for Summary
+#
+sub guess_description_from_pkgconfig {
+	my ($file) = @_;
+
+	open(FILE, $file);
+	while (<FILE>) {
+		my $line = $_;
+
+		if ($line =~ /Description:\s*(.*)/ && length($summary) < 2) {
+			$summary = $1;
+		}
+	}
+	close(FILE);
+}
+
+#
+# Freshmeat can provide us with a good one paragraph description
+# of the software..
+#
+sub guess_description_from_freshmeat {
+	my ($tarname) = @_;
+	my $cummul = "";
+	my $state = 0;
+	open(HTML, "curl -s http://freshmeat.net/projects/$tarname |");
+	while (<HTML>) {
+		my $line = $_;
+
+		if ($state == 1) {
+			$cummul = $cummul . $line;
+		}
+		if ($state == 0 && $line =~ /\<div class\=\"project-detail\"\>/) {
+			$state = 1;
+		}
+		if ($state == 1 && $line =~/\<\/p\>/) {
+			$state = 2;
+		}
+	}
+	close(HTML);
+	$cummul =~ s/\<p\>//g;
+	$cummul =~ s/\r//g;
+	$cummul =~ s/\<\/p\>//g;
+	$cummul =~ s/^\s*//g;
+	if (length($cummul)>10) {
+		$description = $cummul;
+	}
+}
+#
+# If all else fails, just take the first paragraph of the
+# readme file
+#
+sub guess_description_from_readme {
+	my ($file) = @_;
+
+	my $state = 0;
+	my $cummul = "";
+	
+	open(FILE, $file);
+	while (<FILE>) {
+		my $line = $_;
+		if ($state == 1 && $line =~ /^\n/ && length($cummul) > 80) {
+			$state = 2;
+		}
+		if ($state == 0 && length($line)>1) {
+			$state = 1;
+		}
+		if ($state == 1) {
+			$cummul = $cummul . $line;
+		}
+		if ($line =~ /(http\:\/\/.*$name.*\.org)/) {
+			my $u = $1;
+			if ($u =~ /bug/ || length($url) > 1) {
+			} else {
+				$url = $u;
+			}
+		}
+	}
+	close(FILE);
+	if (length($cummul) > 4 && length($description)<3) {
+		$description = $cummul;
+	}
+}
+
+#
+# Glue all the guesses together
+#
+sub guess_description {
+	my ($directory) = @_;
+
+
+	@files = <$directory/README*>;
+	foreach (@files) {
+		guess_description_from_readme($_);
+	}
+
+	if (length($name)>2) {
+		guess_description_from_freshmeat($name);
+	}
+
+	@files = <$directory/*.spec*>;
+	foreach (@files) {
+		guess_description_from_spec($_);
+	}
+
+	guess_description_from_debian_control($directory);
+
+	$name =~ s/ //g;
+	@files = <$directory/$name.pc*>;
+	foreach (@files) {
+		guess_description_from_pkgconfig($_);
+	}
+	@files = <$directory/*.pc.*>;
+	foreach (@files) {
+		guess_description_from_pkgconfig($_);
+	}
+	@files = <$directory/*.pc>;
+	foreach (@files) {
+		guess_description_from_pkgconfig($_);
+	}
+	@files = <$directory/*.doap>;
+	foreach (@files) {
+		guess_description_from_doap($_);
+	}
+
+	if (length($summary) < 2) {
+		$summary = $description;
+		$summary =~ s/\n/ /g;
+		$summary =~ s/\s+/ /g;
+		if ($summary =~ /(.*?)\./) {
+			$summary = $1;
+		}
+	}
+
+}
+
+# end of Description / Summary section
+#
+######################################################################
+
+
+
+#
+# Build the package, and wait for rpm to complain about unpackaged
+# files.... which we then use as basis for our %files section
+#
+sub guess_files_from_rpmbuild {
+	my $infiles = 0;
+	open(OUTPUTF, "rpmbuild --nodeps --define \"\%_sourcedir $orgdir \" -ba $name.spec 2>&1 |");
+	while (<OUTPUTF>) {
+		my $line2 = $_;
+
+		if ($infiles == 1 && $line2  =~ /RPM build errors/) {
+		        $infiles = 2;
+		}
+		if ($infiles == 1 && $line2  =~ /^Building/) {
+		        $infiles = 2;
+		}
+		
+		if ($infiles == 1) {
+			$line2 =~ s/\s*//g;
+			push(@allfiles, $line2);
+		}
+		if ($line2 =~ /    Installed \(but unpackaged\) file\(s\) found\:/) {
+			$infiles = 1;
+		}
+	}
+	close(OUTPUTF);
+	if (@allfiles == 0) {
+		print "Build failed ... stopping here.\n";
+		exit(0);
+	}
+
+}
+
+sub guess_files_from_oscbuild {
+	my $infiles = 0;
+	my $restart = 0;	
+	my $mustrestart = 0;
+        my $rcount = 0;
+        my $done_python = 0;
+        
+        system("osc addremove &> /dev/null");
+	system("osc ci -m \"Initial import by autospectacle\" &> /dev/null");
+
+retry: 
+        if ($restart > 0) {
+                write_yaml();
+                print "Restarting the build\n";
+        }
+        $restart = 0;
+        $infiles = 0;
+        $mustrestart = 0;
+	open(OUTPUTF, "osc build --no-verify $name.spec 2>&1 |");
+	while (<OUTPUTF>) {
+		my $line2 = $_;
+		
+#		print "line is $line2\n";
+		if ($infiles == 1 && $line2  =~ /RPM build errors/) {
+		        $infiles = 2;
+		}
+		if ($infiles == 1 && $line2  =~ /^Building/) {
+		        $infiles = 2;
+		}
+		if ($infiles == 1) {
+			$line2 =~ s/\s*//g;
+			push(@allfiles, $line2);
+		}
+		if ($line2 =~ /No package \'(.*)\' found/) {
+                        push_pkgconfig_buildreq("$1");       
+                        $restart = $restart + 1;
+                        print "    Adding pkgconfig($1) requirement\n";
+		}
+		if ($line2 =~ /Package requirements \((.*?)\) were not met/) {
+		        $pkg = $1;
+			# deal with versioned pkgconfig's by removing the spaces around >= 's 
+			$pkg =~ s/\>\=\s/\>\=/g;
+			$pkg =~ s/\s\>\=/\>\=/g;
+			$pkg =~ s/\=\s/\=/g;
+			$pkg =~ s/\s\=/\=/g;
+		        my @req = split(/ /,$pkg);
+                        foreach (@req) {
+                                push_pkgconfig_buildreq("$_");       
+                                
+                                $restart = $restart + 1;
+                                print "    Adding pkgconfig($_) requirement\n";
+                        }
+		}
+		if ($line2 =~ /which: no qmake/) {
+		        $restart += 1;
+                        push_pkgconfig_buildreq("Qt");
+                        print "    Adding Qt requirement\n";
+		}
+		if ($line2 =~ /Cannot find development files for any supported version of libnl/) {
+		        $restart += 1;
+                        push_pkgconfig_buildreq("libnl-1");
+                        print "    Adding libnl requirement\n";
+		}
+		if ($line2 =~ /<http:\/\/www.cmake.org>/) {
+		        $restart += 1;
+                        push(@buildreqs, "cmake");
+                        print "    Adding cmake requirement\n";
+		}
+		if ($line2 =~ /checking for (.*?)\.\.\. not_found/ || $line2 =~ /checking for (.*?)\.\.\. no/  || $line2 =~ /checking (.*?)\.\.\. no/) {
+		        $pkg = $1;
+                        while (($key,$value) = each %failed_commands) {
+                                if ($pkg eq $key) {
+                                        push(@buildreqs, $value);
+                                        print "    Adding $value requirement\n";
+                                        $restart += $restart + 1;
+                                        $mustrestart = 1;
+                                }
+                        }
+                        
+		}
+
+		if ($line2 =~ /checking for [a-zA-Z0-9\_]+ in (.*?)\.\.\. no/) {
+		        $pkg = $1;
+                        while (($key,$value) = each %failed_libs) {
+                                if ($pkg eq $key) {
+                                        push(@buildreqs, $value);
+                                        print "    Adding $value requirement\n";
+                                        $restart += $restart + 1;
+                                        $mustrestart = 1;
+                                }
+                        }
+                        
+		}
+
+		if ($line2 =~ /-- Could NOT find ([a-zA-Z0-9]+)/) {
+		        $pkg = $1;
+                        while (($key,$value) = each %failed_libs) {
+                                if ($pkg eq $key) {
+                                        push(@buildreqs, $value);
+                                        print "    Adding $value requirement\n";
+                                        $restart += $restart + 1;
+                                        $mustrestart = 1;
+                                }
+                        }
+                        
+		}
+
+		if ($line2 =~ /fatal error\: (.*)\: No such file or directory/) {
+		        $pkg = $1;
+                        while (($key,$value) = each %failed_headers) {
+                                if ($pkg eq $key) {
+                                        push_pkgconfig_buildreq($value);
+                                        print "    Adding $value requirement\n";
+                                        $restart += $restart + 1;
+                                }
+                        }
+                        
+		}
+		if ($line2 =~ /checking for UDEV\.\.\. no/) {
+		        print "    Adding pkgconfig(udev) requirement\n";
+		        push_pkgconfig_buildreq("udev");
+		}
+		if ($line2 =~ /checking for Apache .* module support/) {
+		        print "    Adding pkgconfig(httpd-devel) requirement\n";
+		        push(@buildreqs, "httpd-devel");
+		        if ($rcount < 3) {
+		                $restart = $restart + 1;
+		        }
+		}
+		if ($line2 =~ /([a-zA-Z0-9\-\_]*)\: command not found/i) {
+		        my $cmd = $1;
+		        my $found = 0;
+		        
+                        while (($key,$value) = each %failed_commands) {
+                                if ($cmd eq $key) {
+                                        push(@buildreqs, $value);
+                                        print "    Adding $value requirement\n";
+                                        $restart += $restart + 1;
+                                        $mustrestart = 1;
+                                        $found = 1;
+                                }
+                        }
+                        
+                        if ($found < 1) {
+                                print "    Command $cmd not found!\n";
+                        }
+		}
+		if ($line2 =~ /checking for.*in -ljpeg... no/) {
+                        push(@buildreqs, "libjpeg-devel");
+                        print "    Adding libjpeg-devel requirement\n";
+                        $restart = $restart + 1;
+		}
+		if ($line2 =~ /fatal error\: zlib\.h\: No such file or directory/) {
+                        push(@buildreqs, "zlib-devel");
+                        print "    Adding zlib-devel requirement\n";
+                        $restart = $restart + 1;
+		}
+		if ($line2 =~ /error\: xml2-config not found/) {
+                        push_pkgconfig_buildreq("libxml-2.0");
+                        print "    Adding libxml2-devel requirement\n";
+                        $restart = $restart + 1;
+		}
+		if ($line2 =~ /checking \"location of ncurses\.h file\"/) {
+                        push(@buildreqs, "ncurses-devel");
+                        print "    Adding ncurses-devel requirement\n";
+                        $restart = $restart + 1;
+		}
+		if (($line2 =~ / \/usr\/include\/python2\.6$/ || $line2 =~ / to compile python extensions/) && $done_python == 0) {
+                        push(@buildreqs, "python-devel");
+                        print "    Adding python-devel requirement\n";
+                        $restart = $restart + 1;
+                        $done_python = 1;
+		}
+		if ($line2 =~ /error: must install xorg-macros 1.6/) {
+                        push_pkgconfig_buildreq("xorg-macros");
+                        print "    Adding xorg-macros requirement\n";
+                        $restart = $restart + 1;
+		}
+		if ($line2 =~ /installing .*?.gmo as [a-zA-Z0-9\-\.\/\_]+?\/([a-zA-Z0-9\-\_\.]+)\.mo$/) {
+		        my $loc = $1;
+		        if ($loc eq $localename) {} else {
+		                print "    Changing localename from $localename to $loc\n";
+        		        $localename = $loc;
+                                $restart = $restart + 1;
+                        }
+		}
+		
+		if ($infiles == 0 && $line2 =~ /    Installed \(but unpackaged\) file\(s\) found\:/) {
+			$infiles = 1;
+		}
+	}
+	close(OUTPUTF);
+	if (@allfiles == 0 || $mustrestart > 0) {
+	        if ($restart >= 1) 
+                {
+                        $rcount = $rcount + 1;
+                        if ($rcount < 10) {
+        	                goto retry;
+                        }
+	        }
+		print "Build failed ... stopping here.\n";
+		exit(0);
+	}
+
+}
+
+sub process_rpmlint {
+	my $infiles = 0;
+		
+
+        if ($oscmode == 0) {
+                return;
+        }		
+
+        print "Verifying package   ....\n";
+        
+        system("osc addremove &> /dev/null");
+	system("osc ci -m \"Final import by autospectacle\" &> /dev/null");
+
+	open(OUTPUTF, "osc build --no-verify $name.spec 2>&1 |");
+	while (<OUTPUTF>) {
+		my $line2 = $_;
+		
+#		print "line is $line2\n";
+		if ($infiles == 1 && $line2  =~ /RPM build errors/) {
+		        $infiles = 2;
+		}
+		if ($infiles == 1 && $line2  =~ /^Building/) {
+		        $infiles = 2;
+		}
+		if ($infiles == 1) {
+			$line2 =~ s/\s*//g;
+			push(@allfiles, $line2);
+		}
+		if ($infiles == 0 && $line2 =~ /    Installed \(but unpackaged\) file\(s\) found\:/) {
+			$infiles = 1;
+		}
+	}
+	close(OUTPUTF);
+
+}
+
+sub guess_name_from_url {
+	my ($bigurl) = @_;
+	
+	@spliturl = split(/\//, $bigurl);
+	while (@spliturl > 1) {
+		shift(@spliturl);
+	}
+	my $tarfile = $spliturl[0];
+	
+	if ($tarfile =~ /(.*?)\-([0-9\.\-\~]+)\.tar/) {
+		$name = $1;
+		$version = $2;
+                $version =~ s/\-/\_/g;
+	}
+}
+
+############################################################################
+#
+# Output functions
+#
+
+sub print_name_and_description
+{
+	my @lines;
+
+	print OUTFILE "Name       : $name\n";
+	print OUTFILE "Version    : $version\n";
+	print OUTFILE "Release    : 1\n";
+	
+	# remove dupes
+	undef %saw;
+	@saw{@groups} = ();
+    	@out = sort keys %saw;
+
+    	if (@out == 1) {
+		foreach (@out) {
+			print OUTFILE "Group      : $_\n";
+		}
+	} else {
+		print OUTFILE "Group      : $group\n";
+	}
+	# 
+	# Work around spectacle bug
+	$summary =~ s/\:\s/ /g;
+	$summary =~ s/^([a-z])/\u$1/ig; 
+	$summary =~ s/\@//g; 
+	$summary = substr($summary, 0, 79);
+	
+	$summary =~ s/\.^//g;
+	if (length($summary) < 1) {
+	        $summary = "TO BE FILLED IN";
+	}
+	#
+	print OUTFILE "Summary    : $summary\n";
+	print OUTFILE "Description: |\n";
+
+	$description =~ s/&quot;/\"/g;
+	$description =~ s/\@//g; 
+	@lines = split(/\n/, $description);
+	foreach (@lines) {
+		print OUTFILE "    $_\n";
+	}
+	if (length($url)>1) {
+		print OUTFILE "URL        : $url\n";
+	}
+
+	# remove dupes
+	undef %saw;
+	@saw{@sources} = ();
+    	@out = sort keys %saw;
+
+	print OUTFILE "Sources    : \n";
+	foreach (@out) {
+		$source = $_;
+		$source =~ s/$version/\%\{version\}/g;	
+
+		print OUTFILE "    - $source\n";
+	}
+	
+        if (@patches > 0) {
+                print OUTFILE "Patches: \n";
+                foreach (@patches) {
+                        my $patch = $_;
+        		print OUTFILE "    - $patch\n";
+                }
+        }
+	
+	print OUTFILE "\n";
+	if (length($configure)>2) {
+		print OUTFILE "Configure  : $configure\n";
+	}
+	if (length($localename) > 2) {
+		print OUTFILE "LocaleName : $localename\n";
+	}
+	if (length($builder) > 2) {
+	        print OUTFILE "Builder    : $builder\n";
+	}
+}
+
+sub write_makefile
+{
+	open(MAKEFILE, ">Makefile");
+
+	print MAKEFILE "PKG_NAME := $name\n";
+	print MAKEFILE "SPECFILE = \$(addsuffix .spec, \$(PKG_NAME))\n";
+	print MAKEFILE "YAMLFILE = \$(addsuffix .yaml, \$(PKG_NAME))\n";
+	print MAKEFILE "\n";
+	print MAKEFILE "include /usr/share/packaging-tools/Makefile.common\n";
+	
+	close(MAKEFILE);
+}
+
+sub write_changelog
+{
+	open(CHANGELOG, ">$name.changes");
+	$date = ` date +"%a %b %d %Y"`;	
+	chomp($date);
+	print CHANGELOG "* $date - Autospectacle <autospectacle\@meego.com> - $version\n";
+	print CHANGELOG "- Initial automated packaging\n";
+	close(CHANGELOG);
+}
+
+sub write_yaml
+{
+	open(OUTFILE, ">$name.yaml");
+	print_name_and_description();
+	print_license();
+	print_pkgconfig();
+	print_buildreq();
+	print_files();
+	print_devel();
+	print_doc();
+	close(OUTFILE);
+
+	write_makefile();
+	write_changelog();
+
+	system("rm $name.spec");
+	system("specify &> /dev/null");
+	if ($oscmode > 0) {
+	        system("osc addremove");
+        	system("osc ci -m \"Import by autospectacle\" &> /dev/null");
+        }
+
+}
+
+
+############################################################################
+#
+# Main program 
+#
+
+if ( @ARGV < 1 ) {
+    print "Usage: $0 <url-of-source-tarballs>\n";
+    exit(1);
+}
+
+if (@ARGV > 1) {
+        my $i = 1;
+        while ($i < @ARGV) {
+                my $patch = $ARGV[$i];
+                print "Adding patch $patch\n";
+                push(@patches, $patch);
+                $i++;
+        }
+}
+
+setup_licenses();
+setup_files_rules();
+setup_group_rules();
+setup_pkgconfig_ban();
+setup_failed_commands();
+
+if (-e ".osc/_packages") {
+ $oscmode = 1;
+}
+
+my $tmpdir = tempdir();
+
+$dir = $ARGV[0];
+guess_name_from_url($dir);
+push(@sources, $dir);
+
+
+#system("cd $tmpdir; curl -s -O $dir");
+$orgdir = `pwd`;
+chomp($orgdir);
+print "Downloading package: $dir\n";
+system("wget --quiet $dir");
+print "Unpacking to       : $tmpdir\n";
+
+my @tgzfiles = <$orgdir/*.tgz>;
+foreach (@tgzfiles) {
+        my $tgz = $_;
+        my $tar = $tgz;
+        $tar =~ s/tgz/tar\.gz/g;
+        $dir =~ s/tgz/tar\.gz/g;
+        system("mv $tgz $tar");
+        guess_name_from_url($dir);
+}
+
+
+#
+# I really really hate the fact that meego deleted the -a option from tar.
+# this is a step backwards in time that is just silly.
+#
+
+
+system("cd $tmpdir; tar -jxf $orgdir/*\.tar\.bz2");
+system("cd $tmpdir; tar -zxf $orgdir/*\.tar\.gz");
+print "Parsing content    ....\n";
+my @dirs = <$tmpdir/*>;
+foreach (@dirs) {
+	$dir = $_;
+}
+
+$fulldir = $dir;
+
+if ( -e "$dir/autogen.sh" ) {
+	$configure = "autogen";
+	$uses_configure = 1;
+}
+if ( -e "$dir/BUILD-CMAKE" ) {
+	$configure = "cmake";
+	push(@buildreqs, "cmake");
+	$uses_configure = 1;
+}
+
+if ( -e "$dir/configure" ) {
+	$configure = "";
+}
+
+my @files = <$dir/configure.*>;
+
+my $findoutput = `find $dir -name "configure.ac"`;
+my @findlist = split(/\n/, $findoutput);
+foreach (@findlist) {
+	push(@files, $_);
+}
+foreach (@files) {
+	process_configure_ac("$_");
+}
+
+$findoutput = `find $dir -name "*.pro"`;
+@findlist = split(/\n/, $findoutput);
+foreach (@findlist) {
+	process_qmake_pro("$_");
+}
+
+if (-e "$dir/$name.pro") {
+        $builder = "qmake";
+        push_pkgconfig_buildreq("Qt");
+}
+
+
+#
+# This is a good place to generate configure.in
+#
+if (length($configure) > 2) {
+	if ($configure eq "autogen") {
+		system("cd $dir ; ./autogen.sh &> /dev/null");
+	}
+}
+@files = <$dir/configure>;
+foreach (@files) {
+	process_configure("$_");
+}
+
+if ($uses_configure == 0) {
+	$configure = "none"; 
+}
+
+@files = <$dir/COPY*>;
+foreach (@files) {
+	guess_license_from_file("$_");
+}
+
+@files = <$dir/LICENSE*>;
+foreach (@files) {
+	guess_license_from_file("$_");
+}
+
+
+@files = <$dir/GPL*>;
+foreach (@files) {
+	guess_license_from_file("$_");
+}
+
+
+guess_description($dir);
+
+
+#
+# Output of the yaml file
+#
+
+
+if ($oscmode == 1) {
+	print "Creating OBS project $name ...\n";
+	system("osc mkpac $name &> /dev/null");
+	system("mkdir $name &> /dev/null");
+	chdir($name);
+	system("mv ../$name*\.tar\.* .");
+}
+
+write_yaml();
+print "Building package   ....\n";
+
+if ($oscmode == 0) {
+	guess_files_from_rpmbuild();
+} else {
+ 	guess_files_from_oscbuild();
+}
+
+apply_files_rules();
+
+$printed_subpackages = 0;
+write_yaml();
+
+process_rpmlint();
+
+print "Spectacle creation complete.\n";
-- 
1.7.5.4



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/2] autospectacle.pl: create recipe file
  2012-04-26  8:10 [PATCH 0/2] Yocto 1656: rebase on autospectacle.pl Kang Kai
  2012-04-26  8:10 ` [PATCH 1/2] autospectacle.pl: pull it from meego as a base Kang Kai
@ 2012-04-26  8:10 ` Kang Kai
  2012-04-26 15:47 ` [PATCH 0/2] Yocto 1656: rebase on autospectacle.pl Saul Wold
  2 siblings, 0 replies; 5+ messages in thread
From: Kang Kai @ 2012-04-26  8:10 UTC (permalink / raw)
  To: sgw, poky

[Yocto 1656]
It bases on original autospectacle.pl from project Meego. Add feature
to create .bb file according to parse result.

Signed-off-by: Kang Kai <kai.kang@windriver.com>
---
 scripts/autospectacle.pl |  117 ++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 103 insertions(+), 14 deletions(-)

diff --git a/scripts/autospectacle.pl b/scripts/autospectacle.pl
index bb9f8dc..aba9ac3 100755
--- a/scripts/autospectacle.pl
+++ b/scripts/autospectacle.pl
@@ -1,5 +1,7 @@
 #!/usr/bin/perl -w
 
+#      Copyright (C) 2012 Wind River Systems, Inc.
+#
 #      Copyright (C) 2010 Intel Corporation
 #
 #   
@@ -29,6 +31,7 @@
 use File::Temp qw(tempdir);
 use File::Path qw(mkpath rmtree); 
 use File::Spec (); 
+use File::Basename qw(basename dirname);
 
 
 my $name = "";
@@ -42,6 +45,10 @@ my @sources;
 my @mainfiles;
 my @patches;
 
+my $md5sum = "";
+my $sh256sum = "";
+my @inherits;
+
 my $printed_subpackages = 0;
 my $fulldir = "";
 
@@ -70,6 +77,7 @@ my %failed_headers;
 
 my %licenses;
 my @license;
+my %lic_files;
 
 sub setup_licenses
 {
@@ -115,8 +123,14 @@ sub guess_license_from_file {
 	if (defined($licenses{$sha1})) {
 		my $lic = $licenses{$sha1};
 		push(@license, $lic);
+
+		my $md5output = `md5sum $copying`;
+		$md5output =~ /^([a-zA-Z0-9]*) /;
+		my $md5 = $1;
+		chomp($md5);
+		$lic_files{$copying} = $md5
 	}
-	
+
 	#
 	# We also must make sure that the COPYING/etc files
 	# end up in the main package as %doc..
@@ -124,7 +138,7 @@ sub guess_license_from_file {
 	$copying =~ s/$fulldir//g;
 	$copying =~ s/^\///g;
 	$copying = "\"\%doc " . $copying ."\"";
-	
+
 	push(@mainfiles, $copying);
 }
 
@@ -1522,7 +1536,7 @@ sub guess_name_from_url {
 	}
 	my $tarfile = $spliturl[0];
 	
-	if ($tarfile =~ /(.*?)\-([0-9\.\-\~]+)\.tar/) {
+	if ($tarfile =~ /(.*?)\-([0-9\.\-\~]+)[-\.].*?\.tar/) {
 		$name = $1;
 		$version = $2;
                 $version =~ s/\-/\_/g;
@@ -1650,7 +1664,7 @@ sub write_yaml
 	write_makefile();
 	write_changelog();
 
-	system("rm $name.spec");
+	system("rm $name.spec 2>/dev/null");
 	system("specify &> /dev/null");
 	if ($oscmode > 0) {
 	        system("osc addremove");
@@ -1659,6 +1673,65 @@ sub write_yaml
 
 }
 
+sub write_bbfile
+{
+	open(BBFILE, ">${name}_$version.bb");
+	print BBFILE "SUMMARY = \"$summary\"\n";
+	print BBFILE "DESCRIPTION = \"$description\"\n";
+
+	print BBFILE "LICENSE = \"@license\"\n";
+	print BBFILE "LIC_FILES_CHKSUM = \"";
+	foreach (keys %lic_files) {
+		print BBFILE "file://" . basename($_) . ";md5=$lic_files{$_} \\\n";
+	}
+	print BBFILE "\"\n\n";
+
+	if (@license <= 0) {
+		print "Can NOT get license from package itself.\n";
+		print "Please update the license and license file manually.\n";
+	}
+
+	if (@buildreqs > 0) {
+		my %saw;
+		my @out = grep(!$saw{$_}++,@buildreqs);
+		print BBFILE "DEPENDS = \"@out\"\n\n";
+	};
+
+	print BBFILE 'PR = "r0"' . "\n\n";
+	print BBFILE "SRC_URI = \"";
+	foreach (@sources) {
+		print BBFILE "$_ \\\n";
+	}
+	print BBFILE "\"\n\n";
+	print BBFILE "SRC_URI[md5sum] = \"$md5sum\"\n";
+	print BBFILE "SRC_URI[sha256sum] = \"$sha256sum\"\n";
+
+	if (@inherits) {
+		print BBFILE "inherit ";
+		foreach (@inherits) {
+			print BBFILE "$_ ";
+		}
+	}
+
+	close(BBFILE);
+
+	my $curdir = `pwd`;
+	chomp($curdir);
+	print "Create bb file: $curdir/${name}_$version.bb\n";
+}
+
+sub calculate_sums
+{
+    @_ = basename $dir;
+    my $md5output = `md5sum @_`;
+    $md5output =~ /^([a-zA-Z0-9]*) /;
+    $md5sum = $1;
+    chomp($md5sum);
+    my $sha256output = `sha256sum @_`;
+    $sha256output =~ /^([a-zA-Z0-9]*) /;
+    $sha256sum = $1;
+    chomp($sha256sum);
+}
 
 ############################################################################
 #
@@ -1696,33 +1769,40 @@ $dir = $ARGV[0];
 guess_name_from_url($dir);
 push(@sources, $dir);
 
-
 #system("cd $tmpdir; curl -s -O $dir");
 $orgdir = `pwd`;
 chomp($orgdir);
+my $outputdir = $name;
+if (! $name) {
+	$outputdir = basename $dir;
+}
+mkpath($outputdir);
+chdir($outputdir);
 print "Downloading package: $dir\n";
-system("wget --quiet $dir");
+system("wget --quiet $dir") == 0 or die "Download $dir failed.";
+
+calculate_sums($outputdir);
+
 print "Unpacking to       : $tmpdir\n";
 
-my @tgzfiles = <$orgdir/*.tgz>;
+my @tgzfiles = <$orgdir/$outputdir/*.tgz>;
 foreach (@tgzfiles) {
-        my $tgz = $_;
+        my $tgz = basename $_;
         my $tar = $tgz;
         $tar =~ s/tgz/tar\.gz/g;
         $dir =~ s/tgz/tar\.gz/g;
-        system("mv $tgz $tar");
+        system("mv $orgdir/$outputdir/$tgz $orgdir/$outputdir/$tar");
         guess_name_from_url($dir);
 }
 
-
 #
 # I really really hate the fact that meego deleted the -a option from tar.
 # this is a step backwards in time that is just silly.
 #
 
 
-system("cd $tmpdir; tar -jxf $orgdir/*\.tar\.bz2");
-system("cd $tmpdir; tar -zxf $orgdir/*\.tar\.gz");
+system("cd $tmpdir; tar -jxf $orgdir/$outputdir/*\.tar\.bz2 &>/dev/null");
+system("cd $tmpdir; tar -zxf $orgdir/$outputdir/*\.tar\.gz &>/dev/null");
 print "Parsing content    ....\n";
 my @dirs = <$tmpdir/*>;
 foreach (@dirs) {
@@ -1734,11 +1814,13 @@ $fulldir = $dir;
 if ( -e "$dir/autogen.sh" ) {
 	$configure = "autogen";
 	$uses_configure = 1;
+	push(@inherits, "autotools");
 }
 if ( -e "$dir/BUILD-CMAKE" ) {
 	$configure = "cmake";
 	push(@buildreqs, "cmake");
 	$uses_configure = 1;
+	push(@inherits, "cmake");
 }
 
 if ( -e "$dir/configure" ) {
@@ -1747,7 +1829,7 @@ if ( -e "$dir/configure" ) {
 
 my @files = <$dir/configure.*>;
 
-my $findoutput = `find $dir -name "configure.ac"`;
+my $findoutput = `find $dir -name "configure.ac" 2>/dev/null`;
 my @findlist = split(/\n/, $findoutput);
 foreach (@findlist) {
 	push(@files, $_);
@@ -1756,7 +1838,7 @@ foreach (@files) {
 	process_configure_ac("$_");
 }
 
-$findoutput = `find $dir -name "*.pro"`;
+$findoutput = `find $dir -name "*.pro" 2>/dev/null`;
 @findlist = split(/\n/, $findoutput);
 foreach (@findlist) {
 	process_qmake_pro("$_");
@@ -1765,6 +1847,7 @@ foreach (@findlist) {
 if (-e "$dir/$name.pro") {
         $builder = "qmake";
         push_pkgconfig_buildreq("Qt");
+	push(@inherits, "qmake2");
 }
 
 
@@ -1804,6 +1887,12 @@ foreach (@files) {
 
 guess_description($dir);
 
+#
+# Output of bbfile file
+#
+write_bbfile();
+chdir($orgdir);
+exit 0;
 
 #
 # Output of the yaml file
-- 
1.7.5.4



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 0/2] Yocto 1656: rebase on autospectacle.pl
  2012-04-26  8:10 [PATCH 0/2] Yocto 1656: rebase on autospectacle.pl Kang Kai
  2012-04-26  8:10 ` [PATCH 1/2] autospectacle.pl: pull it from meego as a base Kang Kai
  2012-04-26  8:10 ` [PATCH 2/2] autospectacle.pl: create recipe file Kang Kai
@ 2012-04-26 15:47 ` Saul Wold
  2 siblings, 0 replies; 5+ messages in thread
From: Saul Wold @ 2012-04-26 15:47 UTC (permalink / raw)
  To: Kang Kai; +Cc: poky

On 04/26/2012 01:10 AM, Kang Kai wrote:
> Hi Saul,
>
> I sent these patches to poky mail list on March 13, and didn't see the
> comments. If I miss your comment, would you like to comment them again?
>
> Thanks a lot.
>
> I rebase Yocto 1656: Recipe creation/import script on autospectacle.pl and
> add feature to create recipe file.
>
Kai,

It can you please rename the script to some more appropriate for the 
Yocto Project.  Since this tool creates .bb files not spec files we 
should rename it.

Thanks
	Sau!

> The following changes since commit 492a58cabdc053b2312712681dbcffa8270d4ea4:
>
>    self-hosted-image: Update poky revision to point at the 1.2 release branch (2012-04-24 10:21:11 +0100)
>
> are available in the git repository at:
>    git://git.pokylinux.org/poky-contrib kangkai/autospectacle
>    http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=kangkai/autospectacle
>
> Kang Kai (2):
>    autospectacle.pl: pull it from meego as a base
>    autospectacle.pl: create recipe file
>
>   scripts/autospectacle.pl | 1926 ++++++++++++++++++++++++++++++++++++++++++++++
>   1 files changed, 1926 insertions(+), 0 deletions(-)
>   create mode 100755 scripts/autospectacle.pl
>


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 2/2] autospectacle.pl: create recipe file
  2012-03-13  9:45 Kang Kai
@ 2012-03-13  9:45 ` Kang Kai
  0 siblings, 0 replies; 5+ messages in thread
From: Kang Kai @ 2012-03-13  9:45 UTC (permalink / raw)
  To: sgw, poky

[Yocto 1656]
It bases on original autospectacle.pl from project Meego. Add feature
to create .bb file according to parse result.

Signed-off-by: Kang Kai <kai.kang@windriver.com>
---
 scripts/autospectacle.pl |  117 ++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 103 insertions(+), 14 deletions(-)

diff --git a/scripts/autospectacle.pl b/scripts/autospectacle.pl
index bb9f8dc..aba9ac3 100755
--- a/scripts/autospectacle.pl
+++ b/scripts/autospectacle.pl
@@ -1,5 +1,7 @@
 #!/usr/bin/perl -w
 
+#      Copyright (C) 2012 Wind River Systems, Inc.
+#
 #      Copyright (C) 2010 Intel Corporation
 #
 #   
@@ -29,6 +31,7 @@
 use File::Temp qw(tempdir);
 use File::Path qw(mkpath rmtree); 
 use File::Spec (); 
+use File::Basename qw(basename dirname);
 
 
 my $name = "";
@@ -42,6 +45,10 @@ my @sources;
 my @mainfiles;
 my @patches;
 
+my $md5sum = "";
+my $sh256sum = "";
+my @inherits;
+
 my $printed_subpackages = 0;
 my $fulldir = "";
 
@@ -70,6 +77,7 @@ my %failed_headers;
 
 my %licenses;
 my @license;
+my %lic_files;
 
 sub setup_licenses
 {
@@ -115,8 +123,14 @@ sub guess_license_from_file {
 	if (defined($licenses{$sha1})) {
 		my $lic = $licenses{$sha1};
 		push(@license, $lic);
+
+		my $md5output = `md5sum $copying`;
+		$md5output =~ /^([a-zA-Z0-9]*) /;
+		my $md5 = $1;
+		chomp($md5);
+		$lic_files{$copying} = $md5
 	}
-	
+
 	#
 	# We also must make sure that the COPYING/etc files
 	# end up in the main package as %doc..
@@ -124,7 +138,7 @@ sub guess_license_from_file {
 	$copying =~ s/$fulldir//g;
 	$copying =~ s/^\///g;
 	$copying = "\"\%doc " . $copying ."\"";
-	
+
 	push(@mainfiles, $copying);
 }
 
@@ -1522,7 +1536,7 @@ sub guess_name_from_url {
 	}
 	my $tarfile = $spliturl[0];
 	
-	if ($tarfile =~ /(.*?)\-([0-9\.\-\~]+)\.tar/) {
+	if ($tarfile =~ /(.*?)\-([0-9\.\-\~]+)[-\.].*?\.tar/) {
 		$name = $1;
 		$version = $2;
                 $version =~ s/\-/\_/g;
@@ -1650,7 +1664,7 @@ sub write_yaml
 	write_makefile();
 	write_changelog();
 
-	system("rm $name.spec");
+	system("rm $name.spec 2>/dev/null");
 	system("specify &> /dev/null");
 	if ($oscmode > 0) {
 	        system("osc addremove");
@@ -1659,6 +1673,65 @@ sub write_yaml
 
 }
 
+sub write_bbfile
+{
+	open(BBFILE, ">${name}_$version.bb");
+	print BBFILE "SUMMARY = \"$summary\"\n";
+	print BBFILE "DESCRIPTION = \"$description\"\n";
+
+	print BBFILE "LICENSE = \"@license\"\n";
+	print BBFILE "LIC_FILES_CHKSUM = \"";
+	foreach (keys %lic_files) {
+		print BBFILE "file://" . basename($_) . ";md5=$lic_files{$_} \\\n";
+	}
+	print BBFILE "\"\n\n";
+
+	if (@license <= 0) {
+		print "Can NOT get license from package itself.\n";
+		print "Please update the license and license file manually.\n";
+	}
+
+	if (@buildreqs > 0) {
+		my %saw;
+		my @out = grep(!$saw{$_}++,@buildreqs);
+		print BBFILE "DEPENDS = \"@out\"\n\n";
+	};
+
+	print BBFILE 'PR = "r0"' . "\n\n";
+	print BBFILE "SRC_URI = \"";
+	foreach (@sources) {
+		print BBFILE "$_ \\\n";
+	}
+	print BBFILE "\"\n\n";
+	print BBFILE "SRC_URI[md5sum] = \"$md5sum\"\n";
+	print BBFILE "SRC_URI[sha256sum] = \"$sha256sum\"\n";
+
+	if (@inherits) {
+		print BBFILE "inherit ";
+		foreach (@inherits) {
+			print BBFILE "$_ ";
+		}
+	}
+
+	close(BBFILE);
+
+	my $curdir = `pwd`;
+	chomp($curdir);
+	print "Create bb file: $curdir/${name}_$version.bb\n";
+}
+
+sub calculate_sums
+{
+    @_ = basename $dir;
+    my $md5output = `md5sum @_`;
+    $md5output =~ /^([a-zA-Z0-9]*) /;
+    $md5sum = $1;
+    chomp($md5sum);
+    my $sha256output = `sha256sum @_`;
+    $sha256output =~ /^([a-zA-Z0-9]*) /;
+    $sha256sum = $1;
+    chomp($sha256sum);
+}
 
 ############################################################################
 #
@@ -1696,33 +1769,40 @@ $dir = $ARGV[0];
 guess_name_from_url($dir);
 push(@sources, $dir);
 
-
 #system("cd $tmpdir; curl -s -O $dir");
 $orgdir = `pwd`;
 chomp($orgdir);
+my $outputdir = $name;
+if (! $name) {
+	$outputdir = basename $dir;
+}
+mkpath($outputdir);
+chdir($outputdir);
 print "Downloading package: $dir\n";
-system("wget --quiet $dir");
+system("wget --quiet $dir") == 0 or die "Download $dir failed.";
+
+calculate_sums($outputdir);
+
 print "Unpacking to       : $tmpdir\n";
 
-my @tgzfiles = <$orgdir/*.tgz>;
+my @tgzfiles = <$orgdir/$outputdir/*.tgz>;
 foreach (@tgzfiles) {
-        my $tgz = $_;
+        my $tgz = basename $_;
         my $tar = $tgz;
         $tar =~ s/tgz/tar\.gz/g;
         $dir =~ s/tgz/tar\.gz/g;
-        system("mv $tgz $tar");
+        system("mv $orgdir/$outputdir/$tgz $orgdir/$outputdir/$tar");
         guess_name_from_url($dir);
 }
 
-
 #
 # I really really hate the fact that meego deleted the -a option from tar.
 # this is a step backwards in time that is just silly.
 #
 
 
-system("cd $tmpdir; tar -jxf $orgdir/*\.tar\.bz2");
-system("cd $tmpdir; tar -zxf $orgdir/*\.tar\.gz");
+system("cd $tmpdir; tar -jxf $orgdir/$outputdir/*\.tar\.bz2 &>/dev/null");
+system("cd $tmpdir; tar -zxf $orgdir/$outputdir/*\.tar\.gz &>/dev/null");
 print "Parsing content    ....\n";
 my @dirs = <$tmpdir/*>;
 foreach (@dirs) {
@@ -1734,11 +1814,13 @@ $fulldir = $dir;
 if ( -e "$dir/autogen.sh" ) {
 	$configure = "autogen";
 	$uses_configure = 1;
+	push(@inherits, "autotools");
 }
 if ( -e "$dir/BUILD-CMAKE" ) {
 	$configure = "cmake";
 	push(@buildreqs, "cmake");
 	$uses_configure = 1;
+	push(@inherits, "cmake");
 }
 
 if ( -e "$dir/configure" ) {
@@ -1747,7 +1829,7 @@ if ( -e "$dir/configure" ) {
 
 my @files = <$dir/configure.*>;
 
-my $findoutput = `find $dir -name "configure.ac"`;
+my $findoutput = `find $dir -name "configure.ac" 2>/dev/null`;
 my @findlist = split(/\n/, $findoutput);
 foreach (@findlist) {
 	push(@files, $_);
@@ -1756,7 +1838,7 @@ foreach (@files) {
 	process_configure_ac("$_");
 }
 
-$findoutput = `find $dir -name "*.pro"`;
+$findoutput = `find $dir -name "*.pro" 2>/dev/null`;
 @findlist = split(/\n/, $findoutput);
 foreach (@findlist) {
 	process_qmake_pro("$_");
@@ -1765,6 +1847,7 @@ foreach (@findlist) {
 if (-e "$dir/$name.pro") {
         $builder = "qmake";
         push_pkgconfig_buildreq("Qt");
+	push(@inherits, "qmake2");
 }
 
 
@@ -1804,6 +1887,12 @@ foreach (@files) {
 
 guess_description($dir);
 
+#
+# Output of bbfile file
+#
+write_bbfile();
+chdir($orgdir);
+exit 0;
 
 #
 # Output of the yaml file
-- 
1.7.5.4



^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2012-04-26 15:47 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-26  8:10 [PATCH 0/2] Yocto 1656: rebase on autospectacle.pl Kang Kai
2012-04-26  8:10 ` [PATCH 1/2] autospectacle.pl: pull it from meego as a base Kang Kai
2012-04-26  8:10 ` [PATCH 2/2] autospectacle.pl: create recipe file Kang Kai
2012-04-26 15:47 ` [PATCH 0/2] Yocto 1656: rebase on autospectacle.pl Saul Wold
  -- strict thread matches above, loose matches on Subject: below --
2012-03-13  9:45 Kang Kai
2012-03-13  9:45 ` [PATCH 2/2] autospectacle.pl: create recipe file Kang Kai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.