[squeak-dev] Building with a strict(er) C99 compiler

Florian Weimer fweimer at redhat.com
Tue Nov 29 12:10:45 UTC 2022

I'm trying to build the VM with a C compiler which does not accept
implicit function declarations or implici int.

This is in preparation for a future change in GCC and Clang defaults.
More information is here:


(The second link points to a container image with an instrumented GCC
that can be used for experiments, or you can just inject
-Werror=implicit-function-declaration -Werror=implicit-int into the
build, which has the same results if compiler flags injection works
reliably throughout the build environment.)

According to Fedora's records Squeak- was
downloaded from <http://squeakvm.org/unix/release/>.

I got passed the first obstacle with these little changes:

diff -ur Squeak- Squeak-
--- Squeak-	2006-09-14 19:52:45.000000000 +0200
+++ Squeak-	2022-11-29 12:30:00.834158643 +0100
@@ -20,4 +20,6 @@
 int ioGatherEntropy(char *bufPtr, int bufSize);
+int triBoxOverlap(float *a, float *b, float *c, float *d, float *e);
 #endif /* CROQUET_PLUGIN_H */
diff -ur Squeak- Squeak-
--- Squeak-	2009-05-26 23:15:18.000000000 +0200
+++ Squeak-	2022-11-29 12:30:10.184066148 +0100
@@ -1,3 +1,5 @@
+#include "CroquetPlugin.h"
 /* a stub for triboxoverlap */
 int triBoxOverlap(float *a, float *b, float *c, float *d, float *e) {
   return 0;
diff -ur Squeak- Squeak-
--- Squeak-	2009-08-27 03:48:06.000000000 +0200
+++ Squeak-	2022-11-29 13:02:56.418443376 +0100
@@ -6,9 +6,13 @@
 #pragma export on
 int serialPortClose(int portNum);
+int serialPortCloseByName(const char *portName);
 int serialPortCount(void);
 int serialPortOpen(int portNum, int baudRate, int stopBitsType, int parityType, int dataBits,
 		   int inFlowCtrl, int outFlowCtrl, int xOnChar, int xOffChar);
+int serialPortOpenByName(char *portName, int dataRate, int stopBitsType, int parityType, int dataBits,
+			 int inFlowCtrl, int outFlowCtrl, int xOnChar, int xOffChar);
 int serialPortReadInto(int portNum, int count, void *bufferPtr);
 int serialPortReadIntoByName(const char *portName, int count, void *bufferPtr);
 int serialPortWriteFrom(int portNum, int count, void *bufferPtr);
diff -ur Squeak- Squeak-
--- Squeak-	2006-10-18 19:10:25.000000000 +0200
+++ Squeak-	2022-11-29 12:30:44.062730997 +0100
@@ -142,7 +142,7 @@
   return fp;
-INLINE static allocateBuffer(struct FileBuf *buf, int size)
+INLINE static int allocateBuffer(struct FileBuf *buf, int size)
   if (buf->capacity >= size)
     return 1;

A few more changes like these seem to be needed.

But now I'm hitting this error:

…/unix/src/vm/intplugins/MiscPrimitivePlugin/MiscPrimitivePlugin.c:118: implicit function declaration: isBytes

This error is harder to deal with because it seems to be a bug in the
code generator.  There probably should be a macro definition for isBytes
similar to arrayValueOf, like this:

#define isBytes(oop) (interpreterProxy->isBytes(oop))

Otherwise, the global function definition is picked up instead, and that
does not seem to be the right pattern.


More information about the Squeak-dev mailing list