A big kudos to Kristian Rietveld for his hard work described here
http://wiki.documentfoundation.org/Development/Building_LibreOffice_with_Clang

So for what it's worth, here's the route I took (by no means ideal). I
built LibO 3.6.0alpha using clang 3.1 on Ubuntu 11.04 Natty 32 bits
and

./autogen.sh CC=clang CXX=clang++

It built eventually, but barely. I was even surprised that it executed
successfully too.

The main modifications I made were
1. stlport (stl/_locale.h new operator unrecognised). This was
addressed by August Sodora (4th patch) here, although I patched it
differently.
http://lists.freedesktop.org/archives/libreoffice/2012-January/023182.html

2. nss (unix/os_Linux_x86.s asterix as comment character). Also
mentioned by Stephen Bergmann here
http://lists.freedesktop.org/archives/libreoffice/2012-January/023189.html

3. moz (missing this pointers/default constructor). Mentioned by
Julien2412, Stephen and others.
http://lists.freedesktop.org/archives/libreoffice/2012-February/025966.html

4. connectivity (typedef for CardPropertyGetter/Setter in
connectivity/source/drivers/mozab/mozillasrc/MLdapAttributeMap.cxx).
The patch was submitted here
http://lists.freedesktop.org/archives/libreoffice/2012-February/026435.html

Other issues.
5. cairo (disable mutexes). Julien ran into this, I decided to simply
disable multi-threading in cairo (not too clear what this has to do
with clang though)
http://lists.freedesktop.org/archives/libreoffice/2012-February/026195.html

6. incompatible -std=c++0x option. Not sure what the deal is here, but
I gather there's some discrepancy between what gcc and clang
understand is the "standard C++ library(tm)".

7. Macros in sw are broken in the clang-build it seems. Yet to figure out why.

8. There was a bug which I attribute to clang. The
warn_attribute_not_on_decl diagnostic was defined as an error instead
of a warning. I can't remember when it comes up, but error message
contained the phrase "... attribute ignored when parsing type ...".

9. I'm not sure why I didn't run into the -fvisibility=hidden bug
discovered by Stephen. I suspect this flag has been made optional(?).
The bug is here
http://llvm.org/bugs/show_bug.cgi?id=11250

Future plans
I plan to try out the clang static analyzer, and if I survive that
maybe I'll give KLEE a go.

Apologies for the lengthy post.

Regards,
Wei Ming
From 7dae78fc4759488a7dd97a3e781c24e42e86364a Mon Sep 17 00:00:00 2001
From: Wei Ming Khoo <wei...@gmail.com>
Date: Sun, 19 Feb 2012 15:56:46 +0000
Subject: [PATCH 1/6] stlport stl/_locale.h new operator unrecognized

---
 stlport/STLport-4.5-clang_locale_h.patch |   11 +++++++++++
 stlport/makefile.mk                      |    3 ++-
 2 files changed, 13 insertions(+), 1 deletions(-)
 create mode 100644 stlport/STLport-4.5-clang_locale_h.patch

diff --git a/stlport/STLport-4.5-clang_locale_h.patch b/stlport/STLport-4.5-clang_locale_h.patch
new file mode 100644
index 0000000..8cbfbfc
--- /dev/null
+++ b/stlport/STLport-4.5-clang_locale_h.patch
@@ -0,0 +1,11 @@
+--- misc/STLport-4.5/stlport/stl/_locale.h	2001-07-06 05:16:18.000000000 +0100
++++ misc/build/STLport-4.5/stlport/stl/_locale.h	2012-02-18 18:17:18.338109337 +0000
+@@ -120,7 +120,7 @@
+   locale(const locale& __loc, _Facet* __f) : _M_impl(0)
+     {
+       //      _M_impl = this->_S_copy_impl(__loc._M_impl, __f != 0);
+-      new(this) locale(__loc._M_impl, __f != 0);
++      new locale(__loc._M_impl, __f != 0);
+       if (__f != 0)
+         this->_M_insert(__f, _Facet::id);
+     }
diff --git a/stlport/makefile.mk b/stlport/makefile.mk
index 9211a5e..3e4a8de 100644
--- a/stlport/makefile.mk
+++ b/stlport/makefile.mk
@@ -49,7 +49,8 @@ all:
     PATCH_FILES=\
                 STLport-4.5.patch \
                 STLport-4.5-gcc43_warnings.patch \
