Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PATCH] h2ph inc_dirs() fails to prepend gcc include search path, resulting in missing C standard headers on Linux #8183

Closed
p5pRT opened this issue Nov 1, 2005 · 4 comments

Comments

@p5pRT
Copy link

p5pRT commented Nov 1, 2005

Migrated from rt.perl.org#37582 (status was 'resolved')

Searchable as RT37582$

@p5pRT
Copy link
Author

p5pRT commented Nov 1, 2005

From jvdias@redhat.com

Created by jvdias@redhat.com

When building perl-5.8.7 on Linux, the standard C headers fail to
be converted into perl headers, resulting in missing include
dependencies.

The C standard headers, such as :
  stddef.h syslimits.h stdarg.h float.h stdbool.h
fail to be converted into perl headers (.ph files) during
a build and install of perl-5.8.7 . Many system headers
include these headers, so many system headers are made
unusable with perl because of this problem.

This is because h2ph's inc_dirs() does not find the string
'Reading specs from' in gcc -v's output, when the gcc version
is >= 4. My gcc's -v option emits​:
$ gcc -v
Using built-in specs.
Target​: i386-redhat-linux
Configured with​: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,java,f95,ada --enable-java-awt=gtk --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --host=i386-redhat-linux
Thread model​: posix
gcc version 4.0.1 20050727 (Red Hat 4.0.1-5)
$

gcc 4 understands the '-print-search-dirs' option​:
$ gcc -print-search-dirs
install​: /usr/lib/gcc/i386-redhat-linux/4.0.1/
...

Here's a patch which corrects h2ph.PL's inc_dirs() to pick up
gcc4's built-in header include path​:

---

Inline Patch
--- perl-5.8.7/utils/h2ph.PL.bz172236   2005-04-04 17:47:17.000000000 -0400
+++ perl-5.8.7/utils/h2ph.PL    2005-11-01 17:42:36.000000000 -0500
@@ -734,9 +734,15 @@
 # non-GCC?) C compilers, but gcc uses an additional include directory.
 sub inc_dirs
 {
-    my $from_gcc    = `$Config{cc} -v 2>&1`;
-    $from_gcc       =~ s:^Reading specs from (.*?)/specs\b.*:$1/include:s;
-
+    my $from_gcc    = `LC_ALL=C $Config{cc} -v 2>&1`;
+    if( !( $from_gcc =~ s:^Reading specs from (.*?)/specs\b.*:$1/include:s ) )
+    { # gcc-4+ :
+       $from_gcc   = `LC_ALL=C $Config{cc} -print-search-dirs 2>&1`;
+       if ( !($from_gcc =~ s/^install:\s*([^\s]+[^\s\/])([\s\/]*).*$/$1\/include/s) )
+       {
+           $from_gcc = '';
+       };
+    };
     length($from_gcc) ? ($from_gcc, $Config{usrinc}) : ($Config{usrinc});
 }
---
Perl Info

Flags:
    category=core
    severity=low

This perlbug was built using Perl v5.8.7 in the Red Hat build system.
It is being executed now by Perl v5.8.7 - Tue Oct 25 19:39:19 EDT 2005.

Site configuration information for perl v5.8.7:

Configured by Red Hat, Inc. at Tue Oct 25 19:39:19 EDT 2005.

Summary of my perl5 (revision 5 version 8 subversion 7) configuration:
  Platform:
    osname=linux, osvers=2.6.13-1.1624_fc5, archname=i386-linux-thread-multi
    uname='linux jvdias 2.6.13-1.1624_fc5 #1 mon oct 24 01:16:31 edt 2005 i686 i686 i386 gnulinux '
    config_args='-des -Doptimize=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=pentium4 -fasynchronous-unwind-tables -Dversion=5.8.7 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dinstallprefix=/usr -Dprefix=/usr -Darchname=i386-linux -Dvendorprefix=/usr -Dsiteprefix=/usr -Duseshrplib -Dusethreads -Duseithreads -Duselargefiles -Dd_dosuid -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto -Dinc_version_list=5.8.6 5.8.5 5.8.4 5.8.3 -Dscriptdir=/usr/bin'
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
    useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBUGGING -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm',
    optimize='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=pentium4 -fasynchronous-unwind-tables',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBUGGING -fno-strict-aliasing -pipe -I/usr/local/include -I/usr/include/gdbm'
    ccversion='', gccversion='4.0.2 20051007 (Red Hat 4.0.2-3)', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='gcc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc
    perllibs=-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    libc=/lib/libc-2.3.90.so, so=so, useshrplib=true, libperl=libperl.so
    gnulibc_version='2.3.90'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,-rpath,/usr/lib/perl5/5.8.7/i386-linux-thread-multi/CORE'
    cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'

Locally applied patches:



