# $Id: Portfile,v 1.1 2006/04/23 07:55:16 mww Exp $

PortSystem 1.0

name			llvm
version			1.7
categories		lang
platforms		darwin
maintainers		mww@opendarwin.org
description		llvm is a next generation compiler infrastructure
long_description	llvm brings tools to work on the llvm intermediate \
			language incl. a C and C++ frontend.

homepage		http://llvm.org/
master_sites	http://llvm.org/releases/${version}/

set dllvm		llvm-${version}.tar.gz
set dcfront		cfrontend-${version}.source.tar.gz
set dgccppc		llvm-gcc4-${version}.powerpc-apple-darwin8.6.0.tar.gz
set dgcci386	llvm-gcc4-${version}.i686-apple-darwin8.6.1.tar.gz

distfiles		${dllvm} ${dcfront}

checksums		${dllvm} sha1 16aeb0ceb611d44be7aa2f0d88b8758f9f4d7c2f \
				${dcfront} sha1 778d96bbdf279c0758b5c8ea462f8dabb18ca32e \
				${dgccppc} sha1 91ecdbe7322da3ced5e99ad8441b3afb5bc2c596 \
				${dgcci386} sha1 b24fc165f2ff0f9df5d6092275162b6d811c2687

platform powerpc {
	distfiles-append	${dgccppc}
}

# i386 is untested, though this is "just" the bootstrap compiler
platform i386 {
	distfiles-append	${dgcci386}
}

post-extract {
	system "cd ${workpath} && ln -s llvm-gcc* llvm-gcc"
	system "cd ${workpath}/llvm-gcc/bin && ln -s gcc llvm-gcc"
	system "cd ${workpath}/llvm-gcc/bin && ln -s g++ llvm-g++"
	system "cd ${workpath}/cfrontend && mkdir build install"
}

set llvmprefix	${prefix}/lib/llvm
set tmpdir		${workpath}/tmpdir

configure.pre_args	--prefix=${llvmprefix}
configure.args	--with-llvmgccdir=${workpath}/llvm-gcc/

worksrcdir		llvm

build {
	# build llvm
	system "cd ${worksrcpath} && make all"

	# configure, build && install gcc frontend
	system "cd ${workpath}/cfrontend/build \
		&& CFEINSTALL=${workpath}/cfrontend/install \
			../src/configure --prefix=${llvmprefix} --disable-threads \
			--disable-nls --disable-shared --enable-languages=c,c++ \
			--program-prefix=llvm-"
	system "cd ${workpath}/cfrontend/build && make all"
	system "mkdir -p ${tmpdir}"
	system "cd ${workpath}/cfrontend/build && make install DESTDIR=${tmpdir}"

	# back to llvm backend
	system "cd ${worksrcpath} && ./configure --prefix=${llvmprefix} \
		--with-llvmgccdir=${tmpdir}${llvmprefix}"
	system "cd ${worksrcpath} && make all"
}

set ranlib	${worksrcpath}/Release/bin/llvm-ranlib
destroot {
	# install llvm
	system "cd ${worksrcpath} \
		&& make -C runtime install-bytecode DESTDIR=${destroot}"

	# install llvm
	xinstall -m 755 -d ${destroot}${llvmprefix}/bin ${destroot}${llvmprefix}/lib
	system "cd ${worksrcpath}/Release/bin \
		&& cp * ${destroot}${llvmprefix}/bin"
	system "cd ${worksrcpath}/Release/lib \
		&& cp * ${destroot}${llvmprefix}/lib"

	# install cfrontend
	system "cd ${workpath}/cfrontend/build && make install DESTDIR=${destroot}"

	# ranlib all libs
	system "find ${destroot}${llvmprefix} -name \\.a -exec ${ranlib} \{\} \\;"

	# symlink tools into place
	foreach bin {ar as bcanalyzer c++ cpp db dis extract g++ gcc gccbug gcov ld link nm prof ranlib stub} {
		system "cd ${destroot}${prefix}/bin \
			&& ln -s ../lib/llvm/bin/llvm-${bin} llvm-${bin}"
	}
	foreach bin {llc lli analyze bugpoint burg fpcmp llvmc gccas gccld} {
		system "cd ${destroot}${prefix}/bin \
			&& ln -s ../lib/llvm/bin/${bin} ${bin}"
	}
}

post-destroot {
	# put manpages into place
	system "cd ${destroot}${llvmprefix}/man/man1 \
		&& mv llvm-g++.1 llvm-gcc.1 ${destroot}${prefix}/share/man/man1/"

	# delete superflous manpages, info files
	system "rm -rf ${destroot}${llvmprefix}/man"
	system "rm -rf ${destroot}${llvmprefix}/info"
}