-                STLport-4.5-cxx0x.patch
+                STLport-4.5-cxx0x.patch \
+                STLport-4.5-clang_locale_h.patch
 .ELIF "$(GUI)"=="WNT"
     TARFILE_NAME=STLport-4.5-0119
     TARFILE_MD5=7376930b0d3f3d77a685d94c4a3acda8
-- 
1.7.4.1

From 2cf8e2806fb856d379b5f5ea3564b613bcbc8f8b Mon Sep 17 00:00:00 2001
From: Wei Ming Khoo <wei...@gmail.com>
Date: Sun, 19 Feb 2012 16:00:53 +0000
Subject: [PATCH 2/6] nss unix/os_Linux_x86.s asterix as comment character

---
 nss/makefile.mk                             |    2 +-
 nss/nss-clang_os_Linux_x86_s_comments.patch |  178 +++++++++++++++++++++++++++
 2 files changed, 179 insertions(+), 1 deletions(-)
 create mode 100644 nss/nss-clang_os_Linux_x86_s_comments.patch

diff --git a/nss/makefile.mk b/nss/makefile.mk
index 4076025..744f944 100644
--- a/nss/makefile.mk
+++ b/nss/makefile.mk
@@ -48,7 +48,7 @@ VER_PATCH=8
 TARFILE_NAME=nss-$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH)-with-nspr-4.8.6
 TARFILE_MD5=71474203939fafbe271e1263e61d083e
 TARFILE_ROOTDIR=nss-$(VER_MAJOR).$(VER_MINOR).$(VER_PATCH)
-PATCH_FILES=nss.patch nss.aix.patch nss-config.patch nss-linux3.patch
+PATCH_FILES=nss.patch nss.aix.patch nss-config.patch nss-linux3.patch nss-clang_os_Linux_x86_s_comments.patch
 
 .IF "$(OS)"=="MACOSX"
 PATCH_FILES+=nss_macosx.patch
