octave-maintainers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

FLTK on OSX to compile with non-Apple G++ (patch included)


From: Jarno Rajahalme
Subject: FLTK on OSX to compile with non-Apple G++ (patch included)
Date: Tue, 21 Dec 2010 18:12:55 +0200

Problem:
1. On OSX, FLTK (1.3) includes draw in OSX specific Objective-C/C++ 2.0 include 
files, that can only be compiled with Apple supplied GCC variants. Apple-GCC  
seems to be stuck at versions 4.0 and 4.2.

2. The included OSX headers also cause name collisions with some software that 
has not been designed to include OSX-specific header files. For example, there 
is a name collision with "Cell" as defined by the included OSX headers and 
"Cell" defined in GNU Octave. This at least when compiling 64-bit, have not 
tested this with 32-bit.

3. It would be great if it was possible to use FLTK also with non-Apple GCC 
versions, especially when compiling portable (non-OSX) code, that relies on 
FLTK for UI portability (which I presume is the whole point with FLTK !)

Solution:

Obviously FLTK needs to USE Objective-C to implement the OSX specific stuff, 
but that should not be exposed to the user of FLTK. I found out that FLTK file 
FL/mac.H includes <Carbon/Carbon.h>, even though the definitions in that file 
only use a very, very small fraction of the stuff drawn in. In the same spirit 
that FL/mac.H already defined CGFloat (if needed), I tested if the few needed 
definitions could be done in FL/mac.H directly, so that FLTK applications would 
not have to compiled with a Objective-C 2.0 compatible compiler.

The resulting FL/mac.H diff is below. To use FLTK without including OSX 
includes, you should have the symbol __CARBON__ defined. For compiling GNU 
Octave I added "-D__CARBON__" into FLTK_CFLAGS in Octave's configure.ac. Having 
__CARBON__ defined makes #include <Carbon/Carbon.h> (in FL/mac.H) to have no 
effect and the additions to FL/mac.H (below) kick in.

Obviously, when compiling FLTK itself (with Apple GCC, no less), "__CARBON__" 
should not be defined in advance. In this case none of the changes in FL/mac.H 
have any effect.

With these changes the above mentioned "Cell" symbol clash also disappears (as 
OSX headers are not included), and Octave compiles and runs with FLTK backend, 
even when compiled with non-Apple GCC.

Now I have exactly the same behavior for FLTK as before using Apple GCC 4.2, 
but now using GCC 4.5.1 instead.

Please feel free to add these changes to FLTK, if you see portable support for 
non-Apple compilers useful in OSX.

Regards,

  Jarno Rajahalme


Diffs from a recent weekly FLTK 1.3 shapshot (8048) FL/mac.H:

$ diff -c fltk-1.3.x-r8048/FL/mac.H /opt/local/include/FL/mac.H
*** fltk-1.3.x-r8048/FL/mac.H   Wed Dec  1 19:48:59 2010
--- /opt/local/include/FL/mac.H Tue Dec 21 13:56:41 2010
***************
*** 50,56 ****
  #define MAC_OS_X_VERSION_10_6 1060
  #endif
  #ifndef MAC_OS_X_VERSION_MAX_ALLOWED
! #define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_10_3
  #endif
  
  #ifndef CGFLOAT_DEFINED //appears with 10.5 in CGBase.h
--- 50,56 ----
  #define MAC_OS_X_VERSION_10_6 1060
  #endif
  #ifndef MAC_OS_X_VERSION_MAX_ALLOWED
! #define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_10_6
  #endif
  
  #ifndef CGFLOAT_DEFINED //appears with 10.5 in CGBase.h
***************
*** 61,66 ****
--- 61,102 ----
  #endif
  #endif // CGFLOAT_DEFINED
  
+ #ifndef CGGEOMETRY_H_ // CoreGraphics/CGGeometry.h
+ struct CGPoint {
+   CGFloat x;
+   CGFloat y;
+ };
+ typedef struct CGPoint CGPoint;
+ struct CGSize {
+   CGFloat width;
+   CGFloat height;
+ };
+ typedef struct CGSize CGSize;
+ struct CGRect {
+   CGPoint origin;
+   CGSize size;
+ };
+ typedef struct CGRect CGRect;
+ #endif /* CGGEOMETRY_H_ */
+ 
+ #ifndef CGCONTEXT_H_ // CoreGraphics/CGContext.h
+ typedef struct CGContext *CGContextRef;
+ #endif        /* CGCONTEXT_H_ */
+ 
+ #ifndef CGIMAGE_H_ // CoreGraphics/CGImage.h
+ typedef struct CGImage *CGImageRef;
+ #endif        /* CGIMAGE_H_ */
+ 
+ #ifndef __QUICKDRAWTYPES__ // QD/QuickdrawTypes.h
+ typedef struct OpaqueWindowPtr* WindowPtr;
+ typedef WindowPtr WindowRef;
+ struct RGBColor {
+   unsigned short red;
+   unsigned short green;
+   unsigned short blue;
+ };
+ typedef struct RGBColor RGBColor;
+ #endif /* __QUICKDRAWTYPES__ */
  
  // Now make some fixes to the headers...
  #undef check                  // Dunno where this comes from...






reply via email to

[Prev in Thread] Current Thread [Next in Thread]