LibreOffice macOS 解决编译问题

LibreOffice 编译时依赖需要 graphite, 而graphite的编译又依赖pkg-config。但是不想使用homebrew或者 MacPorts,喜欢下载源码自己编译。
pkg-config编译成功后,并且指定了环境变量。
然而make总是报checking for bogus pkg-config... configure: error: yes, from unknown origin. This *will* break the build. Please modify your PATH variable so that $PKG_CONFIG is no longer found by configure scripts.

排查configure.ac发现pkg-config 检查出错后,就退出了。
pkg-config的作用主要是为了编译graphite,而graphite是一种“智能字体”系统,专门为处理世界上鲜为人知的语言的复杂性而开发。
然而,对于中文字体可能影响不大。试试忽略这部分功能。于是修改代码如下:

diff --git a/configure.ac b/configure.ac
index 99ccaf54f748..dbb727422dec 100644
--- a/configure.ac
+++ b/configure.ac
@@ -7099,7 +7099,8 @@ if test $_os = Darwin; then
                 if test -z "$($PKG_CONFIG --list-all |grep -v '^libpkgconf')" ; then
                     AC_MSG_RESULT([yes, accepted since no packages available in default searchpath])
                 else
-                    AC_MSG_ERROR([yes, from unknown origin. This *will* break the build. Please modify your PATH variable so that $PKG_CONFIG is no longer found by configure scripts.])
+                    # AC_MSG_ERROR([yes, from unknown origin. This *will* break the build. Please modify your PATH variable so that $PKG_CONFIG is no longer found by configure scripts.])
+                    echo here ;
                 fi
             fi
         fi

注掉后,执行make,果然成功了。

macOS pkg-config编译

下载源码

curl http://pkgconfig.freedesktop.org/releases/pkg-config-0.29.2.tar.gz -o pkg-config-0.29.2.tar.gz

编译

tar -xf pkg-config-0.29.2.tar.gz
cd pkg-config-0.29.2
./configure  --with-internal-glib
make

执行make 时报错

gatomic.c:392:10: error: incompatible integer to pointer conversion passing 'gssize' (aka 'long') to parameter of type 'gpointer' (aka 'void *') [-Wint-conversion]
  392 |   return g_atomic_pointer_add ((volatile gpointer *) atomic, val);
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./gatomic.h:170:46: note: expanded from macro 'g_atomic_pointer_add'
  170 |     (gssize) __sync_fetch_and_add ((atomic), (val));                         \
      |                                              ^~~~~
gatomic.c:416:10: error: incompatible integer to pointer conversion passing 'gsize' (aka 'unsigned long') to parameter of type 'gpointer' (aka 'void *') [-Wint-conversion]
  416 |   return g_atomic_pointer_and ((volatile gpointer *) atomic, val);
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./gatomic.h:177:45: note: expanded from macro 'g_atomic_pointer_and'
  177 |     (gsize) __sync_fetch_and_and ((atomic), (val));                          \
      |                                             ^~~~~
gatomic.c:440:10: error: incompatible integer to pointer conversion passing 'gsize' (aka 'unsigned long') to parameter of type 'gpointer' (aka 'void *') [-Wint-conversion]
  440 |   return g_atomic_pointer_or ((volatile gpointer *) atomic, val);
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./gatomic.h:184:44: note: expanded from macro 'g_atomic_pointer_or'
  184 |     (gsize) __sync_fetch_and_or ((atomic), (val));                           \
      |                                            ^~~~~
gatomic.c:464:10: error: incompatible integer to pointer conversion passing 'gsize' (aka 'unsigned long') to parameter of type 'gpointer' (aka 'void *') [-Wint-conversion]
  464 |   return g_atomic_pointer_xor ((volatile gpointer *) atomic, val);
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
./gatomic.h:191:45: note: expanded from macro 'g_atomic_pointer_xor'
  191 |     (gsize) __sync_fetch_and_xor ((atomic), (val));                          \
      |                                             ^~~~~
4 errors generated.

代码修改

diff --git a/glib/glib/gatomic.c b/glib/glib/gatomic.c
index eb2fe46..33fbddc 100644
--- a/glib/glib/gatomic.c
+++ b/glib/glib/gatomic.c
@@ -386,10 +386,10 @@ gboolean
  * Since: 2.30
  **/
 gssize
