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