Selam,

Daha önce teknik listede de konuştuğumuz gibi pisi ile clang kullanmak için öncelikle pisi kodundaki hard-coded gcc ve g++ değerlerini pisi.conf'a taşımak gerekiyor. Bunun için ekteki yamayı yaptım. Yama, pisi.conf'ta şu değerleri tanımlayabilmemizi sağlıyor:

cc = clang
cxx = clang++
ld = ld.gold

bu değerler pisi.conf'ta tanımlı olmadığında:

cc = gcc
cxx = g++
ld = ld

gibi davranılıyor. Daha sonra öntanımlı derleyici değiştirilise sadece configfile.py'den bu değerlerin değiştirilmesi yetecek.

* Yamayı yaparken çıkan ilk sorun, clang'ın host önekli binarylere (misal x86_64-pc-linux-gnu-gcc) sahip **olmaması** oldu. Bunu kurtarmak için şöyle yaptım; eğer pisi.conf'ta tanımlanan cc/cxx/ld'nin host önekli olanları varsa öncelikli olarak onlar tercih edilecek eğer yoksa doğrudan pisi.conf'a yazılanlar kullanılacak/export edilecek.

* icecream ve ccache ile çalışabilmesine de baktım. Bunun için de icecream ve ccache'in açılabilmesi için kontrol edilen /usr/lib/ccache/bin/gcc ve /opt/icecream/bin/gcc gibi path'ler yerine, yine pisi.conf'ta tanımlanan derleyicinin, ccache ya da icecream bin dizinlerinde olup olmamasına bakılmasını sağladım. Mesela cc = xcc ve buildhelper = ccache yazıldıysa, /usr/lib/ccache/bin/xcc dosyası kontrol edilecek. (Bunun için ccache paketini de clang'ı eklemek suretiyle değiştirdim.)

* Yama uygulandığında pisi.conf'ta sadece cc ve cxx tanımlamak clang kullanmak için yeterli olacak. clang'ın ccache ile kullanılmasında da herhangi bir probleme rastlamadım. Sadece buralarda[1][2] denildiği gibi fazladan uyarı mesajları düşüyor.

* Son olarak, clang ile derlenen bir çok uygulamanın çalıştırıldığında %100 CPU harcayarak donduğunu göreceksiniz. Örneğin python bu yüzden derlenmiyor (içinden çıkan pgen inşa aşamasında kullanıldığı için takılı kalıyor), ya da ccache derlendikten sonra testlerde takılı kalıyor. Bunun sebebi de -DFORTIFY_SOURCE=2 flagi. Bunu şimdilik silmenizi tavsiye ederim clang ile derleme yapmak için. Aslında clang-trunk kullanıp denemek lazım fakat henüz fırsatım olmadı.

* İtiraz gelmediği takdirde yamayı merge edeceğim.


PS: Tüm bunlarla uğraşmadan gcc kullanmaya devam ederek LLVM'le tanışmak isteyenler depodan dragonegg'i kurup, pisi.conf'taki CFLAGS ve CXXFLAGS'a -fplugin=/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/plugin/dragonegg.so ekleyebilirler.

PS2: dragonegg gibi clang/llvm'i de system.devel içine almalı derim. Ne dersiniz? İleride öntanımlı clang'a geçilmese bile dragonegg ufak bir hamle ile kullanılabilir.

[1] http://petereisentraut.blogspot.com/2011/05/ccache-and-clang.html
[2] https://bugzilla.samba.org/show_bug.cgi?id=8118

--
Gökcen Eraslan
Index: pisi/operations/build.py
===================================================================
--- pisi/operations/build.py	(revision 38303)
+++ pisi/operations/build.py	(working copy)
@@ -407,12 +407,14 @@
         # First check icecream, if not found use ccache
         # TODO: Add support for using both of them
         if ctx.config.values.build.buildhelper == "icecream":
-            if os.path.exists("/opt/icecream/bin/gcc"):
+            if os.path.exists("/opt/icecream/bin/%s" % ctx.config.values.build.cc):
                 self.has_icecream = True
                 os.environ["PATH"] = "/opt/icecream/bin:%(PATH)s" % os.environ
+            else:
+                ctx.ui.warning(_("Specified compiler is not supported by icecream, it will be disabled."))
 
         elif ctx.config.values.build.buildhelper == "ccache":
-            if os.path.exists("/usr/lib/ccache/bin/gcc"):
+            if os.path.exists("/usr/lib/ccache/bin/%s" % ctx.config.values.build.cc):
                 self.has_ccache = True
 
                 os.environ["PATH"] = "/usr/lib/ccache/bin:%(PATH)s" \
