The bottom (actually top :) ) line is that at least some of these errors were the result of makedepend failing to realize that the C89 standard allows preprocessor directives to be indented, and failing to account for continuation lines in preprocessor lines. I am smoking some fixes for this. On my system this gets rid of all errors in makedepend. (Several of the errors that John mentions below were showing up on mine, but were being suppressed.)

We need to figure out how to most easily give John access to the latest changes, and for him to submit patches, as I believe, he doesn't have git access on z/OS. Perhaps their could be a branch, that he rsyncs from, for the first part. Anyway, if you want to try these patches out before they get into blead, the link is

http://perl5.git.perl.org/perl.git/shortlog/refs/heads/smoke-me/khw-makedepend


On 02/23/2013 11:41 AM, John Goodyear wrote:
Nicholas,  I digested your response and  makedepend (minus a sed
statement) over coffee.

Before I get into what I've found, it would seem that most of these
errors emitted from makedepend can likely be ignored since its goal is
just to find dependencies.  However if there may be a (small) chance
that a dependency gets dropped, so if there are errors, it is wise to
understand their cause.

The source of confusion was that I was looking at the real source files
instead of the versions that makedepend strips before feeding to ccpstdin.

A nit:

      makedepend puts  '#line 1 "<filename>"'   at the top of each
    UU/<filename>.c.c file.   This causes the compiler errors to report
    a line above where the error is.
    At least for z/OS, if that was changed to '#line 2 ...' , it would
    prevent the compiler from reporting the wrong line



Next ...
 >> Finding dependencies for pp_sys.o.
 >> ERROR CCN3010 ./time64.c:478   Macro PeRl_CaTiFy invoked with a null
argument for parameter a.
 >> ERROR CCN3010 ./time64.c:478   Macro PeRl_CaTiFy invoked with a null
argument for parameter a.

 >> Finding dependencies for regexec.o.
 >> ERROR CCN3287 regexec.c:35    The parameter list on the definition
of macro LOAD_UTF8_CHARCLASS_DEBUG_TEST is not complete.
 >> ERROR CCN3287 regexec.c:75    The parameter list on the definition
of macro REXEC_TRIE_READ_CHAR is not complete.

    For the errors above, I see that cppstdin is invoke with these
    arguments:
        $finc='', -I., $cppflags='', $cppminus=''
    This being the case, is it simply that when  cppflags or cppminus
    are empty some macros aren't being defined?
    As you indicated, this could be happening on other platforms, but is
    getting hidden since stderr is handled differently.


Next...
 > Finding dependencies for perly.o.
 > ERROR CCN3202 perly.c:82    #endif can only appear at the end of a
#if, #elif, #ifdef or #ifndef block.

    You called out the extra #endif that makedepends appends
    specifically for this file.  It is the cuprit

    Now we just have to understand why it was put there.  Either
    something in the code, or something in (z/OS or the compiler) has
    changed since then.



Next ...
There a a couple of different issues for the files that take conditional
declaration listed errors.  This statement from makedepend seems to be
the cause:

    108      $echo "Finding dependencies for $filebase$_o."
    109      ( $echo "#line 1 \"$file\""; \
    110        $sed -n <$file \
    111      -e "/^${filebase}_init(/q" \
    112      -e '/^#line/d' \
    113      -e '/^#/{' \
    114      -e 's|/\*.*$||' \
    115      -e 's|\\$||' \
    116      -e p \
    117      -e '}' ) >UU/$file.c


    My sed and re foo is a bit weak to understand why it's omitting the
    conditional lines highlighted below, but it seems to be the case.



  I ran the perl.c and perl.c.c files through some #ifdef #endif balance
checking logic to understand what it is complaining about.   For perl.c
  the sed expression that generates the .c.c file seems to have
something against an indented "#endif" statement at line 3441.  sed
omits it, causing the error below.   If I remove the indentation, then
it is not omitted.    Oddly, sv.c has a similarly indented  #endif at
6610, but it does not cause a problem.   Sigh.


 >> Finding dependencies for perl.o.
 >> WARNING CCN3296 ./patchlevel.h:132   #include file "git_version.h"
not found.
 >> ERROR CCN3198 perl.c:536   #if, #else, #elif, #ifdef, #ifndef block
