2 # This Source Code Form is subject to the terms of the Mozilla Public
3 # License, v. 2.0. If a copy of the MPL was not distributed with this
4 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
6 llvm_revision
= "183744"
8 ##############################################
21 r
= subprocess
.call(args
)
25 def run_in(path
, args
):
32 def patch(patch
, plevel
, srcdir
):
33 patch
= os
.path
.realpath(patch
)
34 check_run(['patch', '-d', srcdir
, '-p%s' % plevel
, '-i', patch
, '--fuzz=0',
38 def build_package(package_source_dir
, package_build_dir
, configure_args
,
40 if not os
.path
.exists(package_build_dir
):
41 os
.mkdir(package_build_dir
)
42 run_in(package_build_dir
,
43 ["%s/configure" % package_source_dir
] + configure_args
)
44 run_in(package_build_dir
, ["make", "-j8"] + make_args
)
45 run_in(package_build_dir
, ["make", "install"])
49 old_env
= os
.environ
.copy()
50 os
.environ
.update(env
)
53 os
.environ
.update(old_env
)
56 def build_tar_package(tar
, name
, base
, directory
):
57 name
= os
.path
.realpath(name
)
58 run_in(base
, [tar
, "-cjf", name
, directory
])
61 def svn_co(url
, directory
, revision
):
62 check_run(["svn", "co", "-r", revision
, url
, directory
])
65 def build_one_stage(env
, stage_dir
):
67 build_one_stage_aux(stage_dir
)
71 def build_tooltool_manifest():
72 basedir
= os
.path
.split(os
.path
.realpath(sys
.argv
[0]))[0]
73 tooltool
= basedir
+ '/tooltool.py'
74 setup
= basedir
+ '/setup.sh'
75 manifest
= 'clang.manifest'
76 check_run(['python', tooltool
, '-m', manifest
, 'add',
77 setup
, 'clang.tar.bz2'])
78 data
= json
.load(file(manifest
), object_pairs_hook
=collections
.OrderedDict
)
79 data
= [{'clang_version': 'r%s' % llvm_revision
}] + data
80 out
= file(manifest
, 'w')
81 json
.dump(data
, out
, indent
=0)
84 assert data
[2]['filename'] == 'clang.tar.bz2'
85 os
.rename('clang.tar.bz2', data
[2]['digest'])
87 isDarwin
= platform
.system() == "Darwin"
90 def build_one_stage_aux(stage_dir
):
93 build_dir
= stage_dir
+ "/build"
94 inst_dir
= stage_dir
+ "/clang"
96 targets
= ["x86", "x86_64"]
97 # The Darwin equivalents of binutils appear to have intermittent problems
98 # with objects in compiler-rt that are compiled for arm. Since the arm
99 # support is only necessary for iOS (which we don't support), only enable
100 # arm support on Linux.
102 targets
.append("arm")
104 configure_opts
= ["--enable-optimized",
105 "--enable-targets=" + ",".join(targets
),
106 "--disable-assertions",
107 "--prefix=%s" % inst_dir
,
108 "--with-gcc-toolchain=/tools/gcc-4.7.2-0moz1"]
109 build_package(llvm_source_dir
, build_dir
, configure_opts
,
112 # The directories end up in the debug info, so the easy way of getting
113 # a reproducible build is to run it in a know absolute directory.
114 # We use a directory in /builds/slave because the mozilla infrastructure
115 # cleans it up automatically.
116 base_dir
= "/builds/slave/moz-toolchain"
118 source_dir
= base_dir
+ "/src"
119 build_dir
= base_dir
+ "/build"
121 llvm_source_dir
= source_dir
+ "/llvm"
122 clang_source_dir
= source_dir
+ "/clang"
123 compiler_rt_source_dir
= source_dir
+ "/compiler-rt"
126 os
.environ
['MACOSX_DEPLOYMENT_TARGET'] = '10.7'
128 if not os
.path
.exists(source_dir
):
129 os
.makedirs(source_dir
)
130 svn_co("http://llvm.org/svn/llvm-project/llvm/branches/release_33",
131 llvm_source_dir
, llvm_revision
)
132 svn_co("http://llvm.org/svn/llvm-project/cfe/branches/release_33",
133 clang_source_dir
, llvm_revision
)
134 svn_co("http://llvm.org/svn/llvm-project/compiler-rt/branches/release_33",
135 compiler_rt_source_dir
, llvm_revision
)
136 os
.symlink("../../clang", llvm_source_dir
+ "/tools/clang")
137 os
.symlink("../../compiler-rt", llvm_source_dir
+ "/projects/compiler-rt")
138 patch("llvm-debug-frame.patch", 1, llvm_source_dir
)
140 patch("no-sse-on-linux.patch", 0, clang_source_dir
)
142 if os
.path
.exists(build_dir
):
143 shutil
.rmtree(build_dir
)
144 os
.makedirs(build_dir
)
146 stage1_dir
= build_dir
+ '/stage1'
147 stage1_inst_dir
= stage1_dir
+ '/clang'
152 cc
= "/usr/bin/clang"
153 cxx
= "/usr/bin/clang++"
155 extra_cflags
= "-static-libgcc"
156 extra_cxxflags
= "-static-libgcc -static-libstdc++"
160 build_one_stage({"CC": cc
, "CXX": cxx
}, stage1_dir
)
162 stage2_dir
= build_dir
+ '/stage2'
163 build_one_stage({"CC": stage1_inst_dir
+ "/bin/clang %s" % extra_cflags
,
164 "CXX": stage1_inst_dir
+ "/bin/clang++ %s" % extra_cxxflags
},
167 build_tar_package("tar", "clang.tar.bz2", stage2_dir
, "clang")
168 build_tooltool_manifest()