public
Last active

This simple script traverses the firebird/flamerobin sources and creates (incomplete) *.pro files in order to make the haiku sources available within the qt-creator IDE. Additionally, it will add those files to svn:ignore of their parent directory (unless

  • Download Gist
create_project_files.pl
Perl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
#!/usr/bin/perl
 
use warnings;
use strict;
 
=head1 create_project_files.pl
 
This simple script traverses the haiku sources and creates (incomplete) *.pro
files in order to make the haiku sources available within the qt-creator IDE.
Additionally, it will add those files to svn:ignore of their parent directory
(unless already contained there).
 
=cut
 
use File::Basename;
use File::Find;
 
if (!@ARGV) {
die "usage: $0 <haiku-top-path>\n";
}
 
my $haikuTop = shift @ARGV;
#if (!-e "$haikuTop/ReadMe.cross-compile") {
# die "'$haikuTop/ReadMe.cross-compile' not found - not a haiku top!\n";
#}
 
my %collection;
 
print "scanning ...\n";
find({ wanted => \&process, no_chdir => 1},
("$haikuTop/headers", "$haikuTop/src"));
 
writeProFile("$haikuTop/haiku.pro", { subdirs => ['headers', 'src'] });
foreach my $dir (sort keys %collection) {
my $proFile = $dir.'/'.fileparse($dir).'.pro';
writeProFile($proFile, $collection{$dir});
}
 
sub process
{
if (substr($_, -4, 4) eq '.svn') {
$File::Find::prune = 1;
} else {
return if $File::Find::dir eq $_; # skip toplevel folders
my $name = (fileparse($_))[0];
if (-d $_) {
$collection{$File::Find::dir}->{subdirs} ||= [];
push @{$collection{$File::Find::dir}->{subdirs}}, $name;
return;
}
elsif ($_ =~ m{\.(h|hpp)$}i) {
$collection{$File::Find::dir}->{headers} ||= [];
push @{$collection{$File::Find::dir}->{headers}}, $name;
}
elsif ($_ =~ m{\.(c|cc|cpp|s|asm)$}i) {
$collection{$File::Find::dir}->{sources} ||= [];
push @{$collection{$File::Find::dir}->{sources}}, $name;
}
}
}
 
sub writeProFile
{
my ($proFile, $info) = @_;
return if !$info;
print "creating $proFile\n";
open(my $proFileFH, '>', $proFile)
or die "unable to write $proFile";
print $proFileFH "TEMPLATE = subdirs\n";
print $proFileFH "CONFIG += ordered\n";
if (exists $info->{subdirs}) {
print $proFileFH
"SUBDIRS = ".join(" \\\n\t", sort @{$info->{subdirs}})."\n";
}
if (exists $info->{headers}) {
print $proFileFH
"HEADERS = ".join(" \\\n\t", sort @{$info->{headers}})."\n";
}
if (exists $info->{sources}) {
print $proFileFH
"SOURCES = ".join(" \\\n\t", sort @{$info->{sources}})."\n";
}
close $proFileFH;
updateSvnIgnore($proFile);
}
 
sub updateSvnIgnore
{
my $proFile = shift;
 
my ($filename, $parentDir) = fileparse($proFile);
 
my $svnIgnore = qx{svn propget --strict svn:ignore $parentDir};
if (!grep { $_ eq $filename } split "\n", $svnIgnore) {
chomp $svnIgnore;
$svnIgnore .= "\n" unless !$svnIgnore;
$svnIgnore .= "$filename\n";
open(my $propsetFH, "|svn propset svn:ignore --file - $parentDir")
or die "unable to open pipe to 'svn propset'";
print $propsetFH $svnIgnore;
close($propsetFH);
}
}

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.