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