# This file is part of "Ported tools for HDL".
# This software is distributed under the terms of the zlib License.
# Copyright (c) 2010 molelord
# All rights reserved.

# Cygwin 1.7.1-1 にてビルドすることを前提としたmakefile
#
# 手順
# 1. Cygwinのインストーラ(setup.exe)で、以下のPackageを追加インストールする。
#    Devel - cygport gcc4-ada gcc4-g++ make patchutils
#    Libs  - gmp libgmp-devel libmpfr-devel mpfr
#    Web   - wget
# 2. Cygwinのプロンプトを起動し、カレントディレクトリをbuild_ghdlにする。
# 3. make download
# 4. make expand
# 5. make
# 6. make package
#
# 手順3～6は以下のようにひとまとめにすることができる。
#    make download expand all package
#
# 最終的にghdl～cygwin.tar.bz2ができるので、
#    tar -x --directory=/opt -f ghdl*cygwin.tar.bz2
# とすれば、/opt/ghdl/binにパスを通すだけでghdlが使用可能な状態になる。

MIRROR=ftp://ftp.iij.ad.jp/pub/cygwin

GHDL_VER=0.29
GHDL_SRC_Z=ghdl-$(GHDL_VER).tar.bz2
GCC_SRC_Z=gcc4-4.3.4-1-src.tar.bz2
GCC_VER=4.3.4
GCC_NAME=$(GCC_SRC_Z:-src.tar.bz2=)
AUTOCONF_BIN_Z=gcc-tools-autoconf-2.59-10.tar.bz2
PREFIX=/opt/ghdl
PKG_NAME=ghdl-$(GHDL_VER)-rX-i686-pc-cygwin.tar.bz2

WORK_DIR=work
PKG_DIR=pkg

#CPU_TYPEは
# http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/i386-and-x86_002d64-Options.html
# を見て自分のPCに適合するものを使うと、性能がよくなるかも(今は効かない)
CPU_TYPE=i686
#CPU_TYPE=core2

.DELETE_ON_ERROR :

.PHONY : all package clean download superclean expand

all : $(WORK_DIR)/$(GCC_NAME)/build/gcc/ghdl1.exe

package : all
	rm -rf $(PKG_DIR)
	mkdir -p $(PKG_DIR)/usr/bin
	cd $(WORK_DIR)/$(GCC_NAME)/build && $(MAKE) DESTDIR=$(PWD)/$(PKG_DIR) install 2>&1 | tee ../../../install.log
	mv $(PKG_DIR)/usr/bin/* $(PKG_DIR)$(PREFIX)/bin
	rm -rf $(PKG_DIR)/usr
	cd $(PKG_DIR)$(PREFIX)/bin && rm -f cpp-*.exe cyggcc*.dll cygssp*.dll \
		gcc*.exe gccbug* gcov*.exe i686*gcc*.exe
	rm -f $(PKG_DIR)$(PREFIX)/lib/libiberty.a
	cd $(PKG_DIR)$(PREFIX) && rm -rf include share/locale share/man/man7
	cd $(PKG_DIR)$(PREFIX)/share/man/man1 && rm -f cpp* gcc* gcov*
	cd $(PKG_DIR)$(PREFIX)/share/info && rm -f cpp* gcc* libgomp*
	cd $(PKG_DIR)$(PREFIX)/share/info && \
		head -16 dir > x && grep 'Misc\|ghdl' dir >> x && mv x dir
	cd $(PKG_DIR)$(PREFIX)/lib/gcc/i686-pc-cygwin/$(GCC_VER) && \
		rm -rf finclude include include-fixed install-tools \
		cc1.exe collect2.exe crt*.o lib*
	cd $(PKG_DIR)$(PREFIX) && find . -name '*.exe' -exec strip \{\} \;
	cd $(PKG_DIR)$(PREFIX) && find . -name '*.dll' -exec strip \{\} \;
	cp -p ../license/gpl.txt $(PKG_DIR)$(PREFIX)/COPYING
	cp -p $(GHDL_SRC_Z:.tar.bz2=)/README  $(PKG_DIR)$(PREFIX)
	cd $(PKG_DIR)$(PREFIX)/.. && tar jcf ../../$(PKG_NAME) ghdl

clean :
	-rm -rf $(WORK_DIR) $(PKG_DIR) $(GHDL_SRC_Z:.tar.bz2=) tracebak.o
	-rm -rf *.log
	-[ -f libgnat.a ] && cp -p libgnat.a /lib/gcc/i686-pc-cygwin/4.3.4/adalib/ && rm -f libgnat.a

$(WORK_DIR)/$(GCC_NAME)/build/gcc/ghdl1.exe : $(WORK_DIR)/$(GCC_NAME)/build/Makefile
	cd $(WORK_DIR) && cygport $(GCC_NAME).cygport compile 2>&1 | tee ../compile.log

$(WORK_DIR)/$(GCC_NAME)/build/Makefile : 
	cd $(WORK_DIR) && cygport $(GCC_NAME).cygport prep 2>&1 | tee ../prep.log

$(GHDL_SRC_Z) :
	wget http://ghdl.free.fr/$@

$(GCC_SRC_Z) :
	wget $(MIRROR)/release/gcc4/$@

$(AUTOCONF_BIN_Z) :
	wget $(MIRROR)/release/autoconf/gcc-tools-autoconf/$@

download : $(GHDL_SRC_Z) \
	$(GCC_SRC_Z) \
	$(AUTOCONF_BIN_Z)

superclean : clean
	rm -f $(GHDL_SRC_Z) \
	$(GCC_SRC_Z) \
	$(AUTOCONF_BIN_Z)
	$(PKG_NAME)

# 標準のlibgnat.aではghdl.exeとghdl1.exeがSegmentation faultになるので、
# arを使ってtracebak.oを「何もしないもの」にすげ替える
expand : tracebak.o
	mkdir -p $(WORK_DIR)
	tar -x --directory=$(WORK_DIR) -f $(GCC_SRC_Z)
	tar -xf $(GHDL_SRC_Z)
	mkdir -p $(WORK_DIR)/$(GCC_NAME)/origsrc/gcc-$(GCC_VER)/gcc
	mv $(GHDL_SRC_Z:.tar.bz2=)/vhdl $(WORK_DIR)/$(GCC_NAME)/origsrc/gcc-$(GCC_VER)/gcc
	cd $(WORK_DIR) && patch -p1 -i ../ghdl-$(GHDL_VER).patch
	tar -x --directory=/ -f $(AUTOCONF_BIN_Z)
	cp -p /lib/gcc/i686-pc-cygwin/4.3.4/adalib/libgnat.a ./
	ar -r /lib/gcc/i686-pc-cygwin/4.3.4/adalib/libgnat.a tracebak.o

tracebak.o : tracebak.c
	gcc -c tracebak.c
