Date: prev next · Thread: first prev next last
2012 Archives by date, by thread · List index


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 <weimzz@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 <weimzz@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 <weimzz@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


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.