diff --git a/nss/nss-clang_os_Linux_x86_s_comments.patch b/nss/nss-clang_os_Linux_x86_s_comments.patch
new file mode 100644
index 0000000..04f2a7e
--- /dev/null
+++ b/nss/nss-clang_os_Linux_x86_s_comments.patch
@@ -0,0 +1,178 @@
+--- misc/nss-3.12.8/mozilla/nsprpub/pr/src/md/unix/os_Linux_x86.s	2006-12-11 09:45:30.000000000 +0000
++++ misc/build/nss-3.12.8/mozilla/nsprpub/pr/src/md/unix/os_Linux_x86.s	2012-02-18 20:48:10.702109102 +0000
+@@ -1,46 +1,46 @@
+-/ -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+-/ 
+-/ ***** BEGIN LICENSE BLOCK *****
+-/ Version: MPL 1.1/GPL 2.0/LGPL 2.1
+-/
+-/ The contents of this file are subject to the Mozilla Public License Version
+-/ 1.1 (the "License"); you may not use this file except in compliance with
+-/ the License. You may obtain a copy of the License at
+-/ http://www.mozilla.org/MPL/
+-/
+-/ Software distributed under the License is distributed on an "AS IS" basis,
+-/ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+-/ for the specific language governing rights and limitations under the
+-/ License.
+-/
+-/ The Original Code is the Netscape Portable Runtime (NSPR).
+-/
+-/ The Initial Developer of the Original Code is
+-/ Netscape Communications Corporation.
+-/ Portions created by the Initial Developer are Copyright (C) 2000
+-/ the Initial Developer. All Rights Reserved.
+-/
+-/ Contributor(s):
+-/
+-/ Alternatively, the contents of this file may be used under the terms of
+-/ either the GNU General Public License Version 2 or later (the "GPL"), or
+-/ the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+-/ in which case the provisions of the GPL or the LGPL are applicable instead
+-/ of those above. If you wish to allow use of your version of this file only
+-/ under the terms of either the GPL or the LGPL, and not to allow others to
+-/ use your version of this file under the terms of the MPL, indicate your
+-/ decision by deleting the provisions above and replace them with the notice
+-/ and other provisions required by the GPL or the LGPL. If you do not delete
+-/ the provisions above, a recipient may use your version of this file under
+-/ the terms of any one of the MPL, the GPL or the LGPL.
+-/
+-/ ***** END LICENSE BLOCK *****
+-
+-/ PRInt32 _PR_x86_AtomicIncrement(PRInt32 *val)
+-/
+-/ Atomically increment the integer pointed to by 'val' and return
+-/ the result of the increment.
+-/
++# -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
++# 
++# ***** BEGIN LICENSE BLOCK *****
++# Version: MPL 1.1/GPL 2.0/LGPL 2.1
++#
++# The contents of this file are subject to the Mozilla Public License Version
++# 1.1 (the "License"); you may not use this file except in compliance with
++# the License. You may obtain a copy of the License at
++# http://www.mozilla.org/MPL/
++#
++# Software distributed under the License is distributed on an "AS IS" basis,
++# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
++# for the specific language governing rights and limitations under the
++# License.
++#
++# The Original Code is the Netscape Portable Runtime (NSPR).
++#
++# The Initial Developer of the Original Code is
++# Netscape Communications Corporation.
++# Portions created by the Initial Developer are Copyright (C) 2000
++# the Initial Developer. All Rights Reserved.
++#
++# Contributor(s):
++#
++# Alternatively, the contents of this file may be used under the terms of
++# either the GNU General Public License Version 2 or later (the "GPL"), or
++# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
++# in which case the provisions of the GPL or the LGPL are applicable instead
++# of those above. If you wish to allow use of your version of this file only
++# under the terms of either the GPL or the LGPL, and not to allow others to
++# use your version of this file under the terms of the MPL, indicate your
++# decision by deleting the provisions above and replace them with the notice
++# and other provisions required by the GPL or the LGPL. If you do not delete
++# the provisions above, a recipient may use your version of this file under
++# the terms of any one of the MPL, the GPL or the LGPL.
++#
++# ***** END LICENSE BLOCK *****
++
++# PRInt32 _PR_x86_AtomicIncrement(PRInt32 *val)
++#
++# Atomically increment the integer pointed to by 'val' and return
++# the result of the increment.
++
+     .text
+     .globl _PR_x86_AtomicIncrement
+     .align 4
+@@ -52,11 +52,11 @@
+     incl %eax
+     ret
+ 
+-/ PRInt32 _PR_x86_AtomicDecrement(PRInt32 *val)
+-/
+-/ Atomically decrement the integer pointed to by 'val' and return
+-/ the result of the decrement.
+-/
++# PRInt32 _PR_x86_AtomicDecrement(PRInt32 *val)
++#
++# Atomically decrement the integer pointed to by 'val' and return
++# the result of the decrement.
++
+     .text
+     .globl _PR_x86_AtomicDecrement
+     .align 4
+@@ -68,25 +68,25 @@
+     decl %eax
+     ret
+ 
+-/ PRInt32 _PR_x86_AtomicSet(PRInt32 *val, PRInt32 newval)
+-/
+-/ Atomically set the integer pointed to by 'val' to the new
+-/ value 'newval' and return the old value.
+-/
+-/ An alternative implementation:
+-/   .text
+-/   .globl _PR_x86_AtomicSet
+-/   .align 4
+-/_PR_x86_AtomicSet:
+-/   movl 4(%esp), %ecx
+-/   movl 8(%esp), %edx
+-/   movl (%ecx), %eax
+-/retry:
+-/   lock
+-/   cmpxchgl %edx, (%ecx)
+-/   jne retry
+-/   ret
+-/
++# PRInt32 _PR_x86_AtomicSet(PRInt32 *val, PRInt32 newval)
++#
++# Atomically set the integer pointed to by 'val' to the new
++# value 'newval' and return the old value.
++#
++# An alternative implementation:
++#   .text
++#   .globl _PR_x86_AtomicSet
++#   .align 4
++#_PR_x86_AtomicSet:
++#   movl 4(%esp), %ecx
++#   movl 8(%esp), %edx
++#   movl (%ecx), %eax
++#retry:
++#   lock
++#   cmpxchgl %edx, (%ecx)
++#   jne retry
++#   ret
++
+     .text
+     .globl _PR_x86_AtomicSet
+     .align 4
+@@ -96,11 +96,11 @@
+     xchgl %eax, (%ecx)
+     ret
+ 
+-/ PRInt32 _PR_x86_AtomicAdd(PRInt32 *ptr, PRInt32 val)
+-/
+-/ Atomically add 'val' to the integer pointed to by 'ptr'
+-/ and return the result of the addition.
+-/
++# PRInt32 _PR_x86_AtomicAdd(PRInt32 *ptr, PRInt32 val)
++#
++# Atomically add 'val' to the integer pointed to by 'ptr'
++# and return the result of the addition.
++
+     .text
+     .globl _PR_x86_AtomicAdd
+     .align 4
+@@ -113,5 +113,5 @@
+     addl %edx, %eax
+     ret
+ 
+-/ Magic indicating no need for an executable stack
++# Magic indicating no need for an executable stack
+ .section .note.GNU-stack, "", @progbits ; .previous
-- 
1.7.4.1