@@ -420,6 +422,8 @@
                 # Force ccache to use /root/.ccache instead of $HOME/.ccache
                 # as $HOME can be modified through actions.py
                 os.environ["CCACHE_DIR"] = "/root/.ccache"
+            else:
+                ctx.ui.warning(_("Specified compiler is not supported by ccache, it will be disabled."))
 
     def fetch_files(self):
         self.fetch_actionsfile()
Index: pisi/actionsapi/variables.py
===================================================================
--- pisi/actionsapi/variables.py	(revision 38303)
+++ pisi/actionsapi/variables.py	(working copy)
@@ -14,6 +14,7 @@
 
 # Pisi-Core Modules
 import pisi.context as ctx
+import pisi.util
 
 # Set individual information, that are generally needed for ActionsAPI
 
@@ -34,9 +35,18 @@
     os.environ['USER_LDFLAGS'] = values.build.ldflags
     os.environ['JOBS'] = values.build.jobs
 
+    cross_cc = '%s-%s' % (values.build.host, values.build.cc)
+    cross_cxx = '%s-%s' % (values.build.host, values.build.cxx)
+    cross_ld = '%s-%s' % (values.build.host, values.build.ld)
+
+    cc = cross_cc if pisi.util.search_executable(cross_cc) else values.build.cc
+    cxx = cross_cc if pisi.util.search_executable(cross_cxx) else values.build.cxx
+    ld = cross_cc if pisi.util.search_executable(cross_ld) else values.build.ld
+
     # http://liste.pardus.org.tr/gelistirici/2009-January/016442.html
-    os.environ['CC'] = "%s-gcc" % values.build.host
-    os.environ['CXX'] = "%s-g++" % values.build.host
+    os.environ['CC'] = cc
+    os.environ['CXX'] = cxx
+    os.environ['LD'] = ld
 
 class Env(object):
     '''General environment variables used in actions API'''
Index: pisi/actionsapi/get.py
===================================================================
--- pisi/actionsapi/get.py	(revision 38303)
+++ pisi/actionsapi/get.py	(working copy)
@@ -34,6 +34,7 @@
 # Globals
 env = pisi.actionsapi.variables.glb.env
 dirs = pisi.actionsapi.variables.glb.dirs
+config = pisi.actionsapi.variables.glb.config
 generals = pisi.actionsapi.variables.glb.generals
 
 def curDIR():
@@ -183,13 +184,13 @@
     return getBinutilsInfo('as')
 
 def CC():
-    return getBinutilsInfo('gcc')
+    return getBinutilsInfo(config.values.build.cc)
 
 def CXX():
-    return getBinutilsInfo('g++')
+    return getBinutilsInfo(config.values.build.cxx)
 
 def LD():
-    return getBinutilsInfo('ld')
+    return getBinutilsInfo(config.values.build.ld)
 
 def NM():
     return getBinutilsInfo('nm')
Index: pisi/configfile.py
===================================================================
--- pisi/configfile.py	(revision 38303)
+++ pisi/configfile.py	(working copy)
@@ -30,6 +30,9 @@
 #cflags= -mtune=generic -march=i686 -O2 -pipe -fomit-frame-pointer -fstack-protector -D_FORTIFY_SOURCE=2
 #cxxflags= -mtune=generic -march=i686 -O2 -pipe -fomit-frame-pointer -fstack-protector -D_FORTIFY_SOURCE=2
 #ldflags= -Wl,-O1 -Wl,-z,relro -Wl,--hash-style=gnu -Wl,--as-needed -Wl,--sort-common
+#cc = "gcc"
+#cxx = "g++"
+#ld = "ld"
 #buildhelper = None / ccache / icecream
 #compressionlevel = 1
 #fallback = "ftp://ftp.pardus.org.tr/pub/source/2011";
@@ -87,6 +90,9 @@
     enableSandbox = True
     cflags = "-mtune=generic -march=i686 -O2 -pipe -fomit-frame-pointer -fstack-protector -D_FORTIFY_SOURCE=2"
     cxxflags = "-mtune=generic -march=i686 -O2 -pipe -fomit-frame-pointer -fstack-protector -D_FORTIFY_SOURCE=2"
+    cc = "gcc"
+    cxx = "g++"
+    ld = "ld"
     ldflags = "-Wl,-O1 -Wl,-z,relro -Wl,--hash-style=gnu -Wl,--as-needed -Wl,--sort-common"
     buildhelper = None
     compressionlevel = 1
_______________________________________________
Gelistirici mailing list
[email protected]
http://liste.pardus.org.tr/mailman/listinfo/gelistirici

Cevap