sub
fix {
my
(
$ROOT
) =
$_
[0] =~ /^CMAKE_BINARY_DIR\s*=\s*(.+)/m
or
return
;
Mpp::
log
LOAD_CMAKE
=>
$_
[1]
if
$Mpp::log_level
;
$ROOT
= path_file_info
$ROOT
;
my
$is_root
=
$ROOT
==
$_
[1]{
'..'
};
$_
[0] =~ s!^(default_target) *:
*all
\n\.PHONY *: *\1!\$(phony $1):all\nload_makefile
$ROOT
->{FULLNAME}/Makefile!m
unless
$is_root
||
$ROOT
->{ROOT} ||
$_
[1]{NAME} ne
'Makefile'
;
$_
[0] =
join
"\n"
,
map
/:.*\n\t/ ? (
$is_root
?
&fix_rule
: /\Acmake_check_build_system:/ ?
''
:
&fix_rule
) :
$_
,
split
/\n(?![\t])/,
$_
[0];
if
(
$is_root
) {
$ROOT
->{ROOT} =
$ROOT
;
undef
$_
[1]{
'..'
}{xNO_IMPLICIT_LOAD};
$_
[0] .= '
prebuild cmake_check_build_system
include CMakeFiles/Makefile2
load_makefile
' . join '
', zglob '
*/**/build.make
', $_[1]{'
..'};
}
elsif
(
$_
[1]{NAME} eq
'build.make'
) {
$_
[1]{
'..'
}{MAKEINFO}{CWD} =
$ROOT
;
}
}
sub
fix_rule {
s/:\s
*cmake_check_build_system
/:/;
s/\A(.*?): *(.*)\n\t//m;
my
(
$output
,
$deps
,
@deps
) = ($1, $2);
my
@cmds
=
split
"\n\t"
;
my
$empty
= 0;
for
(
my
$i
= 0;
$i
<
@cmds
; ) {
if
(
$cmds
[
$i
] =~ /^\$\(MAKE\) -f .+ (.+)/ ) {
push
@deps
, $1
if
$1 ne
$output
;
splice
@cmds
,
$i
, 1;
++
$empty
;
}
elsif
(
$cmds
[
$i
] =~ /^cd (.+?) *&& *\$\(MAKE\) -f .+ (.+)/ ) {
my
$dep
= relative_filename path_file_info(
"$1/$2"
,
$_
[1]{
'..'
} ),
$_
[1]{
'..'
};
push
@deps
,
$dep
if
$dep
ne
$output
;
splice
@cmds
,
$i
, 1;
++
$empty
;
}
elsif
(
$cmds
[
$i
] =~ /\$\(CMAKE_COMMAND\) -E cmake_(?:depends|progress_(?:start|report)) / ) {
splice
@cmds
,
$i
, 1;
++
$empty
;
}
else
{
++
$i
;
}
}
$deps
.=
" $deps[-1]"
if
@deps
;
if
(
$deps
||
@cmds
) {
$_
=
join
"\n\t"
,
"$output:$deps"
,
@cmds
;
}
else
{
$_
=
''
;
}
while
(
@deps
> 1 ) {
$_
.=
"\n"
.
pop
@deps
;
$_
.=
":$deps[-1]"
;
--
$empty
;
}
$_
.=
"\n"
x
$empty
;
$_
;
}
1;