From 4aea134089bb4c07ede44f5e32a067d59d981dc3 Mon Sep 17 00:00:00 2001
From: Wei Ming Khoo <wei...@gmail.com>
Date: Sun, 19 Feb 2012 16:05:29 +0000
Subject: [PATCH 3/6] moz missing this pointers, default constructor

---
 moz/makefile.mk                                    |    3 +-
 ...itiveStringComparator_default_constructor.patch |   10 +++
 moz/patches/clang_missing_this_pointers.patch      |   71 ++++++++++++++++++++
 3 files changed, 83 insertions(+), 1 deletions(-)
 create mode 100644 moz/patches/clang_add_nsCaseInsensitiveStringComparator_default_constructor.patch
 create mode 100644 moz/patches/clang_missing_this_pointers.patch

diff --git a/moz/makefile.mk b/moz/makefile.mk
index eedae25..7f926e5 100644
--- a/moz/makefile.mk
+++ b/moz/makefile.mk
@@ -86,7 +86,8 @@ PATCH_FILES = \
     patches/libpr0n_build_fix.patch \
     patches/macosx_build_fix.patch \
     patches/nss-linux3.patch \
-
+    patches/clang_add_nsCaseInsensitiveStringComparator_default_constructor.patch \
+    patches/clang_missing_this_pointers.patch \
 
 # This file is needed for the W32 build when BUILD_MOZAB is set
 # (currently only vc8/vs2005 is supported when BUILD_MOZAB is set)
