summaryrefslogtreecommitdiff
blob: e12ba46e9fe494b3595d038e90202a4718e248f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# Copyright 1999-2003 Gentoo Technologies, Inc.
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/app-shells/csh/csh-1.29-r1.ebuild,v 1.6 2003/06/24 20:22:01 vapier Exp $

inherit flag-o-matic eutils ccc

DESCRIPTION="Classic UNIX shell with C like syntax"
HOMEPAGE="http://www.netbsd.org/"
SRC_URI="http://cvs.gentoo.org/~taviso/${P}.tar.gz"

LICENSE="BSD"
SLOT="0"
KEYWORDS="x86 alpha"
IUSE="static doc"

DEPEND="virtual/glibc
	sys-devel/pmake
	>=sys-apps/sed-4
	doc? ( sys-apps/groff )"
RDEPEND="virtual/glibc"

S=${WORKDIR}/src/bin/csh

src_compile() {
	# hide some BSDisms, mostly my work, got some hints from the
	# debian project (they use an older OpenBSD csh, though).
	cd ${S}; epatch ${FILESDIR}/linux-vs-bsd.diff || die "patching failed."

	# copy some required files over, from NetBSD

	cd ${S}; cp ${WORKDIR}/printf.c \
				${WORKDIR}/vis.h \
				${WORKDIR}/vis.c \
				${FILESDIR}/dot.login \
				${FILESDIR}/dot.cshrc \
				${S} 
				
	# this parses the output of the bash builtin `kill`
	# and creates an array of signal names for csh.

	einfo "Making a list of signal names..."

	local cnt=0

	printf "/* automatically generated during %s build */\n\n" ${PF} > ${S}/signames.h
	printf "const char *const sys_signame[NSIG + 3] = {\n" >> ${S}/signames.h
	printf "\t\"EXIT\",\t\n" >> ${S}/signames.h
	
	let cnt++
	
	for i in `kill -l`
	do
		let $((cnt++))%2 && continue
		einfo "	Adding ${i}..."
		printf "\t\"%s\",\n" ${i} >> ${S}/signames.h
	done
	
	printf "\t\"DEBUG\",\n\t\"ERR\",\n\t(char *)0x0\n};\n\n" >> ${S}/signames.h

	einfo "Adding flags required for succesful compilation..."
	# this should be easier than maintaining a patch. 
	for i in {-Dlint,-w,-D__dead="",-D__LIBC12_SOURCE__,-DNODEV="-1",-DTTYHOG=1024,-DMAXPATHLEN=4096,-D_GNU_SOURCE,-D_DIAGASSERT="assert"}
	do
		append-flags ${i}
	done

	einfo "Making some final tweaks..."
	sed -i 's#sys/tty.h#linux/tty.h#g' ${S}/file.c
	sed -i 's!\(#include "proc.h"\)!\1\n#include "signames.h"\n!g' ${S}/proc.c
	sed -i 's#\(strpct.c time.c\)#\1 vis.c#g' ${S}/Makefile
	sed -i 's!#include "namespace.h"!!g' ${S}/vis.c
	sed -i 's#/usr/games/fortune#/usr/bin/fortune#g' ${S}/dot.login

	# maybe they dont warn on BSD, but _damn_.
	export NOGCCERROR=1
	
	# if csh is a users preferred shell, they may want
	# a static binary to help on the event of fs emergency.
	use static && append-ldflags -static
	
	# pmake is a portage binary as well, so specify full path.
	# if yours isnt in /usr/bin, you can set PMAKE_PATH.
	einfo "Starting build..."
	${PMAKE_PATH:-/usr/bin/}pmake || die "compile failed."
	
	echo
	size csh 
	echo
	
	# make the c shell guide
	use doc && {
		einfo "Making documentation..."
		cd ${S}/USD.doc
		${PMAKE_PATH:-/usr/bin/}pmake
	}
	cd ${S}

	einfo "Making empty configuration files.."
	printf "#\n# System-wide .cshrc file for csh(1).\n\n" >	csh.cshrc 
	printf "#\n# System-wide .login file for csh(1).\n\n" > csh.login
	printf "if ( -f /etc/csh.env ) source /etc/csh.env\n" >> csh.login
	printf "#\n# System-wide .logout file for csh(1).\n\n" > csh.logout
}

src_install() {
	exeinto /bin
	doexe csh
	
	doman csh.1
	
	use doc && dodoc USD.doc/paper.ps
	dodoc dot.cshrc dot.login
	
	insinto /etc
	doins csh.cshrc csh.login csh.logout
}

pkg_postinst() {
	echo
	use doc >/dev/null && {
		einfo "An Introduction to the C shell by William Joy, a "
		einfo "postscript document included with this shell has"
		einfo "been installed in /usr/share/doc/${PF}, if you are new"
		einfo "to the C shell, you may find it interesting."
	} || {
		einfo "You didnt have the \`doc\` use flag set, the"
		einfo "postscript document \"An Introduction to the C"
		einfo "shell by William Joy\" was not installed."
	}
	echo
	einfo "Example login scripts have been installed in /usr/share/doc/${PF}."
	einfo "You can install a simple dot.cshrc like this:"
	einfo
	einfo "	% zcat /usr/share/doc/${PF}/dot.cshrc > ~/.cshrc"
	einfo "	% zcat /usr/share/doc/${PF}/dot.login > ~/.login"
	einfo
	einfo "And then edit to your liking."
	echo
}