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