Porting C-Source to OS/400: Difference between revisions
Jump to navigation
Jump to search
(More precise) |
(Added heading) |
||
Line 20: | Line 20: | ||
The precompiler searches private includes in ''*LIBL/H'', without the ''.h''-Extension. | The precompiler searches private includes in ''*LIBL/H'', without the ''.h''-Extension. | ||
== Compile Cycle == | |||
Compile object files as follows: | Compile object files as follows: | ||
CRTCMOD MODULE(MYLIB/MAIN) SRCFILE(MYLIB/QCSRC) DEFINE(DEF1 DEF2=1) OPTION(*LOGMSG) OUTPUT(*PRINT)<ref>Possibly add ''SYSIFCOPT(*IFS64IO)'' if large file support is desired.</ref> | CRTCMOD MODULE(MYLIB/MAIN) SRCFILE(MYLIB/QCSRC) DEFINE(DEF1 DEF2=1) OPTION(*LOGMSG) OUTPUT(*PRINT)<ref>Possibly add ''SYSIFCOPT(*IFS64IO)'' if large file support is desired.</ref> |
Revision as of 11:43, 18 July 2020
This article isn't finished yet or needs to be revised. Please keep in mind that thus it may be incomplete.
Reason: Complete with Links to all necessary Books. |
Because of the uncommon file handling, name length and character constraints, porting is already a mostly manual task.[1]
Most often, the real challenge is to manually put together a config.h file. Since there's no capable UNIX shell environment, ./configure
is no option.[2]
Preparations for QSYS.LIB
Preparations are mostly one on UNIX/Linux side.
- Convert Tabs to spaces:[3]
for FILE in *.c *.h; do cp ${FILE} ${FILE}~; expand -i -t4 < ${FILE}~ > ${FILE}; done
- Find out longest line in all C- and H-Files.
wc -L *.c |sort -rn |head
- Eliminate too long lines by wrapping. This is easily done with
set colorcolumn=80
in vim, and scrolling through the files with a wide window. [4] - Create (at least) two appropriate SRCPF with matching maximum line lengths through the RCDLEN parameter for CRTSRCPF:
- One (or more) for C-Files (may be named QCSRC),[5]
- One for H-Files (must be named H).
- Upload.
- If the file names are already shorter than 10 Characters (excluding file extension), just upload to a SRC PF:
for FILE in *.c; do echo -n "put ${FILE} MYLIB/QCSRC."; basename ${FILE} .c; done |ftp as400
[6][7]. - If the file names are longer, you'll have considerable fun to come up with shorter names, possibly grep through and replace in all text files if you needed to shorten a .h name, manually put together a textfile with approopriate put commands, and hope for the best.
- If the file names are already shorter than 10 Characters (excluding file extension), just upload to a SRC PF:
- Change file type to C:
for FILE in *.c; do echo "quote rcmd CHGPFM FILE(MYLIB/QCSRC) MBR(`basename ${FILE} .c`) SRCTYPE(C)"; done |ftp as400
[8]
The precompiler searches private includes in *LIBL/H, without the .h-Extension.
Compile Cycle
Compile object files as follows:
CRTCMOD MODULE(MYLIB/MAIN) SRCFILE(MYLIB/QCSRC) DEFINE(DEF1 DEF2=1) OPTION(*LOGMSG) OUTPUT(*PRINT)[9]
If compilation fails, output will go into a spooled file in QEZJOBLOG queue. This is the most tedious task. Compile, check output, fix problems, repeat.
Link object files to a program as follows:
CRTPGM PGM(MYLIB/MYPG) MODULE(MYLIB/*ALL) ENTMOD(*PGM) ACTGRP(*NEW) DETAIL(*BASIC)
Footnotes
- ↑ It's possible to use stream files in IFS as compiler input, but compiled objects have to be put into a QSYS.LIB, library. So, the file name restrictions apply anyway. The line length problem is mostly gone, though.
- ↑ With V4R5, IBM claims to have implemented the C90 standard in Compiler and C-Library. I did not yet find a readymade config.h with all statements needed for a C90 environment.
- ↑ Tabs appear in SEU as only one blank. This makes source indentation hardly visible.
- ↑ Wider than 80 chars, that is.
- ↑ It could be clever to create one PF per subdirectory.
- ↑ Automatic login and switching to ASCII mode is done though a ~/.netrc-file.
- ↑ FTP ASCII takes care to convert ASCII to EBCDIC.
- ↑ This is a good example how to exploit the ftp server's ability to call CL commands as a replacement for rcmd.
- ↑ Possibly add SYSIFCOPT(*IFS64IO) if large file support is desired.