Compiling Notes: Difference between revisions
Line 541: | Line 541: | ||
* https://github.com/OS2World/DEV-SAMPLES-C-PM-edctl1/blob/master/makefile | * https://github.com/OS2World/DEV-SAMPLES-C-PM-edctl1/blob/master/makefile | ||
===Generate / Link LIB=== | ===Generate / Link LIB=== | ||
* | * https://github.com/OS2World/DEV-SAMPLES-C-PM-edctl1/blob/master/makefile | ||
===Generate HLP=== | ===Generate HLP=== | ||
* | * https://github.com/OS2World/DEV-SAMPLES-C-PM-AirTrafficControlContainer/blob/master/makefile | ||
===Link MMPM - DIVE=== | ===Link MMPM - DIVE=== | ||
* | * https://github.com/OS2World/DEV-SAMPLES-C-PM-DIVE-ShowJet/blob/main/makefile |
Revision as of 18:57, 18 June 2023
These are some set of light notes I took while trying to compile some old PM samples on 2023. My goal was to see how some PM samples can be compiled with open soruce tools like gcc, wrc, wl and make.
Environment
RPM Packages
I always confuse the RPM packages that I use to compile things with GCC. I want to use as much as open source tools available. Here it is what I install:
- yum install git gcc make libc-devel binutils
- watcom-wrc
- watcom-wlink-hll
Checking the Environments
Execute %INCLUDE% and see if something shows up.
PM Code Errors/Warnings with GCC
CHAR * {aka char *}
- Warning
gcc -Wall -Zomf -c -O2 bitcat2.c -o bitcat2.obj bitcat2.c: In function 'main': bitcat2.c:36:29: warning: pointer targets in passing argument 2 of 'WinRegisterClass' differ in signedness [-Wpointer-sign] 36 | WinRegisterClass(hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0); | | | | CHAR * {aka char *} In file included from W:/usr/include/os2.h:39, from bitcat2.c:4: W:/usr/include/os2emx.h:6138:47: note: expected 'PCSZ' {aka 'const unsigned char *'} but argument is of type 'CHAR *' {aka 'char *'}
- Fix
I replaced
static CHAR szClientClass[] = "BitCat2";
for
unsigned char szClientClass[] = "BitCat2";
and warnings were removed.
'WinCreateStdWindow' makes integer from pointer without a cast [-Wint-conversion]
vectfont.c:33:38: warning: passing argument 7 of 'WinCreateStdWindow' makes integer from pointer without a cast [-Wint-conversion] 33 | NULL, ID_RESOURCE, &hwndClient) ; | ^~~~ | | | void *
- Fix
I replaced the NULL by 0
weakld: error: Unresolved symbol (UNDEF)
- Error
weakld: error: Unresolved symbol (UNDEF) '_max'. weakld: info: The symbol is referenced by: C:\dev\DEV-SAMPLES-PM-VectFont\vf00.obj C:\dev\DEV-SAMPLES-PM-VectFont\vf14.obj weakld: error: Unresolved symbol (UNDEF) '_min'. weakld: info: The symbol is referenced by: C:\dev\DEV-SAMPLES-PM-VectFont\vf00.obj C:\dev\DEV-SAMPLES-PM-VectFont\vf05.obj C:\dev\DEV-SAMPLES-PM-VectFont\vf14.obj Ignoring unresolved externals reported from weak prelinker. Warning! W1058: file ldgVmPcu.: line(35): protmode option not valid for an OS/2 EMX executable Error! E2028: _max is an undefined reference Error! E2028: _min is an undefined reference file C:\dev\DEV-SAMPLES-PM-VectFont\vf00.obj(vf00.obj): undefined symbol _max file C:\dev\DEV-SAMPLES-PM-VectFont\vf00.obj(vf00.obj): undefined symbol _min
- Fix
Include to the .H file the following missing:
#ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif
weakld: error: Unresolved symbol (UNDEF)
- Error
- Fix
Removed this from .def
EXPORTS OBJECTWINPROC CLIENTWINPROC
'WinSendMsg' makes pointer from integer without a cast
- Warning
vectfont.c:36:18: warning: passing argument 3 of 'WinSendMsg' makes pointer from integer without a cast [-Wint-conversion] 36 | WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE), | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | HPOINTER {aka long unsigned int} In file included from C:/usr/include/os2.h:39, from vectfont.c:7: C:/usr/include/os2emx.h:5819:59: note: expected 'MPARAM' {aka 'void *'} but argument is of type 'HPOINTER' {aka 'long unsigned int'} 5819 | MRESULT APIENTRY WinSendMsg (HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2); | ~~~~~~~^~~
- Fix
Changed:
WinSendMsg (hwndFrame, WM_SETICON, WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, FALSE), NULL) ;
To:
WinSendMsg (hwndFrame, WM_SETICON, (MPARAM) WinQuerySysPointer (HWND_DESKTOP, SPTR_APPICON, (BOOL) FALSE), NULL) ;
warning: pointer targets in passing argument 4 of 'GpiCharStringAt' differ in signedness
- Warning
vf01.c: In function 'Display_24Point': vf01.c:44:38: warning: pointer targets in passing argument 4 of 'GpiCharStringAt' differ in signedness [-Wpointer-sign] 44 | szFacename[iFont]) ; | ~~~~~~~~~~^~~~~~~ | | | CHAR * {aka char *} In file included from C:/usr/include/os2.h:39, from vf01.c:6: C:/usr/include/os2emx.h:9050:11: note: expected 'PCCH' {aka 'const unsigned char *'} but argument is of type 'CHAR *' {aka 'char *'} 9050 | PCCH pchString); | ~~~~~^~~~~~~~~
- Fix
Changed
GpiCharStringAt (hps, &ptl, (LONG) strlen (szFacename[iFont]), szFacename[iFont]) ;
to
GpiCharStringAt (hps, &ptl, (LONG) strlen (szFacename[iFont]), (PCCH) szFacename[iFont]) ;
warning: pointer targets in passing argument 3 of 'GpiCharString' differ in signedness [-Wpointer-sign]
- Warning
vf01.c:46:36: warning: pointer targets in passing argument 3 of 'GpiCharString' differ in signedness [-Wpointer-sign] 46 | GpiCharString (hps, 10L, " - abcdefg") ; | ^~~~~~~~~~~~ | | | char * In file included from C:/usr/include/os2.h:39, from vf01.c:6: C:/usr/include/os2emx.h:9048:57: note: expected 'PCCH' {aka 'const unsigned char *'} but argument is of type 'char *' 9048 | LONG APIENTRY GpiCharString (HPS hps, LONG lCount, PCCH pchString); | ~~~~~^~~~~~~~~
- Fix
Changed
GpiCharString (hps, 10L, " - abcdefg") ;
to
GpiCharString (hps, 10L, (PCCH) " - abcdefg") ;
warning: missing braces around initializer
- Warning
vectfont.c:55:34: warning: missing braces around initializer [-Wmissing-braces] 55 | vectfont [] = { | ^
- Fix
Changed
vectfont [] = { IDM_NOTHING, NULL, IDM_24POINT, Display_24Point, IDM_MIRROR, Display_Mirror, IDM_STRETCH, Display_Stretch, IDM_CHARANGLE, Display_CharAngle, IDM_ROTATE, Display_Rotate, IDM_CHARSHEAR, Display_CharShear, IDM_SHADOW, Display_Shadow, IDM_HOLLOW, Display_Hollow, IDM_DROPSHADOW, Display_DropShadow, IDM_BLOCK, Display_Block, IDM_NEON, Display_Neon, IDM_FADE, Display_Fade, IDM_SPOKES, Display_Spokes, IDM_WAVY, Display_Wavy, IDM_MODSPOKES, Display_ModSpokes } ;
To
vectfont [] = { {IDM_NOTHING, NULL}, {IDM_24POINT, Display_24Point}, {IDM_MIRROR, Display_Mirror}, {IDM_STRETCH, Display_Stretch}, {IDM_CHARANGLE, Display_CharAngle}, {IDM_ROTATE, Display_Rotate}, {IDM_CHARSHEAR, Display_CharShear}, {IDM_SHADOW, Display_Shadow}, {IDM_HOLLOW, Display_Hollow}, {IDM_DROPSHADOW, Display_DropShadow}, {IDM_BLOCK, Display_Block}, {IDM_NEON, Display_Neon}, {IDM_FADE, Display_Fade}, {IDM_SPOKES, Display_Spokes}, {IDM_WAVY, Display_Wavy}, {IDM_MODSPOKES, Display_ModSpokes} } ;
expected '=', ',', ';', 'asm' or '__attribute__' before
- Error
APP.h:26:20: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'KidWndProc' 26 | MRESULT FAR PASCAL KidWndProc ( HWND, USHORT, MPARAM, MPARAM );
- Fix
Changed
MRESULT FAR PASCAL KidWndProc ( HWND, USHORT, MPARAM, MPARAM );
to
MRESULT EXPENTRY KidWndProc ( HWND, USHORT, MPARAM, MPARAM );
MIN / MAX Missing
- Warning
atccnr.c: In function 'CnrSubclassWndProc': atccnr.c:768:33: warning: implicit declaration of function 'min'; did you mean ' main'? [-Wimplicit-function-declaration] 768 | arcp.lP = arcp.lQ = min (rclCnr.xRight, rclCnr.yTop) / 9; | ^~~ | main make: *** No rule to make target `-o', needed by `atccnr.exe'. Stop.
- Fix
Include to the .H file the following missing:
#ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif
Seems like an old .H file that came with OS/2 used to have that declared and now is missing.
line(20): protmode
- Warning
Warning! W1058: file ldSBPZPt.: line(20): protmode option not valid for an OS/2 EMX executable
- Fix
Check the protmode on the .def file. In this case it was empty so I removed it. It was not needed.
returning 'int' from a function with return type 'MRESULT'
- Warning
randrect.c:90:28: warning: returning 'int' from a function with return type 'MRESULT' {aka 'void *'} makes pointer from integer without a cast [-Wint-conversion] 90 | return 1 ; | ^
- Fix
Changed
return 1 ;
for
return (MRESULT) TRUE
- Fix2
Change for:
return ((MRESULT)TRUE) ;
warning: comparison between pointer and integer
- Warning
randrect.c:47:20: warning: comparison between pointer and integer 47 | if (hwndFrame != NULL)
- Fix
Changed
if (hwndFrame != NULL)
to
if (hwndFrame != '\0')
UNDEF
- Warning
gcc -Zomf atccnr.obj atccnr.res atccnr.def -o atccnr.exe weakld: error: Unresolved symbol (UNDEF) 'ClientWndProc'. weakld: info: The symbol is referenced by: C:/dev/DEV-SAMPLES-PM-Air_Traffic_Control_Container/atccnr.DEF Error! E2028: ClientWndProc is an undefined reference Error! E2044: exported symbol ClientWndProc not found make: *** [atccnr.exe] Error 1
- Fix
Removed the EXPORTS from "atccnr.DEF".
warning: format '%ld' expects argument of type 'long int'
- Warning
atccnr.c:485:30: warning: format '%ld' expects argument of type 'long int', but argument 4 has type 'int' [-Wformat=] 485 | sprintf (szBuf, "%s%ld", apszCallSignPrefixes [rand() % cPrefixes], | ~~^ | | | long int | %d 486 | rand() % 1000); | ~~~~~~~~~~~~~ | | | int
- Fix
Changed
sprintf (szBuf, "%s%ld", apszCallSignPrefixes [rand() % cPrefixes], rand() % 1000);
to
sprintf (szBuf, "%s%d", apszCallSignPrefixes [rand() % cPrefixes], rand() % 1000);
warning: pointer targets in initialization of 'unsigned char *'
- Warning
atccnr.c: In function 'InsertContainerRecords': atccnr.c:437:50: warning: pointer targets in initialization of 'unsigned char *' from 'char *' differ in signedness [-Wpointer-sign] 437 | static const PSZ apszCallSignPrefixes [] = { "AA", "DA", "UA", "TW" }; | ^~~~ atccnr.c:437:50: note: (near initialization for 'apszCallSignPrefixes[0]') atccnr.c:437:56: warning: pointer targets in initialization of 'unsigned char *' from 'char *' differ in signedness [-Wpointer-sign] 437 | static const PSZ apszCallSignPrefixes [] = { "AA", "DA", "UA", "TW" }; | ^~~~ atccnr.c:437:56: note: (near initialization for 'apszCallSignPrefixes[1]') atccnr.c:437:62: warning: pointer targets in initialization of 'unsigned char *' from 'char *' differ in signedness [-Wpointer-sign] 437 | static const PSZ apszCallSignPrefixes [] = { "AA", "DA", "UA", "TW" }; | ^~~~ atccnr.c:437:62: note: (near initialization for 'apszCallSignPrefixes[2]') atccnr.c:437:68: warning: pointer targets in initialization of 'unsigned char *' from 'char *' differ in signedness [-Wpointer-sign] 437 | static const PSZ apszCallSignPrefixes [] = { "AA", "DA", "UA", "TW" }; | ^~~~ atccnr.c:437:68: note: (near initialization for 'apszCallSignPrefixes[3]')
- Fix
All these signed/unsigned character warnings can be resolved by adding "-DOS2EMX_PLAIN_CHAR" to the compiler flags. See 'os2emx.h' for details.
gcc -Wall -Zomf -DOS2EMX_PLAIN_CHAR -c -O2 atccnr.c -o atccnr.obj
cdecl - error: expected '=', ',', ';', 'asm' or '__attribute__' before 'main'
- Error
browse.h:12:11: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'main' 12 | int cdecl main(int, char *[]); | ^~~~
- Fix
Changed
int cdecl main(int, char *[]);
to
int _cdecl main(int, char *[]);
VOID Main issue
- Error
Issue on main
- Fix
Changed
VOID main( VOID )
to
int main( VOID )
warning: implicit declaration of function 'rand' [-Wimplicit-function-declaration]
- Error
game.c:48:17: warning: implicit declaration of function 'rand' [-Wimplicit-function-declaration] 48 | pgs->playx = rand()%35; | ^~~~
- Fix
It may be that you are forgetting some .h where the function is declared.
Included on game.c
#include <stdlib.h>
VOID _CDECL FAR runThread(PCALCPARM);
- Error
VOID _CDECL FAR runThread(PCALCPARM);
- Fix
Changed
VOID _CDECL FAR runThread(PCALCPARM);
to
VOID FAR runThread(PCALCPARM);
dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
- Error
pmcolour.c: In function 'DlgProc': pmcolour.c:116:23: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] 116 | *cwdata->rgb = *((RGB *) &mp1); | ~^~~~~~~~~~~~~
- Fix
Changed Added -O1 on the compile process to remove warning.
gcc -Wall -Zomf -c -O1 pmcolour.c -o pmcolour.obj
warning: missing braces around initializer [-Wmissing-braces]
- Error
clipbrd.c:160:25: warning: missing braces around initializer [-Wmissing-braces] 160 | DRIVDATA drvdata[] = {44L, 0L, "DISPLAY", 0L}; | ^ | { { }}
- Fix
Changed
DRIVDATA drvdata[] = {44, 0L, "DISPLAY", 0L};
for
DRIVDATA drvdata[] = {{44, 0, "DISPLAY", {0}}};
warning: suggest parentheses around assignment used as truth value [-Wparentheses]
- Error
show.c:107:9: warning: suggest parentheses around assignment used as truth value [-Wparentheses] 107 | if ( rc = DirectScreenDisplay ( pbImageBottom, | ^~
- Fix
Changed
if ( rc = DirectScreenDisplay ( pbImageBottom, pbBMP + 14 + pbmfHeader->bmp2.cbFix, pbmfHeader->bmp2.cx, pbmfHeader->bmp2.cy ) )
for
if ( ( rc = DirectScreenDisplay ( pbImageBottom, pbBMP + 14 + pbmfHeader->bmp2.cbFix, pbmfHeader->bmp2.cx, pbmfHeader->bmp2.cy ) ))
Linkers
Change to WLINK
You need to add:
set EMXOMFLD_TYPE=WLINK set EMXOMFLD_LINKER=wl.exe
Remember that the Wacom Linker is "wl.exe" and is on the "watcom-wlink-hll" RPM package.
Resource Compiler
Change to WRC
You need to add:
SET EMXOMFLD_RC_TYPE=WRC SET EMXOMFLD_RC=wrc.exe
Remember that the Wacom Resource Compiler is "wrc.exe" and it is on the "watcom-wrc" RPM Package
Resource Compiler
- Error 1
Reading binary resource file walker.res (0) RC: error - Only integer TYPE allowed (). RC: 1 error detected make: *** [walker.exe] Error 1
- It is possible of an error on the SET INCLUDE directory. Type %INCLUDE% and check if it is pointing to the directory that contains OS2.H
- Error 2
[E:\PROJECTS\SAMPLEPACK\PMWALKER]make 2>&1 | tee make.out wrc -r walker.rc Open Watcom Windows and OS/2 Resource Compiler Version 2.0beta1 LA Portions Copyright (c) 1993-2002 Sybase, Inc. All Rights Reserved. Source code is available under the Sybase Open Watcom Public License. See http://www.openwatcom.org/ for details. walker.rc(2): Error! E062: Unable to open 'os2.h' make: *** [walker.res] Error 9
- It is possible of an error on the SET INCLUDE directory. Type %INCLUDE% and check if it is pointing to the directory that contains OS2.H