summaryrefslogtreecommitdiff
blob: 0207609a7136c01fc6543c6bb5bf2e819d3d661d (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
140
141
142
143
144
145
146
147
148
149
# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/app-shells/csh/csh-1.29-r3.ebuild,v 1.13 2005/04/21 20:11:57 blubb Exp $

inherit flag-o-matic eutils ccc

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

LICENSE="BSD"
SLOT="0"
KEYWORDS="x86 alpha arm amd64 ia64 sparc ~ppc"
IUSE="static doc"

DEPEND="sys-devel/pmake !app-shells/tcsh
	>=sys-apps/sed-4"
RDEPEND="virtual/libc"

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

src_unpack() {
	# unpack the source tarball
	unpack ${A}

	# 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."

	# print the existing input after displaying completion options.
	# patch contributed by splite <splite-gentoo@sigint.cs.purdue.edu>
	# #24290
	epatch ${FILESDIR}/retype-input.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:3}..."
		printf "\t\"%s\",\n" ${i:3} >> ${S}/signames.h
	done

	printf "\t\"DEBUG\",\n\t\"ERR\",\n\t(char *)0x0\n};\n\n" >> ${S}/signames.h

	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

}

src_compile() {

	einfo "Adding flags required for succesful compilation..."

	# this should be easier than maintaining a patch. 
	append-flags -Dlint -w -D__dead="" -D__LIBC12_SOURCE__ -DNODEV="-1"
	append-flags -DTTYHOG=1024 -DMAXPATHLEN=4096 -D_GNU_SOURCE
	append-flags -D_DIAGASSERT="assert"

	# maybe they dont warn on BSD, but on linux they are very noisy.
	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
	if use doc; then
		einfo "An Introduction to the C shell by Bill 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."
	else
		einfo "You don't have USE=doc, so the"
		einfo "postscript document \"An Introduction to the C"
		einfo "shell by Bill Joy\" was not installed."
	fi
	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
}