must be ended with #endif.

    from perl.c:
        line 3419 iflevel inc to 1 #if !defined(DGUX)
        line 3422 iflevel inc to 2 #ifdef PERL_PATCHNUM
        line 3423 iflevel inc to 3 #  ifdef PERL_GIT_UNCOMMITTED_CHANGES
        line 3427 iflevel dec to 2 #  endif
        line 3441 iflevel dec to 1  #endif
        line 3463 iflevel dec to 0 #endif /* !DGUX */
        line 3464 iflevel inc to 1 #if defined(LOCAL_PATCH_COUNT)

    from perl.c.c
        line 328 iflevel inc to 1 #if !defined(DGUX)
        line 329 iflevel inc to 2 #ifdef PERL_PATCHNUM
        line 330 iflevel inc to 3 #  ifdef PERL_GIT_UNCOMMITTED_CHANGES
        line 332 iflevel dec to 2 #  endif
        line 334 iflevel dec to 1 #endif
        line 335 iflevel inc to 2 #if defined(LOCAL_PATCH_COUNT)



This error seemed to be complaining about define SIZE32 4, however
looking at pp_pack.c.c, you can see that the line continuation and 2nd
part of the conditional expression was (apparently) dropped by the sed
statement that generates the UU/<filename>.c.c files

 >> Finding dependencies for pp_pack.o.
 >> ERROR CCN3294 pp_pack.c:116   Syntax error in expression on #if
directive.

    from pp_pack.c
        362  # if defined(my_htolen) && defined(my_letohn) && \
        363      defined(my_htoben) && defined(my_betohn)
        364  #  define DO_BO_UNPACK_N(var, type)
    from pp_pack.c.c
        116  # if defined(my_htolen) && defined(my_letohn) &&
        117  #  define DO_BO_UNPACK_N(var, type)




Regards,

John Goodyear
IT Specialist: zBX Power Blades
ATS zEnterprise Focus Team
Gaithersburg,MD
[email protected]

Inactive hide details for Nicholas Clark ---02/22/2013 03:37:50 PM---On
Fri, Feb 22, 2013 at 02:31:05PM -0500, John Goodyear wrNicholas Clark
---02/22/2013 03:37:50 PM---On Fri, Feb 22, 2013 at 02:31:05PM -0500,
John Goodyear wrote: > sh ./makedepend MAKE=make

From: Nicholas Clark <[email protected]>
To: John Goodyear/Gaithersburg/IBM@IBMUS, Peter Prymmer
<[email protected]>,
Cc: [email protected], [email protected]
Date: 02/22/2013 03:37 PM
Subject: Re: makedepend issues with Perl 5.17.10 on z/OS 1.13
Sent by: Nicholas Clark <[email protected]>
------------------------------------------------------------------------



On Fri, Feb 22, 2013 at 02:31:05PM -0500, John Goodyear wrote:

 > sh ./makedepend MAKE=make
 > ...
 > ...
 > perl.c
 >    Finding dependencies for perl.o.
 >    WARNING CCN3296 ./patchlevel.h:132   #include file "git_version.h" not
 >    found.
 >    ERROR CCN3198 perl.c:535   #if, #else, #elif, #ifdef, #ifndef
block must
 >    be ended with #endif.
 >    FSUM3065 The COMPILE step ended with return code 12.
 >    FSUM3017 Could not compile .83952605.c. Correct the errors and try
 >    again.
 >
 >    Where does git_version.h  come from?   I don't have it.

It's generated later on by the build. The code in makedepend differs quite
markedly between os390 and everything else.

Everything else does this, capturing stderr too, then processes it

        $cppstdin $finc -I. $cppflags $cppminus <UU/$file.c >.cout 2>.cerr
        $sed \

...

     -e '/^# *[0-9][0-9]* *[".\/]/!d' \

           -e 's|\.c\.c|.c|' $uwinfix .cout .cerr| \
        $uniq | $sort | $uniq >> .deptmp


As best I can work out, that expression I left in deletes *every* line that
doesn't match something like # 999 "file.h"
so eats all the error messages.

The os390 code is this:

        $cppstdin $finc -I. $cppflags $cppminus <UU/$file.c |
        $sed \

...

     -e 's|\.c\.c|.c|' $uwinfix | \
        $uniq | $sort | $uniq >> .deptmp


