1private variable Script_Version_String = "0.1.2";
2
3require ("cmdopt");
4require ("glob");
5
6private define convert_path (path)
7{
8   return strtrans (path, "/", "\\");
9}
10
11private define mkdir_p (dir);
12private define mkdir_p (dir)
13{
14   dir = convert_path (dir);
15
16   if ((-1 == mkdir (dir)) && (errno != EEXIST))
17     {
18	variable parent = path_dirname (dir);
19	if ((-1 == mkdir_p (parent))
20	    || (-1 == mkdir (dir)))
21	  {
22	     () = fprintf (stderr, "Failed to create %s: %s\n",
23			   dir, errno_string ());
24	     exit (1);
25	  }
26     }
27   return 0;
28}
29
30private define run_cmd (cmd)
31{
32   () = system (cmd);
33}
34
35private define install_file (file, dir)
36{
37   () = fprintf (stdout, "Installing %s in %s\n", file, dir);
38   dir = convert_path (dir);
39   file = convert_path (file);
40
41   run_cmd ("copy /y $file $dir"$);
42}
43
44private define install_files (pat, dir)
45{
46   foreach (glob (pat))
47     {
48	variable file = ();
49	install_file (file, dir);
50     }
51}
52
53private define install_libslang (root, objdir)
54{
55   variable libdir = "$root/lib"$;
56   variable bindir = "$root/bin"$;
57   variable incdir = "$root/include"$;
58
59   () = mkdir_p (libdir);
60   () = mkdir_p (incdir);
61   () = mkdir_p (bindir);
62
63   install_file ("src/slang.h", incdir);
64   install_file ("src/$objdir/libslang.a"$, libdir);
65   install_file ("src/$objdir/libslang.dll"$, bindir);
66}
67
68private define install_slang_doc (root)
69{
70   variable dir = "$root/share/doc/slang/v2"$;
71   () = mkdir_p (dir);
72   install_file ("changes.txt", dir);
73   install_file ("COPYING", dir);
74   install_file ("doc/slangdoc.html", dir);
75   install_file ("doc/text/*.txt", dir);
76}
77
78private define install_slsh (prefix, confdir, objdir)
79{
80   variable dir = "$prefix/bin"$;
81   () = mkdir_p (dir);
82   install_file ("slsh/$objdir/slsh.exe"$, dir);
83
84   dir = "$prefix/share/slsh"$;
85   () = mkdir_p (dir);
86   install_files ("slsh/lib/*.sl", dir);
87
88   dir = "$prefix/share/slsh/help"$;
89   () = mkdir_p (dir);
90   install_files ("slsh/lib/help/*.hlp", dir);
91
92   dir = "$prefix/share/slsh/rline"$;
93   () = mkdir_p (dir);
94   install_files ("slsh/lib/rline/*", dir);
95
96   dir = "$prefix/share/slsh/scripts"$;
97   () = mkdir_p (dir);
98   install_files ("slsh/scripts/*", dir);
99
100   dir = "$prefix/share/slsh/local-packages"$;
101   () = mkdir_p (dir);
102   dir = "$prefix/share/slsh/local-packages/help"$;
103   () = mkdir_p (dir);
104
105   dir = "$confdir"$;
106   () = mkdir_p (dir);
107   install_file ("slsh/etc/slsh.rc", dir);
108}
109
110private define install_modules (prefix)
111{
112   variable dir = "$prefix/lib/slang/v2/modules"$;
113   () = mkdir_p (dir);
114   install_files ("modules/*.dll", dir);
115
116   dir = "$prefix/share/slsh"$;
117   () = mkdir_p (dir);
118   install_files ("modules/*.sl", dir);
119
120   dir = "$prefix/share/slsh/statslib"$;
121   () = mkdir_p (dir);
122   install_files ("modules/statslib/*.sl", dir);
123
124   dir = "$prefix/share/slsh/cmaps"$;
125   () = mkdir_p (dir);
126   install_files ("modules/cmaps/*", dir);
127}
128
129private define exit_version ()
130{
131   () = fprintf (stdout, "Version: %S\n", Script_Version_String);
132   exit (0);
133}
134
135private define exit_usage ()
136{
137   variable fp = stderr;
138   () = fprintf (fp, "Usage: %s [options] install\n", __argv[0]);
139   variable opts =
140     [
141      "Options:\n",
142      " -v|--version               Print version\n",
143      " -h|--help                  This message\n",
144      " --prefix=/install/prefix   Default is /usr\n",
145      " --distdir=/path            Default is blank\n",
146     ];
147   foreach (opts)
148     {
149	variable opt = ();
150	() = fputs (opt, fp);
151     }
152   exit (1);
153}
154
155define slsh_main ()
156{
157   variable c = cmdopt_new ();
158   variable destdir = "";
159   variable prefix = "/usr";
160
161   c.add("h|help", &exit_usage);
162   c.add("v|version", &exit_version);
163   c.add("destdir", &destdir; type="str");
164   c.add("prefix", &prefix; type="str");
165   variable i = c.process (__argv, 1);
166
167   if ((i + 1 != __argc) || (__argv[i] != "install"))
168     exit_usage ();
169
170   % See the comment in makefile.m32 for the motivation behind the
171   % sillyness involving X-.
172   if (0==strncmp (destdir, "X-", 2))
173     destdir = substr (destdir, 3, -1);
174
175   () = fprintf (stdout, "Using destdir=%s, prefix=%s\n", destdir, prefix);
176
177   variable root = strcat (destdir, prefix);
178
179   variable confdir = "/etc";
180   if (prefix != "/usr")
181     confdir = path_concat (prefix, "etc");
182   confdir = strcat (destdir, confdir);
183
184   variable objdir = "gw32objs";
185   install_libslang (root, objdir);
186   install_slang_doc (root);
187   install_slsh (root, confdir, objdir);
188   install_modules (root);
189}
190