ref: 0f35b042e02e23cc6fb29d805d25aa85679274eb
parent: cb4a943bc4d24d48eeb5d1515c5acd880c4a82ab
author: David Turner <david@freetype.org>
date: Mon Jul 6 06:56:36 EDT 2020
[build] Really fix multi and C++ builds. The following builds were still failing due to previous changes: make multi make multi CC="c++" make CC="c++" This patch fixes the issues, which were missing includes to get the right macro definitions in multi-build mode. Also, `FT_UNUSED' is actually used by third-party code, so move it back to `public-macros.h' to avoid breaking it. * include/freetype/config/public-macros.h (FT_EXPORT): Remove special definition for C++. (FT_UNUSED): Define here instead of... * include/freetype/config/compiler-macros.h: ... here. (FT_FUNCTION_DECLARATION): Remove special definition for C++. (FT_LOCAL_ARRAY_DEF): Fix definition. * src/cache/ftccback.h, src/lzw/ftzopen.h, src/gxvalid/gxvmort.h, src/gxvalid/gxvmorx.h: Add `FT_BEGIN_HEADER' and `FT_END_HEADER'.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,29 @@
+2020-07-07 David Turner <david@freetype.org>
+
+ [build] Really fix multi and C++ builds.
+
+ The following builds were still failing due to previous changes:
+
+ make multi
+ make multi CC="c++"
+ make CC="c++"
+
+ This patch fixes the issues, which were missing includes to get the
+ right macro definitions in multi-build mode.
+
+ Also, `FT_UNUSED' is actually used by third-party code, so move it
+ back to `public-macros.h' to avoid breaking it.
+
+ * include/freetype/config/public-macros.h (FT_EXPORT): Remove
+ special definition for C++.
+ (FT_UNUSED): Define here instead of...
+ * include/freetype/config/compiler-macros.h: ... here.
+ (FT_FUNCTION_DECLARATION): Remove special definition for C++.
+ (FT_LOCAL_ARRAY_DEF): Fix definition.
+
+ * src/cache/ftccback.h, src/lzw/ftzopen.h, src/gxvalid/gxvmort.h,
+ src/gxvalid/gxvmorx.h: Add `FT_BEGIN_HEADER' and `FT_END_HEADER'.
+
2020-07-06 David Turner <david@freetype.org>
[build] Fix multi and C++ builds.
--- a/include/freetype/config/public-macros.h
+++ b/include/freetype/config/public-macros.h
@@ -78,12 +78,22 @@
*
* FT_EXPORT( FT_Bool ) FT_Object_Method( FT_Object obj, ... );
*
+ * NOTE: This requires that all FT_EXPORT() uses are inside FT_BEGIN_HEADER ..
+ * FT_END_HEADER blocks. This guarantees that the functions are exported with
+ * C linkage, even when the header is included by a C++ source file.
*/
-#ifdef __cplusplus
-#define FT_EXPORT( x ) FT_PUBLIC_FUNCTION_ATTRIBUTE extern "C" x
-#else
#define FT_EXPORT( x ) FT_PUBLIC_FUNCTION_ATTRIBUTE extern x
+
+ /* `FT_UNUSED` indicates that a given parameter is not used -- */
+ /* this is only used to get rid of unpleasant compiler warnings. */
+ /* */
+ /* Technically, this was not meant to be part of the public API, */
+ /* but some third-party code depends on it. */
+ /* */
+#ifndef FT_UNUSED
+#define FT_UNUSED( arg ) ( (arg) = (arg) )
#endif
+
FT_END_HEADER
--- a/include/freetype/internal/compiler-macros.h
+++ b/include/freetype/internal/compiler-macros.h
@@ -29,12 +29,6 @@
# endif
#endif
- /* `FT_UNUSED` indicates that a given parameter is not used -- */
- /* this is only used to get rid of unpleasant compiler warnings. */
-#ifndef FT_UNUSED
-#define FT_UNUSED( arg ) ( (arg) = (arg) )
-#endif
-
/* Fix compiler warning with sgi compiler. */
#if defined( __sgi ) && !defined( __GNUC__ )
# if defined( _COMPILER_VERSION ) && ( _COMPILER_VERSION >= 730 )
@@ -126,18 +120,13 @@
*
* FT_FUNCTION_DECLARATION(int) foo(int x);
*
- * NOTE: Technically, all FreeType headers put their function declarations
- * inside an extern "C" block, giving them C linkage. This means that using
- * this macro is only necessary within internal source files, but using it in
- * a header will be harmless.
+ * NOTE: This requires that all uses are inside FT_BEGIN_HEADER..FT_END_HEADER
+ * blocks. Which guarantees that the declarations have C linkage when the
+ * headers are included by C++ sources.
*
* NOTE: Do not use directly, use FT_LOCAL()/FT_BASE()/FT_EXPORT() instead.
*/
-#ifdef __cplusplus
-#define FT_FUNCTION_DECLARATION( x ) extern "C" x
-#else
#define FT_FUNCTION_DECLARATION( x ) extern x
-#endif
/* Same as FT_FUNCTION_DECLARATION(), but for function definitions instead.
* NOTE: Do not use directly, use FT_LOCAL_DEF()/FT_BASE_DEF()/FT_EXPORT_DEF()
@@ -171,7 +160,7 @@
* sub-directory, but are otherwise internal to the library.
*/
#define FT_LOCAL_ARRAY( x ) FT_INTERNAL_FUNCTION_ATTRIBUTE extern const x
-#define FT_LOCAL_ARRAY_DEF( x ) const x
+#define FT_LOCAL_ARRAY_DEF( x ) FT_FUNCTION_DEFINITION( const x )
/* Use FT_BASE()/FT_BASE_DEF() to declare or define an internal library
* function that are used by more than one single module.
--- a/src/cache/ftccback.h
+++ b/src/cache/ftccback.h
@@ -25,6 +25,7 @@
#include "ftcglyph.h"
#include "ftcsbits.h"
+FT_BEGIN_HEADER
FT_LOCAL( void )
ftc_inode_free( FTC_Node inode,
@@ -84,6 +85,7 @@
ftc_node_destroy( FTC_Node node,
FTC_Manager manager );
+FT_END_HEADER
#endif /* FTCCBACK_H_ */
--- a/src/gxvalid/gxvmort.h
+++ b/src/gxvalid/gxvmort.h
@@ -34,6 +34,9 @@
#include <freetype/ftsnames.h>
+FT_BEGIN_HEADER
+
+
typedef struct GXV_mort_featureRec_
{
FT_UShort featureType;
@@ -87,6 +90,8 @@
FT_Bytes limit,
GXV_Validator gxvalid );
+
+FT_END_HEADER
#endif /* GXVMORT_H_ */
--- a/src/gxvalid/gxvmorx.h
+++ b/src/gxvalid/gxvmorx.h
@@ -36,6 +36,9 @@
#include <freetype/ftsnames.h>
+FT_BEGIN_HEADER
+
+
FT_LOCAL( void )
gxv_morx_subtable_type0_validate( FT_Bytes table,
FT_Bytes limit,
@@ -61,6 +64,8 @@
FT_Bytes limit,
GXV_Validator gxvalid );
+
+FT_END_HEADER
#endif /* GXVMORX_H_ */
--- a/src/lzw/ftzopen.h
+++ b/src/lzw/ftzopen.h
@@ -24,6 +24,7 @@
#include <freetype/freetype.h>
+FT_BEGIN_HEADER
/*
* This is a complete re-implementation of the LZW file reader,
@@ -164,6 +165,8 @@
FT_ULong out_size );
/* */
+
+FT_END_HEADER
#endif /* FTZOPEN_H_ */