summaryrefslogtreecommitdiff
path: root/make-bootstrap-jim
blob: 7484b11f981df67717f93efd01b909055a72fdaa (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
#!/bin/sh

# This script writes to stdout, a single source file (e.g. jimsh0.c)
# which can be compiled to provide a bootstrap version of jimsh.
# e.g. cc -o jimsh0 jimsh0.c

makeext()
{
	source="$1"
	basename=`basename "$source" .tcl`
cat <<EOF
int Jim_${basename}Init(Jim_Interp *interp)
{
	if (Jim_PackageProvide(interp, "$basename", "1.0", JIM_ERRMSG))
		return JIM_ERR;

	return Jim_EvalSource(interp, "$source", 1,
EOF

# Note: Keep newlines so that line numbers match in error messages
sed -e 's/^[ 	]*#.*//' -e 's@\\@\\\\@g' -e 's@"@\\"@g' -e 's@^\(.*\)$@"\1\\n"@' $source

echo ");"
echo "}"
}

makeloadexts()
{
cat <<EOF
int Jim_InitStaticExtensions(Jim_Interp *interp)
EOF
    echo "{"
    for ext in $*; do
        echo "extern int Jim_${ext}Init(Jim_Interp *);"
    done
    for ext in $*; do
        echo "Jim_${ext}Init(interp);"
    done
    echo "return JIM_OK;"
    echo "}"
}

cexts="aio readdir regexp file exec clock array"
tclexts="bootstrap initjimsh glob stdlib tclcompat"

# Note ordering
allexts="bootstrap aio readdir regexp file glob exec clock array stdlib tclcompat"

echo "/* This is single source file, bootstrap version of Jim Tcl. See http://jim.tcl.tk/ */"

# define some core features
for i in JIM_TCL_COMPAT JIM_ANSIC JIM_REGEXP HAVE_NO_AUTOCONF _JIMAUTOCONF_H; do
	echo "#define $i"
done
echo '#define TCL_LIBRARY "."'
# and extensions
for i in $allexts; do
	echo "#define jim_ext_$i"
done

cat <<EOF
#if defined(_MSC_VER)
#define TCL_PLATFORM_OS "windows"
#define TCL_PLATFORM_PLATFORM "windows"
#define TCL_PLATFORM_PATH_SEPARATOR ";"
#define HAVE_MKDIR_ONE_ARG
#define HAVE_SYSTEM
#elif defined(__MINGW32__)
#define TCL_PLATFORM_OS "mingw"
#define TCL_PLATFORM_PLATFORM "windows"
#define TCL_PLATFORM_PATH_SEPARATOR ";"
#define HAVE_MKDIR_ONE_ARG
#define HAVE_SYSTEM
#define HAVE_SYS_TIME_H
#define HAVE_DIRENT_H
#define HAVE_UNISTD_H
#define HAVE_UMASK
#include <sys/stat.h>
#ifndef S_IRWXG
#define S_IRWXG 0
#endif
#ifndef S_IRWXO
#define S_IRWXO 0
#endif
#else
#define TCL_PLATFORM_OS "unknown"
#define TCL_PLATFORM_PLATFORM "unix"
#define TCL_PLATFORM_PATH_SEPARATOR ":"
#ifdef _MINIX
#define vfork fork
#define _POSIX_SOURCE
#else
#define _GNU_SOURCE
#endif
#define HAVE_VFORK
#define HAVE_WAITPID
#define HAVE_ISATTY
#define HAVE_MKSTEMP
#define HAVE_LINK
#define HAVE_SYS_TIME_H
#define HAVE_DIRENT_H
#define HAVE_UNISTD_H
#define HAVE_UMASK
#endif
EOF

# get JIM_VERSION from auto.def
sed -n -e 's/^\(define JIM_VERSION.*\)/#\1/p' auto.def

outputsource()
{
        sed -e '/#include.*jim/d' -e '/#include.*utf8/d' \
                -e '/^#.*if.*JIM_BOOTSTRAP/,/^#endif.*JIM_BOOTSTRAP/d' \
                -e 's/[ 	]*\/\*.*\*\///' -e '/^[ 	]*\/\*/,/\*\//d' $1
}

# Now output header files, removing references to jim header files
for i in jim-win32compat.h utf8.h jim.h jim-subcmd.h jimregexp.h jim-signal.h jimiocompat.h; do
	outputsource $i
done

# Now extension source code
for i in $tclexts; do
	makeext $i.tcl
done
for i in $cexts; do
	outputsource jim-$i.c
done
makeloadexts $allexts

# And finally the core source code
for i in jim.c jim-subcmd.c utf8.c jim-format.c jimregexp.c jimiocompat.c jim-win32compat.c jim-nosignal.c; do
	outputsource $i
done
echo "#ifndef JIM_BOOTSTRAP_LIB_ONLY"
outputsource jim-interactive.c
outputsource jimsh.c
echo "#endif"