-(g_atomic_pointer_add) (volatile void *atomic,
+(g_atomic_pointer_add) (volatile gssize *atomic,
                         gssize         val)
 {
-  return g_atomic_pointer_add ((volatile gpointer *) atomic, val);
+  return g_atomic_pointer_add ((volatile gssize *) atomic, val);
 }
 
 /**
@@ -410,10 +410,10 @@ gssize
  * Since: 2.30
  **/
 gsize
-(g_atomic_pointer_and) (volatile void *atomic,
+(g_atomic_pointer_and) (volatile gsize *atomic,
                         gsize          val)
 {
-  return g_atomic_pointer_and ((volatile gpointer *) atomic, val);
+  return g_atomic_pointer_and ((volatile gsize *) atomic, val);
 }
 
 /**
@@ -434,10 +434,10 @@ gsize
  * Since: 2.30
  **/
 gsize
-(g_atomic_pointer_or) (volatile void *atomic,
+(g_atomic_pointer_or) (volatile gsize *atomic,
                        gsize          val)
 {
-  return g_atomic_pointer_or ((volatile gpointer *) atomic, val);
+  return g_atomic_pointer_or ((volatile gsize *) atomic, val);
 }
 
 /**
@@ -458,10 +458,10 @@ gsize
  * Since: 2.30
  **/
 gsize
-(g_atomic_pointer_xor) (volatile void *atomic,
+(g_atomic_pointer_xor) (volatile gsize *atomic,
                         gsize          val)
 {
-  return g_atomic_pointer_xor ((volatile gpointer *) atomic, val);
+  return g_atomic_pointer_xor ((volatile gsize *) atomic, val);
 }
 
 #elif defined (G_PLATFORM_WIN32)
diff --git a/glib/glib/gatomic.h b/glib/glib/gatomic.h
index e7fd1f2..21746da 100644
--- a/glib/glib/gatomic.h
+++ b/glib/glib/gatomic.h
@@ -66,16 +66,16 @@ gboolean                g_atomic_pointer_compare_and_exchange (volatile void  *a
                                                                gpointer        oldval,
                                                                gpointer        newval);
 GLIB_AVAILABLE_IN_ALL
-gssize                  g_atomic_pointer_add                  (volatile void  *atomic,
+gssize                  g_atomic_pointer_add                  (volatile gssize  *atomic,
                                                                gssize          val);
 GLIB_AVAILABLE_IN_2_30
-gsize                   g_atomic_pointer_and                  (volatile void  *atomic,
+gsize                   g_atomic_pointer_and                  (volatile gsize  *atomic,
                                                                gsize           val);
 GLIB_AVAILABLE_IN_2_30
-gsize                   g_atomic_pointer_or                   (volatile void  *atomic,
+gsize                   g_atomic_pointer_or                   (volatile gsize  *atomic,
                                                                gsize           val);
 GLIB_AVAILABLE_IN_ALL
-gsize                   g_atomic_pointer_xor                  (volatile void  *atomic,
+gsize                   g_atomic_pointer_xor                  (volatile gsize  *atomic,
                                                                gsize           val);
 
 GLIB_DEPRECATED_IN_2_30_FOR(g_atomic_add)
diff --git a/glib/glib/gdataset.c b/glib/glib/gdataset.c
index 006bdc1..1793716 100644
--- a/glib/glib/gdataset.c
+++ b/glib/glib/gdataset.c
@@ -1188,7 +1188,7 @@ g_datalist_set_flags (GData **datalist,
   g_return_if_fail (datalist != NULL);
   g_return_if_fail ((flags & ~G_DATALIST_FLAGS_MASK) == 0);
 
-  g_atomic_pointer_or (datalist, (gsize)flags);
+  g_atomic_pointer_or ((gsize *)datalist, (gsize)flags);
 }
 
 /**
@@ -1211,7 +1211,7 @@ g_datalist_unset_flags (GData **datalist,
   g_return_if_fail (datalist != NULL);
   g_return_if_fail ((flags & ~G_DATALIST_FLAGS_MASK) == 0);
 
-  g_atomic_pointer_and (datalist, ~(gsize)flags);
+  g_atomic_pointer_and ((gssize *)datalist, ~(gsize)flags);
 }
 
 /**

再次编译成功