#!/usr/bin/perl
my
$VERSION
= 0.20;
die
usage()
if
!
@ARGV
||
$ARGV
[0] =~ /--help/;
my
%opts
= Get_Options();
die
usage()
if
$opts
{
'h'
};
my
$dependencies
= Get_Dependencies(
@ARGV
);
unless
(
$opts
{
'f'
})
{
print
$dependencies
;
exit
;
}
my
$makefile_name
= Get_Makefile_Name();
my
$makefile_text
= read_text(
$makefile_name
,
undef
, 1);
$makefile_text
= Remove_Old_Dependencies(
$makefile_text
)
unless
$opts
{
'a'
};
if
(
$opts
{
'r'
})
{
write_text(
$makefile_name
,
$makefile_text
,
undef
, 1);
exit
;
}
Back_Up_Makefile(
$makefile_name
)
unless
$opts
{
'B'
};
$makefile_text
= Add_Dependencies(
$makefile_text
,
$dependencies
);
write_text(
$makefile_name
,
$makefile_text
,
undef
, 1);
exit
;
sub
usage
{
<<" EOF";
usage: $0 [FLAGS] -- <g++ compile line with -M flag, but no -o flag>
-a Append dependencies to makefile
-r Just remove dependencies from makefile and exit
-f Specify makefile name
-B Suppress backup file
If -f is not specified, output is printed to standard output.
EOF
}
sub
Get_Dependencies
{
my
@commands
=
@_
;
my
$dependencies
= `
@commands
`;
if
($?) {
warn
"$0: compiler command failed"
;
exit
1;
}
if
(
$dependencies
!~ /^.*:/)
{
my
(
$output_filename
) =
"@commands"
=~ /-o (\S+)/;
my
$dependencies
= read_text(
$output_filename
,
undef
, 1);
unlink
$output_filename
;
$dependencies
=~ s/(.*?)(\s*:)/
$output_filename
$2/;
}
return
$dependencies
;
}
sub
Get_Options
{
my
%opts
;
$opts
{
'a'
} =
$opts
{
'r'
} =
$opts
{
'B'
} = 0;
getopt(
'f'
,\
%opts
);
return
%opts
;
}
sub
Get_Makefile_Name
{
my
$makefile_name
;
if
(
defined
$opts
{
'f'
})
{
$makefile_name
=
$opts
{
'f'
};
}
else
{
$makefile_name
=
-e
'GNUMakefile'
?
'GNUMakefile'
: -e
'makefile'
?
'makefile'
: -e
'Makefile'
?
'Makefile'
:
undef
;
}
die
"Couldn't find makefile named \"$makefile_name\"!\n"
unless
-e
$makefile_name
;
return
$makefile_name
}
sub
Back_Up_Makefile
{
my
$makefile_name
=
shift
;
if
(-e
"$makefile_name.bak"
)
{
unlink
"$makefile_name.bak"
or
die
"Couldn't remove $makefile_name.bak: $!\n"
;
}
system
(
"cp $makefile_name $makefile_name.bak"
) == 0
or
die
"Couldn't copy $makefile_name to $makefile_name.bak: $!\n"
;
}
sub
Remove_Old_Dependencies
{
my
$makefile_text
=
shift
;
$makefile_text
=~ s/\s*\n
return
$makefile_text
;
}
sub
Add_Dependencies
{
my
$makefile_text
=
shift
;
my
$dependencies
=
shift
;
$makefile_text
.=
"\n# DO NOT DELETE\n"
unless
$makefile_text
=~ /\n
$makefile_text
.=
"\n$dependencies"
;
return
$makefile_text
;
}