I needed to compile a file in Unix System Services; I took an old make file, changed cc to xlc expecting it to compile and had lots of problems.
It feels like the documentation was well written in the days of the cc and c89 complier, and has a different beast inserted into it.
As started to write this blog post, I learned even more about compiling in Unix Services on z/OS!
Make file using cc
cparmsa= -Wc,"SSCOM,DEBUG,DEF(MVS),DEF(_OE_SOCKETS),UNDEF(_OPEN_DEFAULT),NOOE cparmsb= ,SO,SHOW,LIST(),XREF,ILP32,DLL,SKIPS(HIDE)" syslib= -I'/usr/include' -I'/usr/include/sys' -I"//'TCPIP.SEZACMAC'" -I"//'TCPIP.SEZANMAC'" all: main parts = tcps.o main: $(parts) cc -o tcps $(parts) %.o: %.c cc -c -o $@ $(syslib) $(cparmsa)$(cparmsb) -V $< clean: rm *.o
The generated compile statement is
cc -c -o tcps.o -I’/usr/include’ -I’/usr/include/sys’ -I”//’TCPIP.SEZACMAC'” -I”//’TCPIP.SEZANMAC'” -Wc,”SSCOM,DEBUG,DEF(MVS),DEF(_OE_SOCKETS),UNDEF(_OPEN_DEFAULT),NOOE,SO, SHOW,LIST(),XREF,ILP32,DLL,SKIPS(HIDE)” -V tcps.c
Note the following
- the -V option generates the listing. “-V produces all reports for the compiler, and binder, or prelinker, and directs them to stdout“. If you do not have -V you do not get a listing.
- -Wc,list() says generate a list with a name like tcps.lst based on the file name being compiled. If you use list(x.lst) it does not produce any output! This is contrary to what the documentation says. (Possible bug on compiler when specifying nooe”
- SHOW lists the included files
- SKIPS(HIDE) omits the stuff which is not used – see below.
Make using xlc
I think the xlc compiler has bits from z/OS and bits from AIX (sensibly sharing code!). On AIX some parameters are passed using -q. You might use -qSHOWINC or -qNOSHOWINC instead of -Wc,SHOWINC
cparmsx= -Wc,"SO,SHOW,LIST(lst31),XREF,ILP32,DLL,SSCOM, cparmsy= DEBUG,DEF(MVS),DEF(_OE_SOCKETS),UNDEF(_OPEN_DEFAULT),NOOE" cparms3= -qshowinc -qso=./lst.yy -qskips=hide -V syslib= -I'/usr/include' -I'/usr/include/sys' -I"//'TCPIP.SEZACMAC'" -I"//'TCPIP.SEZANMAC'" all: main parts = tcps.o main: $(parts) cc -o tcps $(parts) %.o: %.c xlc -c -o $@ $(syslib) $(cparmsx)$(cparmsy) $(cparms3) $< clean: rm *.o
This generates a statement
xlc -c -o tcps.o -I’/usr/include’ -I’/usr/include/sys’ -I”//’TCPIP.SEZACMAC'” -I”//’TCPIP.SEZANMAC'” -Wc,”SO,SHOW,LIST(lst31),XREF, ILP32,DLL, SSCOM,DEBUG,DEF(MVS),DEF(_OE_SOCKETS), UNDEF(_OPEN_DEFAULT),NOOE” -qshowinc -qso=./lst.yy -qskips=hide tcps.c
Note the -q options. You need -qso=…. to get a listing.
Any -V option is ignored, and LIST(…) is not used.
Note: There is a buglet in the compiler, specifying nooe does not always produce a listing. The above xlc statement gets round this problem.
SKIPS(SHOW|HIDE)
The SKIPS(HIDE) shows you what is used, and surpresses text which is not used. I found this useful trying to find the combination of #define … to get the program to compile.
For example with SKIPS(SHOW)
170 |#if 0x42040000 >= 0X220A0000 | 672 4 171 | #if defined (_NO_PROTO) && !defined(__cplusplus) | 673 4 172 | #define __new210(ret,func,parms) ret func () | 674 4 173 | #else | 675 4 174 | #define __new210(ret,func,parms) ret func parms | 676 4 175 | #endif | 677 4 176 |#elif !defined(__cplusplus) && !defined(_NO_NEW_FUNC_CHECK)| 678 4 177 | #define __new210(ret,func,parms) \ | 679 4 178 | extern struct __notSupportedBeforeV2R10__ func | 680 4 179 | #else | 681 4 180 | #define __new210(ret,func,parms) | 682 4 181 |#endif | 683 4
With SKIPS(HIDE) the bold lines are not displayed,
170 |#if 0x42040000 >= 0X220A0000 | 629 4 171 | #if defined (_NO_PROTO) && !defined(__cplusplus) | 630 4 172 | #define __new210(ret,func,parms) ret func () | 631 4 173 | else | 632 4 175 | #endif | 633 4 176 | | 634 4 179 | #else | 635 4 181 |#endif | 636 4 182 |#endif | 637 4
This shows
- 170 The line number within the included file
- 629 The line number within the file
- 4 is the 4th included file. In the “I N C L U D E S” section it says 4 /usr/include/features.h
- rows 174 is missing … this is the #else text which was not included
- rows 177, 178,180 are omitted.
This makes is much easier to browse through the includes to find why you have duplicate definitions and other problems.