@INC for perl v5.8.7:
    /usr/lib/perl5/site_perl/5.8.7/i386-linux-thread-multi
    /usr/lib/perl5/site_perl/5.8.6/i386-linux-thread-multi
    /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi
    /usr/lib/perl5/site_perl/5.8.4/i386-linux-thread-multi
    /usr/lib/perl5/site_perl/5.8.3/i386-linux-thread-multi
    /usr/lib/perl5/site_perl/5.8.7
    /usr/lib/perl5/site_perl/5.8.6
    /usr/lib/perl5/site_perl/5.8.5
    /usr/lib/perl5/site_perl/5.8.4
    /usr/lib/perl5/site_perl/5.8.3
    /usr/lib/perl5/site_perl
    /usr/lib/perl5/vendor_perl/5.8.7/i386-linux-thread-multi
    /usr/lib/perl5/vendor_perl/5.8.6/i386-linux-thread-multi
    /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi
    /usr/lib/perl5/vendor_perl/5.8.4/i386-linux-thread-multi
    /usr/lib/perl5/vendor_perl/5.8.3/i386-linux-thread-multi
    /usr/lib/perl5/vendor_perl/5.8.7
    /usr/lib/perl5/vendor_perl/5.8.6
    /usr/lib/perl5/vendor_perl/5.8.5
    /usr/lib/perl5/vendor_perl/5.8.4
    /usr/lib/perl5/vendor_perl/5.8.3
    /usr/lib/perl5/vendor_perl
    /usr/lib/perl5/5.8.7/i386-linux-thread-multi
    /usr/lib/perl5/5.8.7
    .


Environment for perl v5.8.7:
    HOME=/home/boston/jvdias
    LANG=en_US.UTF-8
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/usr/games:/home/boston/jvdias/bin
    PERL_BADLANG (unset)
    SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Nov 10, 2005

From @smpeters

[jvd - Tue Nov 01 15​:22​:45 2005]​:

To​: perlbug@​perl.org
Subject​: h2ph inc_dirs fails to prepend gcc include search path,
resulting in missing C standard headers on Linux
Reply-To​: jvdias@​redhat.com
Message-Id​: <5.8.7_3660_1130885631@​jvdias>

This is a bug report for perl from jvdias@​redhat.com,
generated with the help of perlbug 1.35 running under perl v5.8.7.

-----------------------------------------------------------------
[Please enter your report here]

When building perl-5.8.7 on Linux, the standard C headers fail to
be converted into perl headers, resulting in missing include
dependencies.

The C standard headers, such as :
stddef.h syslimits.h stdarg.h float.h stdbool.h
fail to be converted into perl headers (.ph files) during
a build and install of perl-5.8.7 . Many system headers
include these headers, so many system headers are made
unusable with perl because of this problem.

This is because h2ph's inc_dirs() does not find the string
'Reading specs from' in gcc -v's output, when the gcc version
is >= 4. My gcc's -v option emits​:
$ gcc -v
Using built-in specs.
Target​: i386-redhat-linux
Configured with​: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--enable-checking=release --with-system-zlib --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-libgcj-multifile
--enable-languages=c,c++,objc,java,f95,ada --enable-java-awt=gtk
--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre
--host=i386-redhat-linux
Thread model​: posix
gcc version 4.0.1 20050727 (Red Hat 4.0.1-5)
$

gcc 4 understands the '-print-search-dirs' option​:
$ gcc -print-search-dirs
install​: /usr/lib/gcc/i386-redhat-linux/4.0.1/
...

Here's a patch which corrects h2ph.PL's inc_dirs() to pick up
gcc4's built-in header include path​:

---
--- perl-5.8.7/utils/h2ph.PL.bz172236 2005-04-04 17​:47​:17.000000000
-0400
+++ perl-5.8.7/utils/h2ph.PL 2005-11-01 17​:42​:36.000000000 -0500
@​@​ -734,9 +734,15 @​@​
# non-GCC?) C compilers, but gcc uses an additional include
directory.
sub inc_dirs
{
- my $from_gcc = `$Config{cc} -v 2>&1`;
- $from_gcc =~ s​:^Reading specs from
(.*?)/specs\b.*​:$1/include​:s;
-
+ my $from_gcc = `LC_ALL=C $Config{cc} -v 2>&1`;
+ if( !( $from_gcc =~ s​:^Reading specs from
(.*?)/specs\b.*​:$1/include​:s ) )
+ { # gcc-4+ :
+ $from_gcc = `LC_ALL=C $Config{cc} -print-search-dirs 2>&1`;
+ if ( !($from_gcc =~
s/^install​:\s*([^\s]+[^\s\/])([\s\/]*).*$/$1\/include/s) )
+ {
+ $from_gcc = '';
+ };
+ };
length($from_gcc) ? ($from_gcc, $Config{usrinc}) :
($Config{usrinc});
}

Thanks, I've applied this as change #26074.

@p5pRT
Copy link
Author

p5pRT commented Nov 10, 2005

The RT System itself - Status changed from 'new' to 'open'

@p5pRT p5pRT closed this as completed Nov 10, 2005
@p5pRT
Copy link
Author

p5pRT commented Nov 10, 2005

@smpeters - Status changed from 'open' to 'resolved'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant