Build separate Perl binaries with make
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/bb7ae3b6 Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/bb7ae3b6 Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/bb7ae3b6 Branch: refs/heads/master Commit: bb7ae3b6669e8b00ae6a337df5f43044eca5e9b9 Parents: b57bd0a Author: Nick Wellnhofer <[email protected]> Authored: Fri Jul 8 19:04:44 2016 +0200 Committer: Nick Wellnhofer <[email protected]> Committed: Mon Jul 11 15:07:59 2016 +0200 ---------------------------------------------------------------------- common/charmonizer.c | 32 ++++++++++--- common/charmonizer.main | 32 ++++++++++--- devel/bin/travis-test.sh | 6 ++- perl/.gitignore | 3 ++ perl/Build.PL | 50 ++++++-------------- perl/buildlib/Lucy/Build.pm | 67 +++------------------------ perl/buildlib/Lucy/Build/Binding/Misc.pm | 2 +- perl/lib/Lucy/Test.pm | 8 ++++ perl/xs/Lucy/Analysis/RegexTokenizer.c | 1 + perl/xs/Lucy/Document/Doc.c | 1 + perl/xs/Lucy/Index/DocReader.c | 1 + perl/xs/Lucy/Index/Inverter.c | 1 + 12 files changed, 93 insertions(+), 111 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/bb7ae3b6/common/charmonizer.c ---------------------------------------------------------------------- diff --git a/common/charmonizer.c b/common/charmonizer.c index 3bcf930..04778e2 100644 --- a/common/charmonizer.c +++ b/common/charmonizer.c @@ -8771,6 +8771,7 @@ S_add_compiler_flags(struct chaz_CLI *cli) { static lucy_MakeFile* lucy_MakeFile_new(chaz_CLI *cli) { const char *dir_sep = chaz_OS_dir_sep(); + const char *host = chaz_CLI_strval(cli, "host"); const char *cfish_prefix = chaz_CLI_strval(cli, "clownfish-prefix"); char *cfcore_filename = chaz_Util_join(dir_sep, "cfcore", "Lucy.cfp", NULL); @@ -8792,15 +8793,15 @@ lucy_MakeFile_new(chaz_CLI *cli) { self->core_dir = chaz_Util_join(dir_sep, self->base_dir, "core", NULL); self->test_dir = chaz_Util_join(dir_sep, self->base_dir, "test", NULL); } - if (chaz_CLI_defined(cli, "enable-perl")) { - self->host_src_dir = "xs"; - } - else if (chaz_CLI_defined(cli, "enable-go")) { + if (strcmp(host, "go") == 0) { self->host_src_dir = "cfext"; } - else { + else if (strcmp(host, "c") == 0) { self->host_src_dir = "src"; } + else { + self->host_src_dir = NULL; + } self->autogen_src_dir = chaz_Util_join(dir_sep, "autogen", "source", NULL); self->autogen_inc_dir = chaz_Util_join(dir_sep, "autogen", "include", NULL); @@ -8973,7 +8974,9 @@ lucy_MakeFile_write(lucy_MakeFile *self) { } } - chaz_MakeBinary_add_src_dir(self->lib, self->host_src_dir); + if (self->host_src_dir != NULL) { + chaz_MakeBinary_add_src_dir(self->lib, self->host_src_dir); + } chaz_MakeBinary_add_src_dir(self->lib, self->core_dir); chaz_MakeBinary_add_src_dir(self->lib, self->snowstem_dir); chaz_MakeBinary_add_src_dir(self->lib, self->snowstop_dir); @@ -9059,6 +9062,23 @@ lucy_MakeFile_write(lucy_MakeFile *self) { lucy_MakeFile_write_c_test_rules(self); } + /* Targets to compile object files for Perl. */ + if (strcmp(host, "perl") == 0) { + char *objects; + + chaz_MakeFile_add_rule(self->makefile, "core_objects", + "$(LUCY_SHARED_LIB_OBJS)"); + objects = chaz_MakeBinary_obj_string(self->lib); + chaz_ConfWriter_add_def("CORE_OBJECTS", objects); + free(objects); + + chaz_MakeFile_add_rule(self->makefile, "test_objects", + "$(TESTLUCY_SHARED_LIB_OBJS)"); + objects = chaz_MakeBinary_obj_string(self->test_lib); + chaz_ConfWriter_add_def("TEST_OBJECTS", objects); + free(objects); + } + chaz_MakeFile_write(self->makefile); } http://git-wip-us.apache.org/repos/asf/lucy/blob/bb7ae3b6/common/charmonizer.main ---------------------------------------------------------------------- diff --git a/common/charmonizer.main b/common/charmonizer.main index f6bab2f..ccf9d4d 100644 --- a/common/charmonizer.main +++ b/common/charmonizer.main @@ -223,6 +223,7 @@ S_add_compiler_flags(struct chaz_CLI *cli) { static lucy_MakeFile* lucy_MakeFile_new(chaz_CLI *cli) { const char *dir_sep = chaz_OS_dir_sep(); + const char *host = chaz_CLI_strval(cli, "host"); const char *cfish_prefix = chaz_CLI_strval(cli, "clownfish-prefix"); char *cfcore_filename = chaz_Util_join(dir_sep, "cfcore", "Lucy.cfp", NULL); @@ -244,15 +245,15 @@ lucy_MakeFile_new(chaz_CLI *cli) { self->core_dir = chaz_Util_join(dir_sep, self->base_dir, "core", NULL); self->test_dir = chaz_Util_join(dir_sep, self->base_dir, "test", NULL); } - if (chaz_CLI_defined(cli, "enable-perl")) { - self->host_src_dir = "xs"; - } - else if (chaz_CLI_defined(cli, "enable-go")) { + if (strcmp(host, "go") == 0) { self->host_src_dir = "cfext"; } - else { + else if (strcmp(host, "c") == 0) { self->host_src_dir = "src"; } + else { + self->host_src_dir = NULL; + } self->autogen_src_dir = chaz_Util_join(dir_sep, "autogen", "source", NULL); self->autogen_inc_dir = chaz_Util_join(dir_sep, "autogen", "include", NULL); @@ -425,7 +426,9 @@ lucy_MakeFile_write(lucy_MakeFile *self) { } } - chaz_MakeBinary_add_src_dir(self->lib, self->host_src_dir); + if (self->host_src_dir != NULL) { + chaz_MakeBinary_add_src_dir(self->lib, self->host_src_dir); + } chaz_MakeBinary_add_src_dir(self->lib, self->core_dir); chaz_MakeBinary_add_src_dir(self->lib, self->snowstem_dir); chaz_MakeBinary_add_src_dir(self->lib, self->snowstop_dir); @@ -511,6 +514,23 @@ lucy_MakeFile_write(lucy_MakeFile *self) { lucy_MakeFile_write_c_test_rules(self); } + /* Targets to compile object files for Perl. */ + if (strcmp(host, "perl") == 0) { + char *objects; + + chaz_MakeFile_add_rule(self->makefile, "core_objects", + "$(LUCY_SHARED_LIB_OBJS)"); + objects = chaz_MakeBinary_obj_string(self->lib); + chaz_ConfWriter_add_def("CORE_OBJECTS", objects); + free(objects); + + chaz_MakeFile_add_rule(self->makefile, "test_objects", + "$(TESTLUCY_SHARED_LIB_OBJS)"); + objects = chaz_MakeBinary_obj_string(self->test_lib); + chaz_ConfWriter_add_def("TEST_OBJECTS", objects); + free(objects); + } + chaz_MakeFile_write(self->makefile); } http://git-wip-us.apache.org/repos/asf/lucy/blob/bb7ae3b6/devel/bin/travis-test.sh ---------------------------------------------------------------------- diff --git a/devel/bin/travis-test.sh b/devel/bin/travis-test.sh index 6f245d8..4e07247 100755 --- a/devel/bin/travis-test.sh +++ b/devel/bin/travis-test.sh @@ -49,10 +49,12 @@ test_perl() { export PERL5LIB="$install_dir/lib/perl5" # Install Clownfish. - cd lucy-clownfish/runtime/perl + cd lucy-clownfish/compiler/perl + cpanm --quiet --installdeps --notest . perl Build.PL ./Build install --install-base "$install_dir" - cd ../../compiler/perl + cd ../../runtime/perl + perl Build.PL ./Build install --install-base "$install_dir" cd ../../../perl http://git-wip-us.apache.org/repos/asf/lucy/blob/bb7ae3b6/perl/.gitignore ---------------------------------------------------------------------- diff --git a/perl/.gitignore b/perl/.gitignore index bcd7739..83fd141 100644 --- a/perl/.gitignore +++ b/perl/.gitignore @@ -4,6 +4,7 @@ /Charmony.pm /MYMETA.json /MYMETA.yml +/Makefile /_build/ /autogen/ /blib/ @@ -13,6 +14,8 @@ /charmony.h /lib/Lucy.c /lib/Lucy.xs +/lib/Lucy/Test.c +/lib/Lucy/Test.xs /ppport.h /typemap http://git-wip-us.apache.org/repos/asf/lucy/blob/bb7ae3b6/perl/Build.PL ---------------------------------------------------------------------- diff --git a/perl/Build.PL b/perl/Build.PL index a057f9b..d9d93a5 100644 --- a/perl/Build.PL +++ b/perl/Build.PL @@ -17,34 +17,20 @@ use 5.008003; use strict; use warnings; use lib 'buildlib'; -use File::Spec::Functions qw( catdir ); +use File::Spec::Functions qw( catdir updir ); use Lucy::Build; my $IS_CPAN_DIST = -e 'cfcore'; -my @BASE_PATH = Lucy::Build->cf_base_path; my $CORE_SOURCE_DIR; my $TEST_SOURCE_DIR; -my $MODULES_DIR; if ($IS_CPAN_DIST) { $CORE_SOURCE_DIR = 'cfcore'; $TEST_SOURCE_DIR = 'cftest'; - $MODULES_DIR = 'modules'; } else { - $CORE_SOURCE_DIR = catdir( @BASE_PATH, 'core' ); - $TEST_SOURCE_DIR = catdir( @BASE_PATH, 'test' ); - $MODULES_DIR = catdir( @BASE_PATH, 'modules' ); + $CORE_SOURCE_DIR = catdir( updir(), 'core' ); + $TEST_SOURCE_DIR = catdir( updir(), 'test' ); } -my $SNOWSTEM_SRC_DIR = catdir( $MODULES_DIR, qw( analysis snowstem source ) ); -my $SNOWSTEM_INC_DIR = catdir( $SNOWSTEM_SRC_DIR, 'include' ); -my $SNOWSTOP_SRC_DIR = catdir( $MODULES_DIR, qw( analysis snowstop source ) ); -my $UCD_INC_DIR = catdir( $MODULES_DIR, qw( unicode ucd ) ); -my $UTF8PROC_SRC_DIR = catdir( $MODULES_DIR, qw( unicode utf8proc ) ); -my $XS_SOURCE_DIR = 'xs'; - -my @cf_linker_flags = Clownfish::CFC::Perl::Build->cf_linker_flags( - 'Clownfish', -); my $builder = Lucy::Build->new( module_name => 'Lucy', @@ -64,7 +50,7 @@ my $builder = Lucy::Build->new( build_requires => { 'Module::Build' => 0.280801, 'ExtUtils::CBuilder' => 0.21, - 'ExtUtils::ParseXS' => 2.18, + 'ExtUtils::ParseXS' => 3.00, 'Devel::PPPort' => 3.14, 'Clownfish' => 0.005000, 'Clownfish::CFC' => 0.005000, @@ -77,31 +63,25 @@ my $builder = Lucy::Build->new( bugtracker => 'https://issues.apache.org/jira/browse/LUCY', }, }, - include_dirs => [ - $CORE_SOURCE_DIR, - $XS_SOURCE_DIR, - $SNOWSTEM_INC_DIR, - $UCD_INC_DIR, - $UTF8PROC_SRC_DIR, - ], + include_dirs => [ $CORE_SOURCE_DIR ], clownfish_params => { source => [ $CORE_SOURCE_DIR, $TEST_SOURCE_DIR ], modules => [ { name => 'Lucy', - parcels => [ 'Lucy', 'TestLucy' ], - c_source_dirs => [ - $CORE_SOURCE_DIR, - $TEST_SOURCE_DIR, - $XS_SOURCE_DIR, - $SNOWSTEM_SRC_DIR, - $SNOWSTOP_SRC_DIR, - $UTF8PROC_SRC_DIR, - ], + parcels => [ 'Lucy' ], + make_target => 'core_objects', + c_source_dirs => [ 'xs' ], + xs_prereqs => [ 'Clownfish' ], + }, + { + name => 'Lucy::Test', + parcels => [ 'TestLucy' ], + make_target => 'test_objects', + xs_prereqs => [ 'Lucy', 'Clownfish' ], }, ], }, - extra_linker_flags => [ @cf_linker_flags ], add_to_cleanup => [ qw( Lucy-* http://git-wip-us.apache.org/repos/asf/lucy/blob/bb7ae3b6/perl/buildlib/Lucy/Build.pm ---------------------------------------------------------------------- diff --git a/perl/buildlib/Lucy/Build.pm b/perl/buildlib/Lucy/Build.pm index f128145..8ddc912 100644 --- a/perl/buildlib/Lucy/Build.pm +++ b/perl/buildlib/Lucy/Build.pm @@ -25,27 +25,21 @@ use base qw( our $VERSION = '0.005000'; $VERSION = eval $VERSION; -use File::Spec::Functions qw( catdir catfile rel2abs ); +use File::Spec::Functions qw( catdir catfile rel2abs updir ); use File::Path qw( rmtree ); use File::Copy qw( move ); use Config; use Carp; use Cwd qw( getcwd ); -my @BASE_PATH = __PACKAGE__->cf_base_path; - -my $COMMON_SOURCE_DIR = catdir( @BASE_PATH, 'common' ); -my $LEMON_DIR = catdir( @BASE_PATH, 'lemon' ); -my $LEMON_EXE_PATH = catfile( $LEMON_DIR, "lemon$Config{_exe}" ); -my $CORE_SOURCE_DIR = catdir( @BASE_PATH, 'core' ); -my $LIB_DIR = 'lib'; -my $IS_CPAN_DIST = !@BASE_PATH; +my $LIB_DIR = 'lib'; +my $IS_CPAN_DIST = -e 'cfcore'; my $CHARMONIZER_C; if ($IS_CPAN_DIST) { $CHARMONIZER_C = 'charmonizer.c'; } else { - $CHARMONIZER_C = catfile( $COMMON_SOURCE_DIR, 'charmonizer.c' ); + $CHARMONIZER_C = catfile( updir(), 'common', 'charmonizer.c' ); } sub new { @@ -68,6 +62,7 @@ sub new { $self->config( optimize => $optimize ); } + $self->charmonizer_params( create_makefile => 1 ); $self->charmonizer_params( charmonizer_c => $CHARMONIZER_C ); $self->clownfish_params( autogen_header => $self->autogen_header ); @@ -75,34 +70,6 @@ sub new { return $self; } -sub _run_make { - my ( $self, %params ) = @_; - my @command = @{ $params{args} }; - my $dir = $params{dir}; - my $current_directory = getcwd(); - chdir $dir if $dir; - unshift @command, 'CC=' . $self->config('cc'); - if ( $self->config('cc') =~ /^cl\b/ ) { - unshift @command, "-f", "Makefile.MSVC"; - } - elsif ( $^O =~ /mswin/i ) { - unshift @command, "-f", "Makefile.MinGW"; - } - unshift @command, "$Config{make}"; - system(@command) and confess("$Config{make} failed"); - chdir $current_directory if $dir; -} - -# Build the Lemon parser generator. -sub ACTION_lemon { - my $self = shift; - print "Building the Lemon parser generator...\n\n"; - $self->_run_make( - dir => $LEMON_DIR, - args => [], - ); -} - sub ACTION_copy_clownfish_includes { my $self = shift; @@ -191,22 +158,6 @@ sub ACTION_test_valgrind { } } -# Run all .y files through lemon. -sub ACTION_parsers { - my $self = shift; - $self->depends_on('lemon'); - my $y_files = $self->rscan_dir( $CORE_SOURCE_DIR, qr/\.y$/ ); - for my $y_file (@$y_files) { - my $c_file = $y_file; - my $h_file = $y_file; - $c_file =~ s/\.y$/.c/ or die "no match"; - $h_file =~ s/\.y$/.h/ or die "no match"; - next if $self->up_to_date( $y_file, [ $c_file, $h_file ] ); - $self->add_to_cleanup( $c_file, $h_file ); - system( $LEMON_EXE_PATH, '-q', $y_file ) and die "lemon failed"; - } -} - sub ACTION_clownfish { my $self = shift; @@ -219,7 +170,7 @@ sub ACTION_clownfish { sub ACTION_compile_custom_xs { my $self = shift; - $self->depends_on(qw( parsers charmony )); + $self->depends_on(qw( charmony )); # Add extra compiler flags from Charmonizer. my $charm_cflags = $self->charmony('EXTRA_CFLAGS'); @@ -396,12 +347,6 @@ sub ACTION_semiclean { } } -sub ACTION_clean { - my $self = shift; - $self->_run_make( dir => $LEMON_DIR, args => ['clean'] ); - $self->SUPER::ACTION_clean; -} - 1; __END__ http://git-wip-us.apache.org/repos/asf/lucy/blob/bb7ae3b6/perl/buildlib/Lucy/Build/Binding/Misc.pm ---------------------------------------------------------------------- diff --git a/perl/buildlib/Lucy/Build/Binding/Misc.pm b/perl/buildlib/Lucy/Build/Binding/Misc.pm index 11b14a6..b4bb516 100644 --- a/perl/buildlib/Lucy/Build/Binding/Misc.pm +++ b/perl/buildlib/Lucy/Build/Binding/Misc.pm @@ -232,7 +232,7 @@ END_XS_CODE sub bind_test { my $xs_code = <<'END_XS_CODE'; -MODULE = Lucy PACKAGE = Lucy::Test +MODULE = Lucy::Test PACKAGE = Lucy::Test #include "Clownfish/TestHarness/TestFormatter.h" #include "Clownfish/TestHarness/TestSuite.h" http://git-wip-us.apache.org/repos/asf/lucy/blob/bb7ae3b6/perl/lib/Lucy/Test.pm ---------------------------------------------------------------------- diff --git a/perl/lib/Lucy/Test.pm b/perl/lib/Lucy/Test.pm index ab06d11..e84161f 100644 --- a/perl/lib/Lucy/Test.pm +++ b/perl/lib/Lucy/Test.pm @@ -18,6 +18,14 @@ use Lucy; our $VERSION = '0.005000'; $VERSION = eval $VERSION; +sub dl_load_flags { 1 } + +BEGIN { + require DynaLoader; + our @ISA = qw( DynaLoader ); + bootstrap Lucy::Test '0.5.0'; +} + # Set the default memory threshold for PostingListWriter to a low number so # that we simulate large indexes by performing a lot of PostingPool flushes. Lucy::Index::PostingListWriter::set_default_mem_thresh(0x1000); http://git-wip-us.apache.org/repos/asf/lucy/blob/bb7ae3b6/perl/xs/Lucy/Analysis/RegexTokenizer.c ---------------------------------------------------------------------- diff --git a/perl/xs/Lucy/Analysis/RegexTokenizer.c b/perl/xs/Lucy/Analysis/RegexTokenizer.c index 9a3fcc6..408acf1 100644 --- a/perl/xs/Lucy/Analysis/RegexTokenizer.c +++ b/perl/xs/Lucy/Analysis/RegexTokenizer.c @@ -14,6 +14,7 @@ * limitations under the License. */ +#define CFP_LUCY #define C_LUCY_REGEXTOKENIZER #define C_LUCY_TOKEN #include "XSBind.h" http://git-wip-us.apache.org/repos/asf/lucy/blob/bb7ae3b6/perl/xs/Lucy/Document/Doc.c ---------------------------------------------------------------------- diff --git a/perl/xs/Lucy/Document/Doc.c b/perl/xs/Lucy/Document/Doc.c index a923e25..6bbc326 100644 --- a/perl/xs/Lucy/Document/Doc.c +++ b/perl/xs/Lucy/Document/Doc.c @@ -14,6 +14,7 @@ * limitations under the License. */ +#define CFP_LUCY #define C_LUCY_DOC #include "XSBind.h" #include "Lucy/Document/Doc.h" http://git-wip-us.apache.org/repos/asf/lucy/blob/bb7ae3b6/perl/xs/Lucy/Index/DocReader.c ---------------------------------------------------------------------- diff --git a/perl/xs/Lucy/Index/DocReader.c b/perl/xs/Lucy/Index/DocReader.c index 7daf909..15130ac 100644 --- a/perl/xs/Lucy/Index/DocReader.c +++ b/perl/xs/Lucy/Index/DocReader.c @@ -14,6 +14,7 @@ * limitations under the License. */ +#define CFP_LUCY #define C_LUCY_DOCREADER #define C_LUCY_DEFAULTDOCREADER #include "XSBind.h" http://git-wip-us.apache.org/repos/asf/lucy/blob/bb7ae3b6/perl/xs/Lucy/Index/Inverter.c ---------------------------------------------------------------------- diff --git a/perl/xs/Lucy/Index/Inverter.c b/perl/xs/Lucy/Index/Inverter.c index eed3a66..28c8e90 100644 --- a/perl/xs/Lucy/Index/Inverter.c +++ b/perl/xs/Lucy/Index/Inverter.c @@ -14,6 +14,7 @@ * limitations under the License. */ +#define CFP_LUCY #define C_LUCY_INVERTER #define C_LUCY_INVERTERENTRY #include "XSBind.h"
