It's not just a build or update system, it's both, so it goes to toplevel.wilder
parent
e60a7012f5
commit
83d8fa8f5f
3 changed files with 227 additions and 222 deletions
@ -0,0 +1,222 @@ |
||||
package ksb::l10nSystem; |
||||
|
||||
# This class is an implementation of both the source and build interfaces needed to |
||||
# support building KDE l10n modules. |
||||
|
||||
use strict; |
||||
use warnings; |
||||
use v5.10; |
||||
|
||||
use ksb::Debug; |
||||
use ksb::Util; |
||||
use ksb::Updater::Svn; |
||||
use ksb::BuildSystem; |
||||
|
||||
our @ISA = ('ksb::Updater::Svn', 'ksb::BuildSystem'); |
||||
|
||||
sub new |
||||
{ |
||||
my ($class, $module) = @_; |
||||
|
||||
# Ensure associated module updates from the proper svn path. |
||||
# TODO: Support different localization branches? |
||||
|
||||
$module->setOption('module-base-path', 'trunk/l10n-kde4'); |
||||
return bless { module => $module, needsRefreshed => 1 }, $class; |
||||
} |
||||
|
||||
sub module |
||||
{ |
||||
my $self = shift; |
||||
return $self->{module}; |
||||
} |
||||
|
||||
sub configuredModuleFileName |
||||
{ |
||||
# Not quite correct (we should be looking at each individual language |
||||
# but it at least keeps the process going. |
||||
return 'teamnames'; |
||||
} |
||||
|
||||
# Sets the directories that are to be checked out/built/etc. |
||||
# There should be one l10nSystem for the entire l10n build (i.e. add |
||||
# all required support dirs and languages). |
||||
sub setLanguageDirs |
||||
{ |
||||
my ($self, @languageDirs) = @_; |
||||
$self->{l10n_dirs} = \@languageDirs; |
||||
} |
||||
|
||||
# Returns true if the given subdirectory (reference from the module's root source directory) |
||||
# can be built or not. Should be reimplemented by subclasses as appropriate. |
||||
sub isSubdirBuildable |
||||
{ |
||||
my ($self, $subdir) = @_; |
||||
return ($subdir ne 'scripts' && $subdir ne 'templates'); |
||||
} |
||||
|
||||
sub prefixEnvironmentVariable |
||||
{ |
||||
return 'CMAKE_PREFIX_PATH'; |
||||
} |
||||
|
||||
# scm-specific update procedure. |
||||
# May change the current directory as necessary. |
||||
sub updateInternal |
||||
{ |
||||
my $self = assert_isa(shift, 'ksb::Updater'); |
||||
my $module = $self->module(); |
||||
my $fullpath = $module->fullpath('source'); |
||||
my @dirs = @{$self->{l10n_dirs}}; |
||||
|
||||
if (-e "$fullpath/.svn") { |
||||
$self->check_module_validity(); |
||||
my $count = $self->update_module_path(@dirs); |
||||
|
||||
$self->{needsRefreshed} = 0 if $count == 0; |
||||
return $count; |
||||
} |
||||
else { |
||||
return $self->checkout_module_path(@dirs); |
||||
} |
||||
} |
||||
|
||||
sub name |
||||
{ |
||||
return 'l10n'; |
||||
} |
||||
|
||||
# Returns a list of just the languages to install. |
||||
sub languages |
||||
{ |
||||
my $self = assert_isa(shift, 'ksb::l10nSystem'); |
||||
my @langs = @{$self->{l10n_dirs}}; |
||||
|
||||
return grep { $self->isSubdirBuildable($_); } (@langs); |
||||
} |
||||
|
||||
# Buildsystem support section |
||||
|
||||
sub needsRefreshed |
||||
{ |
||||
my $self = shift; |
||||
|
||||
# Should be 1 except if no update happened. |
||||
return $self->{needsRefreshed}; |
||||
} |
||||
|
||||
sub buildInternal |
||||
{ |
||||
my $self = assert_isa(shift, 'ksb::l10nSystem'); |
||||
my $builddir = $self->module()->fullpath('build'); |
||||
my @langs = $self->languages(); |
||||
my $result = 0; |
||||
|
||||
$result = ($self->safe_make({ |
||||
target => undef, |
||||
message => "Building localization for language...", |
||||
logbase => "build", |
||||
subdirs => \@langs, |
||||
}) == 0) || $result; |
||||
|
||||
return $result; |
||||
} |
||||
|
||||
sub configureInternal |
||||
{ |
||||
my $self = assert_isa(shift, 'ksb::l10nSystem'); |
||||
|
||||
my $builddir = $self->module()->fullpath('build'); |
||||
my @langs = $self->languages(); |
||||
my $result = 0; |
||||
|
||||
for my $lang (@langs) { |
||||
my $prefix = $self->module()->installationPath(); |
||||
p_chdir("$builddir/$lang"); |
||||
|
||||
info ("\tConfiguring to build language $lang"); |
||||
$result = (log_command($self->module(), "cmake-$lang", |
||||
['cmake', '-DCMAKE_INSTALL_PREFIX=' . $prefix]) == 0) || $result; |
||||
} |
||||
|
||||
return $result; |
||||
} |
||||
|
||||
sub installInternal |
||||
{ |
||||
my $self = assert_isa(shift, 'ksb::l10nSystem'); |
||||
my $builddir = $self->module()->fullpath('build'); |
||||
my @langs = $self->languages(); |
||||
|
||||
return ($self->safe_make({ |
||||
target => 'install', |
||||
message => "Installing language...", |
||||
logbase => "install", |
||||
subdirs => \@langs, |
||||
}) == 0); |
||||
} |
||||
|
||||
# Subroutine to link a source directory into an alternate directory in |
||||
# order to fake srcdir != builddir for modules that don't natively support |
||||
# it. The first parameter is the module to prepare. |
||||
# |
||||
# The return value is true (non-zero) if it succeeded, and 0 (false) if it |
||||
# failed. |
||||
# |
||||
# On return from the subroutine the current directory will be in the build |
||||
# directory, since that's the only directory you should touch from then on. |
||||
sub prepareFakeBuilddir |
||||
{ |
||||
my $self = assert_isa(shift, 'ksb::l10nSystem'); |
||||
my $module = $self->module(); |
||||
my $builddir = $module->fullpath('build'); |
||||
my $srcdir = $module->fullpath('source'); |
||||
|
||||
# List reference, not a real list. The initial kdesrc-build does *NOT* |
||||
# fork another kdesrc-build using exec, see sub log_command() for more |
||||
# info. |
||||
my $args = [ 'kdesrc-build', 'main::safe_lndir', $srcdir, $builddir ]; |
||||
|
||||
info ("\tSetting up alternate build directory for l10n"); |
||||
return (0 == log_command ($module, 'create-builddir', $args)); |
||||
} |
||||
|
||||
# Subroutine to create the build system for a module. This involves making |
||||
# sure the directory exists and then running any preparatory steps (like |
||||
# for l10n modules). This subroutine assumes that the module is already |
||||
# downloaded. |
||||
# |
||||
# Return convention: boolean (inherited) |
||||
sub createBuildSystem |
||||
{ |
||||
my $self = assert_isa(shift, 'ksb::l10nSystem'); |
||||
my $module = $self->module(); |
||||
my $builddir = $module->fullpath('build'); |
||||
|
||||
# l10n doesn't support srcdir != builddir, fake it. |
||||
whisper ("\tFaking builddir for g[$module]"); |
||||
if (!$self->prepareFakeBuilddir()) |
||||
{ |
||||
error ("Error creating r[$module] build system!"); |
||||
return 0; |
||||
} |
||||
|
||||
p_chdir ($builddir); |
||||
|
||||
my @langs = @{$self->{l10n_dirs}}; |
||||
@langs = grep { $self->isSubdirBuildable($_) } (@langs); |
||||
|
||||
foreach my $lang (@langs) { |
||||
my $cmd_ref = [ './scripts/autogen.sh', $lang ]; |
||||
if (log_command ($module, "build-system-$lang", $cmd_ref)) |
||||
{ |
||||
error ("\tUnable to create build system for r[$module]"); |
||||
} |
||||
} |
||||
|
||||
$module->setOption('#reconfigure', 1); # Force reconfigure of the module |
||||
|
||||
return 1; |
||||
} |
||||
|
||||
1; |
||||
Loading…
Reference in new issue