Created
June 1, 2014 06:29
-
-
Save jiayun/f331db2bef429d532ea4 to your computer and use it in GitHub Desktop.
Homebrew formula for installing boost with Python 3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'formula' | |
class UniversalPython < Requirement | |
satisfy(:build_env => false) { archs_for_command("python").universal? } | |
def message; <<-EOS.undent | |
A universal build was requested, but Python is not a universal build | |
Boost compiles against the Python it finds in the path; if this Python | |
is not a universal build then linking will likely fail. | |
EOS | |
end | |
end | |
class Boost < Formula | |
homepage 'http://www.boost.org' | |
url 'https://downloads.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.bz2' | |
sha1 'cef9a0cc7084b1d639e06cd3bc34e4251524c840' | |
revision 1 | |
head 'https://github.com/boostorg/boost.git' | |
bottle do | |
cellar :any | |
revision 3 | |
sha1 "c5b6b0cad1f8ac1ce69aa6c72facfc650b0cc38a" => :mavericks | |
sha1 "682f32c155bc0b17671bf7ff4323bde489ba44b0" => :mountain_lion | |
sha1 "b62fa644ab17bbce8e5bbc20e72ee0af605e7fc8" => :lion | |
end | |
env :userpaths | |
option :universal | |
option 'with-icu', 'Build regexp engine with icu support' | |
option 'without-single', 'Disable building single-threading variant' | |
option 'without-static', 'Disable building static library variant' | |
option 'with-mpi', 'Build with MPI support' | |
option :cxx11 | |
depends_on :python3 => :optional | |
depends_on UniversalPython if build.universal? and build.with? "python" | |
if build.with? 'icu' | |
if build.cxx11? | |
depends_on 'icu4c' => 'c++11' | |
else | |
depends_on 'icu4c' | |
end | |
end | |
if build.with? 'mpi' | |
if build.cxx11? | |
depends_on 'open-mpi' => 'c++11' | |
else | |
depends_on :mpi => [:cc, :cxx, :optional] | |
end | |
end | |
stable do | |
# Patches boost::atomic for LLVM 3.4 as it is used on OS X 10.9 with Xcode 5.1 | |
# https://github.com/Homebrew/homebrew/issues/27396 | |
# https://github.com/Homebrew/homebrew/pull/27436 | |
patch :p2 do | |
url "https://github.com/boostorg/atomic/commit/6bb71fdd.diff" | |
sha1 "ca8679011d5293a7fd02cb3b97dde3515b8b2b03" | |
end | |
patch :p2 do | |
url "https://github.com/boostorg/atomic/commit/e4bde20f.diff" | |
sha1 "b68f5536474c9f543879698299bd4975538a89eb" | |
end | |
end | |
fails_with :llvm do | |
build 2335 | |
cause "Dropped arguments to functions when linking with boost" | |
end | |
def install | |
# https://svn.boost.org/trac/boost/ticket/8841 | |
if build.with? 'mpi' and build.with? 'single' | |
raise <<-EOS.undent | |
Building MPI support for both single and multi-threaded flavors | |
is not supported. Please use '--with-mpi' together with | |
'--without-single'. | |
EOS | |
end | |
if build.cxx11? and build.with? 'mpi' and build.with? 'python' | |
raise <<-EOS.undent | |
Building MPI support for Python using C++11 mode results in | |
failure and hence disabled. Please don't use this combination | |
of options. | |
EOS | |
end | |
ENV.universal_binary if build.universal? | |
# Force boost to compile using the appropriate GCC version. | |
open("user-config.jam", "a") do |file| | |
file.write "using darwin : : #{ENV.cxx} ;\n" | |
file.write "using mpi ;\n" if build.with? 'mpi' | |
end | |
# we specify libdir too because the script is apparently broken | |
bargs = ["--prefix=#{prefix}", "--libdir=#{lib}"] | |
if build.with? 'icu' | |
icu4c_prefix = Formula['icu4c'].opt_prefix | |
bargs << "--with-icu=#{icu4c_prefix}" | |
else | |
bargs << '--without-icu' | |
end | |
# Handle libraries that will not be built. | |
without_libraries = [] | |
# The context library is implemented as x86_64 ASM, so it | |
# won't build on PPC or 32-bit builds | |
# see https://github.com/Homebrew/homebrew/issues/17646 | |
if Hardware::CPU.ppc? || Hardware::CPU.is_32_bit? || build.universal? | |
without_libraries << "context" | |
# The coroutine library depends on the context library. | |
without_libraries << "coroutine" | |
end | |
# Boost.Log cannot be built using Apple GCC at the moment. Disabled | |
# on such systems. | |
without_libraries << "log" if ENV.compiler == :gcc || ENV.compiler == :llvm | |
#without_libraries << "python" if build.without? 'python' | |
without_libraries << "mpi" if build.without? 'mpi' | |
bargs << "--without-libraries=#{without_libraries.join(',')}" | |
bargs << '--with-python-version=3.4' | |
bargs << '--with-python-root=/usr/local/Cellar/python3/3.4.1/Frameworks/Python.framework/Versions/3.4' | |
bargs << '--with-python=/usr/local/Cellar/python3/3.4.1/Frameworks/Python.framework/Versions/3.4/bin/python3.4' | |
args = ["--prefix=#{prefix}", | |
"--libdir=#{lib}", | |
"-d2", | |
"-j#{ENV.make_jobs}", | |
"--layout=tagged", | |
"--user-config=user-config.jam", | |
'include="/usr/local/Cellar/python3/3.4.1/Frameworks/Python.framework/Versions/3.4/include/python3.4m"', | |
"install"] | |
if build.with? "single" | |
args << "threading=multi,single" | |
else | |
args << "threading=multi" | |
end | |
if build.with? "static" | |
args << "link=shared,static" | |
else | |
args << "link=shared" | |
end | |
args << "address-model=32_64" << "architecture=x86" << "pch=off" if build.universal? | |
# Trunk starts using "clang++ -x c" to select C compiler which breaks C++11 | |
# handling using ENV.cxx11. Using "cxxflags" and "linkflags" still works. | |
if build.cxx11? | |
args << "cxxflags=-std=c++11" | |
if ENV.compiler == :clang | |
args << "cxxflags=-stdlib=libc++" << "linkflags=-stdlib=libc++" | |
end | |
end | |
system "./bootstrap.sh", *bargs | |
system "./b2", *args | |
end | |
def caveats | |
s = '' | |
# ENV.compiler doesn't exist in caveats. Check library availability | |
# instead. | |
if Dir["#{lib}/libboost_log*"].empty? | |
s += <<-EOS.undent | |
Building of Boost.Log is disabled because it requires newer GCC or Clang. | |
EOS | |
end | |
if Hardware::CPU.ppc? || Hardware::CPU.is_32_bit? || build.universal? | |
s += <<-EOS.undent | |
Building of Boost.Context and Boost.Coroutine is disabled as they are | |
only supported on x86_64. | |
EOS | |
end | |
s | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment