5 # Copyright (C) 2005 David J. Goehrig <dgoehrig@cpan.org>
7 # ------------------------------------------------------------------------------
9 # This library is free software; you can redistribute it and/or
10 # modify it under the terms of the GNU Lesser General Public
11 # License as published by the Free Software Foundation; either
12 # version 2.1 of the License, or (at your option) any later version.
14 # This library is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 # Lesser General Public License for more details.
19 # You should have received a copy of the GNU Lesser General Public
20 # License along with this library; if not, write to the Free Software
21 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 # ------------------------------------------------------------------------------
25 # Please feel free to send questions, suggestions or improvements to:
36 use base 'Module::Build';
42 # Module::Build doesn't seem to have a way to use separate flags for separate
43 # XS files, so here's the override that makes separate files build correctly:
46 my ($self, $file) = @_;
48 my $properties = $self->{properties};
49 my $file_args = $self->notes( 'file_flags' )->{$file};
50 my @old_values = @$properties{ keys %$file_args };
51 @$properties{ keys %$file_args } = values %$file_args;
53 $self->SUPER::process_xs( $file );
54 @$properties{ keys %$file_args } = @old_values;
58 # every platform has slightly different library and header paths
62 my $modpath = File::Spec->catfile(
63 'SDL', 'Build', ucfirst( $os ) . '.pm' );
64 my $module = 'SDL::Build::' . ucfirst( $os );
66 require $modpath or croak "No module for $os platform\n";
71 # which headers are installed?
74 my ($self, $subsystems, $libraries) = @_;
75 my %includes_libs = $self->fetch_includes();
78 while ( my ($name, $subsystem) = each %$subsystems )
80 for my $library (@{ $subsystem->{libraries} })
82 my $lib = $libraries->{$library}
83 or croak "Unknown library '$library' for '$name'\n";
85 my ($inc_dir, $link_dir) =
86 $self->find_header( $lib->{header}, \%includes_libs );
87 $enabled{$name}{ $library } = $inc_dir ? [ $inc_dir, $link_dir ]
95 # set the define flags for the libraries we have
98 my ($self, $libraries, $build_systems) = @_;
102 while (my ($subsystem, $buildable) = each %$build_systems)
104 for my $build (grep { $buildable->{ $_ } } keys %$buildable)
106 push @{ $defines{ $subsystem } }, "-D$libraries->{$build}{define}";
113 # set the include paths for the libraries we have
116 my ($self, $libraries, $build_systems) = @_;
120 while (my ($subsystem, $buildable) = each %$build_systems)
123 for my $build (grep { $buildable->{ $_ } } keys %$buildable)
125 $sub_include{ $buildable->{ $build }[0] }++;
128 $includes{ $subsystem } = [ map { "-I$_" } keys %sub_include ];
134 # set the linker paths and flags for the libraries we have
137 my ($self, $libraries, $build_systems) = @_;
141 while (my ($subsystem, $buildable) = each %$build_systems)
144 for my $build (grep { $buildable->{ $_ } } keys %$buildable)
146 $sub_links{ $buildable->{ $build }[1] }++;
147 push @{ $links{ $subsystem }{libs} }, "-l$build";
150 $links{ $subsystem }{paths} = [ map { "-L$_" } keys %sub_links ];
156 # save this all in a format process_xs() can understand
159 my ($self, $subsystems, $build, $defines, $includes, $links,
160 $sdl_compile, $sdl_link) = @_;
162 while (my ($subsystem, $buildable) = each %$build)
164 my $sub_file = $subsystems->{$subsystem}{file}{to};
165 my $sub_includes = join(' ', @{ $includes->{$subsystem} } );
166 $file_flags{ $sub_file } =
168 extra_compiler_flags =>
170 @{ $includes->{$subsystem} },
171 (split(' ',$sdl_compile)),
172 @{ $defines->{$subsystem} },
173 ( defined $Config{usethreads} ? ('-DUSE_THREADS', '-fPIC') : ('-fPIC' )),
175 extra_linker_flags =>
177 @{ $links->{$subsystem}{paths} },
178 (split(' ',$sdl_link)),
179 @{ $links->{$subsystem}{libs} },
184 $self->notes( 'file_flags' => \%file_flags );
187 # look for a header somewhere on the system
190 my ($self, $header, $includes) = @_;
192 for my $inc_dir (keys %$includes)
194 next unless -e File::Spec->catfile( $inc_dir, $header );
195 return ($inc_dir, $includes->{$inc_dir});
201 my ($self, $config) = @_;
202 my $path = File::Spec->catfile(qw( lib SDL Config.pm ));
203 my $dd = Data::Dumper->new( [ $config ], [ 'sdl_config' ] );
204 my $hash = $dd->Dump();
205 (my $text = <<' END_HEADER' . $hash . <<' END_FOOTER');
213 my ($class, $define) = @_;
214 scalar grep { $$sdl_config{$_}{$define} } keys %$sdl_config;
222 open my $file, '>', $path or croak "Cannot write to '$path': $!\n";
226 # Subclass Darwin to build Objective-C addons
230 print STDERR "[SDL::Build] generic filter\n";
234 sub process_support_files {
236 my $p = $self->{properties};
237 return unless $p->{c_source};
238 return unless $p->{c_sources};
240 push @{$p->{include_dirs}}, $p->{c_source};
241 unless ( $p->{extra_compiler_flags} && $p->{extra_compiler_flags} =~ /DARCHNAME/) {
242 $p->{extra_compiler_flags} .= " -DARCHNAME=" . $self->{config}{archname};
244 print STDERR "[SDL::Build] extra compiler flags" . $p->{extra_compiler_flags} . "\n";
246 foreach my $file (map($p->{c_source} . "/$_", @{$p->{c_sources}})) {
247 push @{$p->{objects}}, $self->compile_c($file);
251 # Override to create a MacOS Bundle
257 # Override Install method for darwin
260 require ExtUtils::Install;
261 $self->depends_on('build');
262 $self->get_arch($^O)->build_bundle();
263 ExtUtils::Install::install($self->install_map, 1, 0, $self->{args}{uninst}||0);