diff --git a/moz/patches/clang_add_nsCaseInsensitiveStringComparator_default_constructor.patch b/moz/patches/clang_add_nsCaseInsensitiveStringComparator_default_constructor.patch
new file mode 100644
index 0000000..c2ff5d2
--- /dev/null
+++ b/moz/patches/clang_add_nsCaseInsensitiveStringComparator_default_constructor.patch
@@ -0,0 +1,10 @@
+--- misc/mozilla/intl/unicharutil/util/nsUnicharUtils.h	2008-08-30 00:14:52.000000000 +0100
++++ misc/build/mozilla/intl/unicharutil/util/nsUnicharUtils.h	2012-02-18 20:12:51.590109117 +0000
+@@ -64,6 +64,7 @@
+     : public nsStringComparator
+   {
+     public:
++      nsCaseInsensitiveStringComparator(){};
+       virtual int operator()( const PRUnichar*, const PRUnichar*, PRUint32 aLength ) const;
+       virtual int operator()( PRUnichar, PRUnichar ) const;
+   };
diff --git a/moz/patches/clang_missing_this_pointers.patch b/moz/patches/clang_missing_this_pointers.patch
new file mode 100644
index 0000000..d92434f
--- /dev/null
+++ b/moz/patches/clang_missing_this_pointers.patch
@@ -0,0 +1,71 @@
+--- misc/mozilla/xpcom/glue/nsBaseHashtable.h	2005-09-27 16:44:20.000000000 +0100
++++ misc/build/mozilla/xpcom/glue/nsBaseHashtable.h	2012-02-18 18:43:55.386109066 +0000
+@@ -123,7 +123,7 @@
+    */
+   PRBool Get(KeyType aKey, UserDataType* pData) const
+   {
+-    EntryType* ent = GetEntry(aKey);
++    EntryType* ent = this->GetEntry(aKey);
+ 
+     if (!ent)
+       return PR_FALSE;
+@@ -142,7 +142,7 @@
+    */
+   PRBool Put(KeyType aKey, UserDataType aData)
+   {
+-    EntryType* ent = PutEntry(aKey);
++    EntryType* ent = this->PutEntry(aKey);
+ 
+     if (!ent)
+       return PR_FALSE;
+@@ -156,7 +156,7 @@
+    * remove the data for the associated key
+    * @param aKey the key to remove from the hashtable
+    */
+-  void Remove(KeyType aKey) { RemoveEntry(aKey); }
++  void Remove(KeyType aKey) { this->RemoveEntry(aKey); }
+ 
+   /**
+    * function type provided by the application for enumeration.
+--- misc/mozilla/xpcom/glue/nsClassHashtable.h	2005-08-11 20:42:37.000000000 +0100
++++ misc/build/mozilla/xpcom/glue/nsClassHashtable.h	2012-02-18 18:40:32.810109050 +0000
+@@ -98,7 +98,7 @@
+ nsClassHashtable<KeyClass,T>::Get(KeyType aKey, T** retVal) const
+ {
+   typename nsBaseHashtable<KeyClass,nsAutoPtr<T>,T*>::EntryType* ent =
+-    GetEntry(aKey);
++    this->GetEntry(aKey);
+ 
+   if (ent)
+   {
+--- misc/mozilla/xpcom/glue/nsInterfaceHashtable.h	2005-08-11 20:42:48.000000000 +0100
++++ misc/build/mozilla/xpcom/glue/nsInterfaceHashtable.h	2012-02-18 18:43:01.794109091 +0000
+@@ -111,7 +111,7 @@
+   (KeyType aKey, UserDataType* pInterface) const
+ {
+   typename nsBaseHashtable<KeyClass, nsCOMPtr<Interface>, Interface*>::EntryType* ent =
+-    GetEntry(aKey);
++    this->GetEntry(aKey);
+ 
+   if (ent)
+   {
+@@ -139,7 +139,7 @@
+   (KeyType aKey, PRBool* aFound) const
+ {
+   typename nsBaseHashtable<KeyClass, nsCOMPtr<Interface>, Interface*>::EntryType* ent =
+-    GetEntry(aKey);
++    this->GetEntry(aKey);
+ 
+   if (ent)
+   {
+--- misc/mozilla/xpcom/glue/nsRefPtrHashtable.h	2005-08-11 20:42:51.000000000 +0100
++++ misc/build/mozilla/xpcom/glue/nsRefPtrHashtable.h	2012-02-18 19:02:20.634109082 +0000
+@@ -140,7 +140,7 @@
+   (KeyType aKey, PRBool* aFound) const
+ {
+   typename nsBaseHashtable<KeyClass, nsRefPtr<RefPtr>, RefPtr*>::EntryType* ent =
+-    GetEntry(aKey);
++    this->GetEntry(aKey);
+ 
+   if (ent)
+   {
-- 
1.7.4.1

_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to