ie stderr is still visible. I think that this is why you're seeing error
messages.


 >    Not sure why the compiler is issuing the coplaint about 535.   Is it
 >    possibly 535 of the preprocessor expanded version of perl.c ??
 >
 >          533      destruct_level = PL_perl_destruct_level;
 >          534  #if defined(DEBUGGING) || defined(PERL_TRACK_MEMPOOL)
 >          535      {

This complaint doesn't make sense to me There are plenty of other lines
with similar #if defined(XXX) || defined (YYY)

 > ...
 > ...
 >
 > perly.c
 >    Same issue for perly.c.  complaint at line 82 does not make sense
 >
 >    ERROR CCN3202 perly.c:82    #endif can only appear at the end of a
#if,
 >    #elif, #ifdef or #ifndef block.
 >    FSUM3065 The COMPILE step ended with return code 12.
 >    FSUM3017 Could not compile .83952612.c. Correct the errors and try
 >    again.

I think that you're going to have to look at the output of pre-processor
to figure out why it's confused. There is a hack in makedepend.SH that
might be relevant. Using the git blame view:

http://perl5.git.perl.org/perl.git/blame/HEAD:/makedepend.SH

I find this:

commit 4902b9ac34817bed7eedc3956f985e2d5ded090e
Author: Jarkko Hietaniemi <[email protected]>
Date:   Thu Jun 5 16:58:23 2003 +0000

    z/OS makedepend fix from Peter Prymmer;
    still needed as reported by Brian De Pradine.

    p4raw-id: //depot/perl@19692

diff --git a/makedepend.SH b/makedepend.SH
index c1d880d..688f656 100755
--- a/makedepend.SH
+++ b/makedepend.SH
@@ -141,6 +141,11 @@ for file in `$cat .clist`; do
-e 's|\\$||' \
-e p \
-e '}' ) >UU/$file.c
+
+    if [ "$osname" = os390 -a "$file" = perly.c ]; then
+        $echo '#endif' >>UU/$file.c
+    fi
+
     if [ "$osname" = os390 ]; then
         $cppstdin $finc -I. $cppflags $cppminus <UU/$file.c |
         $sed \


I don't know if Peter Prymmer remembers what that was about, and why it was
needed.

 > Other makedepend output indicating problems
 >    ...
 >    ...
 >
 > Finding dependencies for pp_sys.o.
 > ERROR CCN3010 ./time64.c:478   Macro PeRl_CaTiFy invoked with a null
 > argument for parameter a.
 > ERROR CCN3010 ./time64.c:478   Macro PeRl_CaTiFy invoked with a null
 > argument for parameter a.


That's very strange. The macro PeRl_CaTiFy is defined in config.h, probably
looking like this:

#define PeRl_CaTiFy(a, b) a ## b

Line 478 of time64.c is this:

    if( SHOULD_USE_SYSTEM_LOCALTIME(*time) ) {

and that's defined earlier like this:

#ifdef USE_SYSTEM_LOCALTIME
#    define SHOULD_USE_SYSTEM_LOCALTIME(a)  (       \
    (a) <= SYSTEM_LOCALTIME_MAX &&              \
    (a) >= SYSTEM_LOCALTIME_MIN                 \
)
#else
#    define SHOULD_USE_SYSTEM_LOCALTIME(a)      (0)
#endif


So how come it thinks that the two are even remotely connected?


 > Finding dependencies for globals.o.
 > WARNING CCN3296 ./perl.h:4331  #include file "uudmap.h" not found.
 > WARNING CCN3296 ./perl.h:4338  #include file "bitcount.h" not found.
 > WARNING CCN3296 ./perl.h:5203  #include file "mg_data.h" not found.
 > FSUM3065 The COMPILE step ended with return code 4.

These error messages will be ignored on platforms other than os390, due to
the differing sed shown above.

 > Finding dependencies for pp_pack.o.
 > ERROR CCN3294 pp_pack.c:115   Syntax error in expression on #if
directive.
 > FSUM3065 The COMPILE step ended with return code 12.
 > FSUM3017 Could not compile .67174450.c. Correct the errors and try again.

It's objecting to this?

#define SIZE32 4

 > Does configure usually notice errors from makedepend and indicate
something
 > needs to be fixed before running make, or is this normal

It doesn't hit problems on non EBCDIC systems. Some of the (lack of) error
messages are explained by the different code in makedepend. But the others
seem really strange.

Nicholas Clark



Reply via email to