-
Notifications
You must be signed in to change notification settings - Fork 2
/
vs_postclean.pl
executable file
·102 lines (86 loc) · 2.54 KB
/
vs_postclean.pl
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
eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}'
& eval 'exec perl -w -S $0 $argv:q'
if 0;
# ******************************************************************
# Author: Chad Elliott
# Date: 7/10/2008
# Description: Visual Studio doesn't support a post clean build step,
# so this script will do it.
# $Id$
# ******************************************************************
# ******************************************************************
# Pragma Section
# ******************************************************************
use strict;
use FileHandle;
use File::Basename;
# ******************************************************************
# Data Section
# ******************************************************************
my $version = '1.0';
# ******************************************************************
# Subroutine Section
# ******************************************************************
sub read_proj {
my($cfg, $file) = @_;
my $fh = new FileHandle();
my $cmd;
if (open($fh, $file)) {
my $cfg_ok;
my $next_name;
my $next_command;
while(<$fh>) {
## Locate the start of a Configuration section
if (/<Configuration\s*$/) {
$next_name = 1;
}
## Next, find the configuration name
elsif ($next_name && /Name="(.+)"/) {
$cfg_ok = ($1 eq $cfg);
$next_name = undef;
}
## Next, find the post clean event
elsif ($cfg_ok && /Name="VCPostCleanEventTool"/) {
$next_command = 1;
}
## And finally, get the postclean command line
elsif ($next_command && /CommandLine="(.+)"/) {
$cmd = $1;
last;
}
}
close($fh);
}
## Return the command line (undef if there was no postclean)
return $cmd;
}
sub clean_proj {
my($cfg, $file) = @_;
## Read the postclean command from the project
my $cmd = read_proj($cfg, $file);
## Move to the directory of the project and run the command
if (defined $cmd) {
if (chdir(dirname($file))) {
system($cmd);
}
else {
print "WARNING: Unable to postclean $file\n";
}
}
}
# ******************************************************************
# Main Section
# ******************************************************************
if ($#ARGV == -1) {
print "PostClean v$version\n",
"Usage: ", basename($0), " [CFG=<configuration>] <project files>\n";
exit(0);
}
my $cfg = 'Debug|Win32';
if ($ARGV[0] =~ /^CFG=(.+)/) {
$cfg = $1;
shift(@ARGV);
}
foreach my $file (@ARGV) {
clean_proj($cfg, $file);
}