stas        2004/04/04 21:38:29

  Modified:    lib/Apache Build.pm
               .        Changes
  Log:
  - Use a better approach to figure out whether we need to strip perl's
  LargeFilesSource flag, by checking whether libapr was compiled with
  -D_FILE_OFFSET_BITS=64 or not. Checking for APR_HAS_LARGE_FILES is
  useless since it doesn't tell whether 32 vs 64 bits off_t and similar
  types are used
  - also log Joe's explanation of the lfs build differences between perl and
  apr as an inlined comment
  Submitted by: Joe Orton
  
  Revision  Changes    Path
  1.158     +77 -4     modperl-2.0/lib/Apache/Build.pm
  
  Index: Build.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/lib/Apache/Build.pm,v
  retrieving revision 1.157
  retrieving revision 1.158
  diff -u -u -r1.157 -r1.158
  --- Build.pm  5 Apr 2004 04:03:38 -0000       1.157
  +++ Build.pm  5 Apr 2004 04:38:29 -0000       1.158
  @@ -187,6 +187,18 @@
       $cflags;
   }
   
  +sub apxs_extra_cflags {
  +    my $flags = __PACKAGE__->apxs('-q' => 'EXTRA_CFLAGS');
  +    $flags =~ s/\"/\\\"/g;
  +    $flags;
  +}
  +
  +sub apxs_extra_cppflags {
  +    my $flags = __PACKAGE__->apxs('-q' => 'EXTRA_CPPFLAGS');
  +    $flags =~ s/\"/\\\"/g;
  +    $flags;
  +}
  +
   my %threaded_mpms = map { $_ => 1}
           qw(worker winnt beos mpmt_os2 netware leader perchild threadpool);
   sub mpm_is_threaded {
  @@ -1584,16 +1596,77 @@
       "@includes";
   }
   
  +### Picking the right LFS support flags for mod_perl, by Joe Orton ###
  +#
  +# on Unix systems where by default off_t is a "long", a 32-bit integer,
  +# there are two different ways to get "large file" support, i.e. the
  +# ability to manipulate files bigger than 2Gb:
  +#
  +# 1) you compile using -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64.  This
  +# makes sys/types.h expose off_t as a "long long", a 64-bit integer, and
  +# changes the size of a few other types too.  The C library headers
  +# automatically arrange to expose a correct implementation of functions
  +# like lseek() which take off_t parameters.
  +#
  +# 2) you compile using -D_LARGEFILE64_SOURCE, and use what is called the
  +# "transitional" interface.  This means that the system headers expose a
  +# new type, "off64_t", which is a long long, but the size of off_t is not
  +# changed.   A bunch of new functions like lseek64() are exposed by the C 
  +# library headers, which take off64_t parameters in place of off_t.
  +#
  +# Perl built with -Duselargefiles uses approach (1).
  +#
  +# APR HEAD uses (2) by default. APR 0.9 does not by default use either
  +# approach, but random users can take a httpd-2.0.49 tarball, and do:
  +#
  +#   export CPPFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64"
  +#   ./configure
  +#
  +# to build a copy of apr/httpd which uses approach (1), though this
  +# isn't really a supported configuration.
  +#
  +# The problem that mod_perl has to work around is when you take a
  +# package built with approach (1), i.e. Perl, and any package which was
  +# *not* built with (1), i.e. APR, and want to interface between
  +# them. [1]
  +#
  +# So what you want to know is whether APR was built using approach (1)
  +# or not.  APR_HAS_LARGE_FILES in HEAD just tells you whether APR was
  +# built using approach (2) or not, which isn't useful in solving this
  +# problem.
  +#
  +# [1]: In some cases, it may be OK to interface between packages which
  +# use (1) and packages which use (2).  APR HEAD is currently not such a
  +# case, since the size of apr_ino_t is still changing when
  +# _FILE_OFFSET_BITS is defined.
  +#
  +# If you want to see how this matters, get some httpd function to do at
  +# the very beginning of main():
  +#
  +#   printf("sizeof(request_rec) = %lu, sizeof(apr_finfo_t) = %ul",
  +#          sizeof(request_rec), sizeof(apr_finfo_t));
  +#
  +# and then put the same printf in mod_perl somewhere, and see the
  +# differences. This is why it is a really terribly silly idea to ever
  +# use approach (1) in anything other than an entirely self-contained
  +# application.
  +#
   # there is no conflict if both libraries either have or don't have
   # large files support enabled
   sub has_large_files_conflict {
       my $self = shift;
  -    my $apr_config = $self->get_apr_config();
   
  -    my $perl = $Config{uselargefiles} ? 1 : 0;
  -    my $apr  = $apr_config->{HAS_LARGE_FILES} ? 1 : 0;
  +    my $apxs_flags = join $self->apxs_extra_cflags, $self->apxs_extra_cppflags;
  +    my $apr_lfs64  = $apxs_flags      =~ /-D_FILE_OFFSET_BITS=64/;
  +    my $perl_lfs64 = $Config{ccflags} =~ /-D_FILE_OFFSET_BITS=64/;
  +
  +    # XXX: we don't really deal with the case where APR was built with
  +    # -D_FILE_OFFSET_BITS=64 but perl wasn't, since currently we strip
  +    # only perl's ccflags, not apr's flags. the reason we don't deal
  +    # with it is that we didn't have such a case yet, but may need to
  +    # deal with it later
   
  -    return $perl ^ $apr;
  +    return $perl_lfs64 ^ $apr_lfs64;
   }
   
   # if perl is built with uselargefiles, but apr not, the build won't
  
  
  
  1.356     +6 -0      modperl-2.0/Changes
  
  Index: Changes
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/Changes,v
  retrieving revision 1.355
  retrieving revision 1.356
  diff -u -u -r1.355 -r1.356
  --- Changes   2 Apr 2004 02:17:46 -0000       1.355
  +++ Changes   5 Apr 2004 04:38:29 -0000       1.356
  @@ -12,6 +12,12 @@
   
   =item 1.99_14-dev
   
  +Use a better approach to figure out whether we need to strip perl's
  +LargeFilesSource flag, by checking whether libapr was compiled with
  +-D_FILE_OFFSET_BITS=64 or not. Checking for APR_HAS_LARGE_FILES is
  +useless since it doesn't tell whether 32 vs 64 bits off_t and similar
  +types are used [Joe Orton]
  +
   'SetHandler perl-script' no longer grabs any newly encountered END
   blocks, and removes them from PL_endav, but only if they are
   explicitly registered via ModPerl::Global::special_list_register(END
  
  
  

Reply via email to