@ISA
=
'Exporter'
;
@EXPORT_OK
=
qw(@src_generated %write_makefile_common)
;
use
vars
qw(@src_generated %write_makefile_common)
;
@src_generated
=
qw(
speedy_optdefs.h speedy_optdefs.c mod_speedycgi_cmds.c SpeedyCGI.pm
)
;
%write_makefile_common
= (
LINKTYPE
=>
' '
,
);
sub
init {
my
$class
=
shift
;
foreach
my
$method
(
qw(makeaperl postamble)
) {
eval
"package MY; sub $method { $class->$method(\@_); }"
;
}
return
$class
;
}
sub
pwd {
if
(!
defined
(
$pwd
)) {
$pwd
= `pwd`;
chop
$pwd
;
}
return
$pwd
;
}
sub
my_name {
my
$x
=
&pwd
;
$x
=~ s/.*\/speedy_([^\/]*)$/$1/;
return
$x
;
}
sub
my_name_full {
my
$class
=
shift
;
$class
->prefix .
$class
->my_name;
}
sub
prefix {
'speedy_'
}
sub
default_inc {
'perl'
}
sub
inc {
shift
->default_inc}
sub
main_file {
shift
->my_name_full .
'_main'
;
}
sub
main_file_full {
shift
->main_file;
}
sub
main_h {
shift
->main_file_full }
sub
src_files {
my
$class
=
shift
;
(
$class
->src_files_extra,
qw(
backend
file
frontend
group
ipc
optdefs
opt
poll
script
slot
util
)
,
);
}
sub
src_files_extra { (); }
sub
src_files_full {
my
$class
=
shift
;
(
$class
->main_file_full,
$class
->src_files_full_extra,
$class
->add_prefix(
$class
->prefix,
$class
->src_files),
);
}
sub
src_files_full_extra { (); }
sub
src_files_c {
my
$class
=
shift
;
(
$class
->add_suffix(
'.c'
,
$class
->src_files_full),
$class
->src_files_c_extra,
);
}
sub
src_files_c_extra { (); }
sub
src_files_o {
my
$class
=
shift
;
(
$class
->add_suffix(
'.o'
,
$class
->src_files_full),
$class
->src_files_o_extra,
);
}
sub
src_files_o_extra { (); }
sub
src_files_h {
my
$class
=
shift
;
$class
->add_suffix(
'.h'
,
$class
->src_files_full);
}
sub
allinc { (<../src/*.h>) }
sub
symlink_cmds {
my
$class
=
shift
;
return
join
(
''
,
map
{
sprintf
(
"%s: ../src/%s speedy.h\n\trm -f %s; ln -s ../src/%s %s\n\n"
,
(
$_
) x 5
);
}
@_
);
}
sub
symlink_c_files {
my
$class
=
shift
;
$class
->symlink_cmds(
$class
->src_files_c);
}
sub
speedy_h_cmds {
my
$class
=
shift
;
my
(
$pre
,
$inc
,
$main
) = (
$class
->prefix,
$class
->inc,
$class
->main_h
);
my
@files
= (
"${pre}inc_${inc}"
,
$main
,
"${pre}inc"
);
my
$echo_cmds
=
join
(
'; '
,
map
{
"echo '#include \"$_.h\"'"
}
@files
);
return
join
(
"\n"
,
''
,
'speedy.h: Makefile ../src/speedy_optdefs.h'
,
" ($echo_cmds) >speedy.h"
,
''
,
);
}
sub
optdefs_cmds {
my
(
$class
,
$dir
) =
@_
;
$dir
||=
'../src'
;
my
$gen
=
join
(
' '
,
map
{
"$dir/$_"
}
@src_generated
);
"
${gen}:
$dir
/Makefile
$dir
/SpeedyCGI_src.pm
cd
$dir
; \$(MAKE) SPEEDY_INSTALL_BIN=\$(INSTALLBIN)
$dir
/Makefile:
$dir
/Makefile.PL
cd ${dir}; \$(PERL) Makefile.PL
";
}
sub
write_makefile {
my
$class
=
shift
;
WriteMakefile(
NAME
=>
$class
->my_name_full,
MAP_TARGET
=>
$class
->my_name_full,
OBJECT
=>
join
(
' '
,
$class
->src_files_o),
INC
=>
'-I../src -I.'
,
VERSION_FROM
=>
'../src/SpeedyCGI_src.pm'
,
DEFINE
=>
"-DSPEEDY_PROGNAME=\\\""
.
$class
->my_name_full .
"\\\" -DSPEEDY_VERSION=\\\"\$(VERSION)\\\""
,
PM
=> {},
%write_makefile_common
);
}
sub
clean_files_full {
my
$class
=
shift
;
(
$class
->clean_files_full_extra,
$class
->src_files_full
);
}
sub
clean_files_full_extra { (); }
sub
clean_files_c {
my
$class
=
shift
;
$class
->add_suffix(
'.c'
,
$class
->clean_files_full);
}
sub
clean_files {
my
$class
=
shift
;
(
$class
->clean_files_c,
$class
->clean_files_extra
);
}
sub
clean_files_extra { (); }
sub
add_prefix {
my
(
$class
,
$pre
) = (
shift
,
shift
);
return
(
map
{
"$pre$_"
}
@_
);
}
sub
add_suffix {
my
(
$class
,
$suf
) = (
shift
,
shift
);
return
(
map
{
"$_$suf"
}
@_
);
}
sub
postamble {
my
$class
=
shift
;
my
$speedy_h
=
$class
->speedy_h_cmds;
my
$optdefs
=
$class
->optdefs_cmds;
my
$allinc
=
join
(
' '
,
$class
->allinc);
my
$c_file_link
=
$class
->symlink_c_files;
my
$clean_files
=
join
(
' '
,
$class
->clean_files);
my
$my_name
=
$class
->my_name_full;
my
$topdir
=
&pwd
;
$topdir
=~ s/\/[^\/]*$//;
"
FULLPERL = SPEEDY=${topdir}/speedy/speedy SPEEDY_BACKENDPROG=${topdir}/speedy_backend/speedy_backend \$(PERL)
$speedy_h
$c_file_link
$optdefs
\$(OBJECT) :
$allinc
clean ::
rm -f
$clean_files
speedy.h
$my_name
";
}
sub
get_ldopts {
&ExtUtils::Embed::ldopts
(
'-std'
);}
sub
get_ccopts {
&ExtUtils::Embed::ccopts
();}
sub
makeaperl {
my
$class
=
shift
;
my
$my_name
=
$class
->my_name_full;
my
$ldopts
=
$class
->get_ldopts;
"
all ::
$my_name
${my_name}: \$(OBJECT)
rm -f ${my_name}; \$(LD) -o ${my_name} \$(OBJECT)
$ldopts
&& ../util/check_syms && echo
''
";
}
1;