#!/usr/local/bin/tclsh # # ---------------------------------------------------------------------------- # "THE BEER-WARE LICENSE" (Revision 42): # wrote this file. As long as you retain this notice you # can do whatever you want with this stuff. If we meet some day, and you think # this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp # ---------------------------------------------------------------------------- # # $FreeBSD$ # source gnu2bmake.tcl ####################################################################### # Parameters to tweak ######## set sdir /u7/gcc-2.6.0 set ddir /usr/src/gnu/usr.bin/cc26 ####################################################################### # Do the stunt ######## sh "cd $sdir ; sh configure" # .h files on their way to ~/include set l_include {config tm pcp tree input c-lex c-tree flags machmode real rtl c-parse c-gperf function defaults convert obstack insn-attr bytecode bc-emit insn-flags expr insn-codes regs hard-reg-set insn-config loop recog bc-typecd bc-opcode bc-optab typeclass output basic-block reload integrate conditions bytetypes bi-run bc-arity multilib stack} # other files on their way to ~/include set l_include_x {tree.def machmode.def rtl.def modemap.def bc-typecd.def} # .h files going into ~/include/i386 set l_include_i386 {perform gstabs gas bsd i386 unix } # .c source for cpp set l_cpp {cccp cexp version} # .c source for cc1 set l_cc1 [zap_suffix [makefile_macro C_OBJS $sdir]] append l_cc1 " " [zap_suffix [makefile_macro OBJS $sdir]] append l_cc1 " " [zap_suffix [makefile_macro BC_OBJS $sdir]] # .c source for cc set l_cc {gcc version} append l_cc " " [zap_suffix [makefile_macro OBSTACK $sdir]] # .c source for c++ set l_cplus [zap_suffix [makefile_macro OBSTACK $sdir]] # .c source for c++ from "cp" subdir set l_cplus_cp {g++} # .c source for cc1plus set l_cc1plus {c-common} append l_cc1plus " " [zap_suffix [makefile_macro OBJS $sdir]] append l_cc1plus " " [zap_suffix [makefile_macro BC_OBJS $sdir]] # .c source for cc1plus from "cp" subdir set l_cc1plus_cp {} append l_cc1plus_cp " " [zap_suffix [makefile_macro CXX_OBJS $sdir/cp]] # .h file for cc1plus from "cp" subdir set l_cc1plus_h {lex parse cp-tree decl class hash} # other file for cc1plus from "cp" subdir set l_cc1plus_x {tree.def input.c} # All files used more than once go into the lib. set l_common [common_set $l_cpp $l_cc1 $l_cc $l_cc1plus $l_cplus] set l_cpp [reduce_by $l_cpp $l_common] set l_cc1 [reduce_by $l_cc1 $l_common] set l_cc [reduce_by $l_cc $l_common] set l_cplus [reduce_by $l_cplus $l_common] set l_cc1plus [reduce_by $l_cc1plus $l_common] # functions in libgcc1 set l_libgcc1 [makefile_macro LIB1FUNCS $sdir] # functions in libgcc2 set l_libgcc2 [makefile_macro LIB2FUNCS $sdir] # .c files in libgcc set l_libgcc {libgcc1.c libgcc2.c} # .h files in libgcc set l_libgcc_h {tconfig longlong glimits gbl-ctors} set version [makefile_macro version $sdir] set target [makefile_macro target $sdir] # do ~ sh "rm -rf $ddir" sh "mkdir $ddir" set f [open $ddir/Makefile.inc w] puts $f "#\n# \$FreeBSD\$\n#\n" puts $f "CFLAGS+=\t-I\${.CURDIR} -I\${.CURDIR}/../include" puts $f "CFLAGS+=\t-DGCC_INCLUDE_DIR=\\\"FOO\\\"" puts $f "CFLAGS+=\t-DDEFAULT_TARGET_VERSION=\\\"$version\\\"" puts $f "CFLAGS+=\t-DDEFAULT_TARGET_MACHINE=\\\"$target\\\"" puts $f "CFLAGS+=\t-DMD_EXEC_PREFIX=\\\"/usr/libexec/\\\"" puts $f "CFLAGS+=\t-DSTANDARD_STARTFILE_PREFIX=\\\"/usr/lib\\\"" close $f set f [open $ddir/Makefile w] puts $f "#\n# \$FreeBSD\$\n#\n" puts $f "PGMDIR=\tcc_int cpp cc1 cc cc1plus c++ libgcc" puts $f "SUBDIR=\t\$(PGMDIR)" puts $f "\n.include " close $f # do ~/libgcc sh "mkdir $ddir/libgcc" set f [open $ddir/libgcc/Makefile w] puts $f "#\n# \$FreeBSD\$\n#\n" puts $f "LIB=\tgcc" puts $f "INSTALL_PIC_ARCHIVE=\tyes" puts $f "SHLIB_MAJOR=\t26" puts $f "SHLIB_MINOR=\t0" puts $f "" puts $f "LIB1OBJS=\t[add_suffix $l_libgcc1 .o]" puts $f "LIB2OBJS=\t[add_suffix $l_libgcc2 .o]" puts $f { OBJS= ${LIB1OBJS} ${LIB2OBJS} LIB1SOBJS=${LIB1OBJS:.o=.so} LIB2SOBJS=${LIB2OBJS:.o=.so} P1OBJS=${LIB1OBJS:.o=.po} P2OBJS=${LIB2OBJS:.o=.po} ${LIB1OBJS}: libgcc1.c ${CC} -c ${CFLAGS} -DL${.PREFIX} -o ${.TARGET} ${.CURDIR}/libgcc1.c @${LD} -x -r ${.TARGET} @mv a.out ${.TARGET} ${LIB2OBJS}: libgcc2.c ${CC} -c ${CFLAGS} -DL${.PREFIX} -o ${.TARGET} ${.CURDIR}/libgcc2.c @${LD} -x -r ${.TARGET} @mv a.out ${.TARGET} .if !defined(NOPIC) ${LIB1SOBJS}: libgcc1.c ${CC} -c -fpic ${CFLAGS} -DL${.PREFIX} -o ${.TARGET} ${.CURDIR}/libgcc1.c ${LIB2SOBJS}: libgcc2.c ${CC} -c -fpic ${CFLAGS} -DL${.PREFIX} -o ${.TARGET} ${.CURDIR}/libgcc2.c .endif .if !defined(NOPROFILE) ${P1OBJS}: libgcc1.c ${CC} -c -p ${CFLAGS} -DL${.PREFIX} -o ${.TARGET} ${.CURDIR}/libgcc1.c ${P2OBJS}: libgcc2.c ${CC} -c -p ${CFLAGS} -DL${.PREFIX} -o ${.TARGET} ${.CURDIR}/libgcc2.c .endif .include } close $f copy_c $sdir $ddir/libgcc $l_libgcc # do ~/include sh "mkdir $ddir/include" copy_l $sdir $ddir/include [add_suffix $l_include .h] copy_l $sdir $ddir/include $l_include_x copy_l $sdir $ddir/include [add_suffix $l_libgcc_h .h] # do ~/include/i386 sh "mkdir $ddir/include/i386" copy_l $sdir/config/i386 $ddir/include/i386 [add_suffix $l_include_i386 .h] # do ~/cc_int mk_lib $ddir cc_int [add_suffix $l_common .c] { "NOPROFILE=\t1" "\ninstall:\n\t@true" } copy_c $sdir $ddir/cc_int $l_common # do ~/cpp mk_prog $ddir cpp [add_suffix $l_cpp .c] { "BINDIR=\t/usr/libexec" "LDDESTDIR+=\t-L\${.CURDIR}/../cc_int/obj" "LDDESTDIR+=\t-L\${.CURDIR}/../cc_int" "LDADD+=\t-lcc_int" } copy_c $sdir $ddir/cpp $l_cpp cp $sdir/cpp.1 $ddir/cpp/cpp.1 # do ~/c++ mk_prog $ddir c++ [add_suffix "$l_cplus $l_cplus_cp" .c] { "BINDIR=\t/usr/bin" "NOMAN=\t1" "LDDESTDIR+=\t-L\${.CURDIR}/../cc_int/obj" "LDDESTDIR+=\t-L\${.CURDIR}/../cc_int" "LDADD+=\t-lcc_int" } copy_c $sdir $ddir/c++ $l_cplus copy_c $sdir/cp $ddir/c++ $l_cplus_cp # do ~/cc mk_prog $ddir cc [add_suffix $l_cc .c] { "BINDIR=\t/usr/bin" "MLINKS+=cc.1 gcc.1" "MLINKS+=cc.1 c++.1" "MLINKS+=cc.1 g++.1" "LDDESTDIR+=\t-L\${.CURDIR}/../cc_int/obj" "LDDESTDIR+=\t-L\${.CURDIR}/../cc_int" "LDADD+=\t-lcc_int" "\nafterinstall:\n\tcd \$(DESTDIR)\$(BINDIR) ; rm gcc ; ln -s cc gcc" } copy_c $sdir $ddir/cc $l_cc cp $sdir/gcc.1 $ddir/cc/cc.1 # do ~/cc1 mk_prog $ddir cc1 [add_suffix $l_cc1 .c] { "BINDIR=\t/usr/libexec" "NOMAN=\t1" "LDDESTDIR+=\t-L\${.CURDIR}/../cc_int/obj" "LDDESTDIR+=\t-L\${.CURDIR}/../cc_int" "LDADD+=\t-lcc_int" } copy_c $sdir $ddir/cc1 $l_cc1 # do ~/cc1plus mk_prog $ddir cc1plus [add_suffix "$l_cc1plus_cp $l_cc1plus" .c] { "BINDIR=\t/usr/libexec" "NOMAN=\t1" "LDDESTDIR+=\t-L\${.CURDIR}/../cc_int/obj" "LDDESTDIR+=\t-L\${.CURDIR}/../cc_int" "LDADD+=\t-lcc_int" } copy_l $sdir/cp $ddir/cc1plus $l_cc1plus_x copy_c $sdir $ddir/cc1plus $l_cc1plus copy_c $sdir/cp $ddir/cc1plus $l_cc1plus_cp copy_l $sdir/cp $ddir/cc1plus [add_suffix $l_cc1plus_h .h] exit 0