ViewVC Help
View File | Revision Log | View Changeset | Root Listing
root/Oni2/Daodan/MinGW/msys/1.0/postinstall/fstab.lua
Revision: 1046
Committed: Mon Aug 29 13:19:38 2016 UTC (9 years, 2 months ago) by alloc
File size: 12952 byte(s)
Log Message:
Daodan: Added Windows MinGW and build batch file

File Contents

# Content
1 --
2 -- fstab.lua
3 --
4 -- $Id$
5 --
6 -- Lua 5.2 module providing a mingw-get setup hook for the MSYS fstab.
7 --
8 -- Written by Keith Marshall <keithmarshall@users.sourceforge.net>
9 -- Copyright (C) 2014, 2015, MinGW.org Project
10 --
11 --
12 -- Permission is hereby granted, free of charge, to any person obtaining a
13 -- copy of this software and associated documentation files (the "Software"),
14 -- to deal in the Software without restriction, including without limitation
15 -- the rights to use, copy, modify, merge, publish, distribute, sublicense,
16 -- and/or sell copies of the Software, and to permit persons to whom the
17 -- Software is furnished to do so, subject to the following conditions:
18 --
19 -- The above copyright notice and this permission notice shall be included
20 -- in all copies or substantial portions of the Software.
21 --
22 -- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23 -- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24 -- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25 -- THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26 -- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27 -- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28 -- DEALINGS IN THE SOFTWARE.
29 --
30 --
31 -- We begin by initializing a container, for construction of a Lua module
32 -- to encapsulate the content of this source file.
33 --
34 local M = {}
35 --
36 -- mingw-get passes the MSYS installation root directory path,
37 -- in the $MSYS_SYSROOT environment variable; from this, we deduce
38 -- the path name for the working copy of the fstab file...
39 --
40 local function syspath( varname )
41 --
42 -- ...using this local helper function to ensure that the path name
43 -- string, returned from the environment, is free from insignificant
44 -- trailing directory name separators, and that all internal sequences
45 -- of directory name separators are normalized to a single '/'.
46 --
47 local pathname = string.gsub( os.getenv( varname ), "[/\\]+", "/" )
48 return string.match( pathname, "(.*[^/])/*$" )
49 end
50 local sysroot = syspath( "MSYS_SYSROOT" )
51 local mingw32_sysroot = syspath( "MINGW32_SYSROOT" )
52 local fstab_file_name = sysroot .. "/etc/fstab"
53 --
54 -- The following may be adjusted, to control the layout of the mount
55 -- point mapping records, within the fstab file.
56 --
57 local path_name_field_width, tab_width = 40, 8
58 --
59 -- Define a template, from which a sample fstab file for the current
60 -- MSYS installation may be generated, on invocation of this module's
61 -- "dump_sample" method...
62 --
63 local fstab_sample =
64 { '# /etc/fstab.sample -- sample mount table configuration for MSYS.',
65 '',
66 '# Lines with a "#" in column one are interpreted as comment lines;',
67 '# with the exception of comments described as "magic", neither these',
68 '# lines, nor any blank lines, are interpreted as configuration.',
69 '',
70 '# Comment lines which are described as "magic" should neither be',
71 '# deleted, nor edited manually; ignoring this advice may cause your',
72 '# MSYS installation to malfunction.',
73 '',
74 '# When running MSYS from a portable device, such as a USB thumb drive,',
75 '# the following "magic" comment is used to track changes in host drive',
76 '# letter assignment, so allowing MSYS-Portable start-up hooks to remap',
77 '# mount table entries which refer to the relocated device:',
78 '#',
79 '# MSYSROOT=D:/PortableApps/MSYS/1.0',
80 '',
81 '# The mount table configuration follows below. The line format is',
82 '# simple: you specify the Win32 path, followed by one or more space or',
83 '# tab delimiters, followed by the mount point name. In a typical UNIX',
84 '# installation, each mount point must exist as a named directory on a',
85 '# physically accessible device, before it can actually be used as a',
86 '# mount point. For this implementation the "must exist" requirement',
87 '# is not enforced; however, it will assist programs such as find, and',
88 "# readline's tab completion if each does physically exist.",
89 '',
90 '# Win32_Path Mount_Point',
91 '#------------------------------------- -----------',
92 'c:/mingw /mingw'
93 }
94 --
95 -- ...and a further template for a working configuration.
96 --
97 local fstab_basic =
98 { '# /etc/fstab -- mount table configuration for MSYS.',
99 '# Please refer to /etc/fstab.sample for explanatory annotation.',
100 '',
101 '# MSYS-Portable needs this "magic" comment:',
102 '# MSYSROOT=D:/PortableApps/MSYS/1.0',
103 '',
104 '# Win32_Path Mount_Point',
105 '#------------------------------------- -----------',
106 'c:/mingw /mingw'
107 }
108 --
109 -- Define Lua regular expressions which may be used to identify
110 -- comment lines within the fstab file; (the first will match any
111 -- comment, while the second is specific to the "magic" comment,
112 -- as used by MSYS-Portable, to track changes in the allocation
113 -- of the drive identifier for the host device).
114 --
115 local fstab_comment_line = "^#"
116 local fstab_device_magic = "^(#%s*MSYSROOT=)(%S*)"
117 --
118 local function map_root_device( assignment )
119 --
120 -- A function to update the "magic" comment, which records the
121 -- allocation of the MSYS-Portable host device.
122 --
123 return string.gsub( assignment, fstab_device_magic, "%1" .. sysroot )
124 end
125 --
126 -- Define a Lua regular expression which may be used to verify
127 -- that any fstab file record represents a well formed mount point
128 -- specification; it also incorporates capture fields, which may
129 -- be used to extract each of the path name and mount point
130 -- identification fields from the specification.
131 --
132 local fstab_mount_specification = "^%s*(%S+)%s+(%S+)%s*$"
133 --
134 local function is_mount_specification( line )
135 --
136 -- A function to verify any fstab file record against the
137 -- preceding regular expression, to confirm whether it does
138 -- represent a well formed mount point specification.
139 --
140 return string.match( line, fstab_mount_specification )
141 end
142 --
143 local function get_mapped_path( specification )
144 --
145 -- A function to extract the associated path name field from
146 -- any well formed mount point specification record.
147 --
148 return string.gsub( specification, fstab_mount_specification, "%1" )
149 end
150 --
151 local function get_mount_point( specification )
152 --
153 -- A function to extract the mount point identification field
154 -- from any well formed mount point specification record.
155 --
156 return string.gsub( specification, fstab_mount_specification, "%2" )
157 end
158 --
159 -- In the event that a mount table configuration has already been
160 -- specified for this installation, capture this into an internal
161 -- "as built" configuration table...
162 --
163 local fstab_as_built = {}
164 local fstab = io.open( fstab_file_name )
165 if fstab
166 then
167 --
168 -- ...reading the existing configuration file, line by line...
169 --
170 for line in fstab:lines()
171 do
172 --
173 -- ...identifying comment lines...
174 --
175 if string.match( line, fstab_comment_line )
176 then
177 --
178 -- ...and ignoring all such, except any "device magic" line...
179 --
180 if string.match( line, fstab_device_magic )
181 then
182 --
183 -- ...from which we retrieve, and subsequently update, the
184 -- configuration-specific "sysroot" identification.
185 --
186 sysroot = string.gsub( line, fstab_device_magic, "%2" )
187 end
188 --
189 -- Also identify mount point specification lines...
190 --
191 elseif is_mount_specification( line )
192 then
193 if string.match( get_mount_point( line ), "^/mingw$" )
194 then
195 --
196 -- ...and preserve the user's pre-configured path assignment
197 -- for the "/mingw" mount point, if any.
198 --
199 mingw32_sysroot = get_mapped_path( line )
200 --
201 else
202 --
203 -- ...while, for all EXCEPT the "/mingw" mount point,
204 -- simply record the configuration.
205 --
206 table.insert( fstab_as_built, line )
207 end
208 end
209 end
210 end
211 --
212 --
213 local function fstab_write_configuration( fstab, template, current )
214 --
215 -- A function to write an fstab configuration to a designated output
216 -- stream, based on a specified template, reproducing and encapsulating
217 -- any existing configuration which may also have been specified...
218 --
219 local function fstab_writeln( line )
220 --
221 -- ...using this helper function to write line by line.
222 --
223 fstab:write( line .. "\n" )
224 end
225 --
226 local function assign_mount_point( mapped_path, mount_point )
227 --
228 -- This helper function formats each mount point specification
229 -- into a neatly tabulated layout...
230 --
231 local filled = string.len( mapped_path )
232 repeat
233 mapped_path, filled = mapped_path .. "\t", filled + tab_width
234 until filled >= path_name_field_width
235 --
236 -- ...to be written out, with one line per mount point.
237 --
238 fstab_writeln( mapped_path .. mount_point )
239 end
240 --
241 -- Process the template, line by line...
242 --
243 for ref, line in next, template
244 do
245 -- ...and for each comment, or blank line encountered...
246 --
247 if string.match( line, "^#" ) or string.match( line, "^%s*$" )
248 then
249 -- ...simply reproduce it in the output stream, while taking
250 -- care to update any "device magic" which it may incorporate,
251 -- so that it fits the configuration of this installation.
252 --
253 fstab_writeln( map_root_device( line ) )
254 --
255 -- When we encounter a mount point specification line -- for
256 -- which each of the embedded templates should include exactly
257 -- one example...
258 --
259 elseif is_mount_specification( line )
260 then
261 -- ...write out the specification for the "/mingw" mount
262 -- point, as appropriate for this installation.
263 --
264 assign_mount_point( mingw32_sysroot, "/mingw" )
265 end
266 end
267 --
268 -- And finally...
269 --
270 if current
271 then
272 -- ...when inclusion of the current mount configuration has been
273 -- specified, we process each configuration record in turn...
274 --
275 for ref, line in next, current
276 do
277 -- ...and write out its corresponding mount point specification,
278 -- (noting that we have already excluded the "/mingw" mount point
279 -- from the recorded configuration, but we have already written a
280 -- specification record for it).
281 --
282 assign_mount_point( get_mapped_path( line ), get_mount_point( line ) )
283 end
284 end
285 end
286 --
287 --
288 function M.pathname( suffix )
289 --
290 -- An exported utility function, to facilitate identification of
291 -- the full MS-Windows path name for the "/etc/fstab" configuration
292 -- file, as appropriate to the current installation...
293 --
294 if suffix
295 then
296 -- ...appending any suffix which may have been specified, (e.g.
297 -- to specify a reference to the "/etc/fstab.sample" file)...
298 --
299 return fstab_file_name .. suffix
300 end
301 --
302 -- ...otherwise, specifying a reference to "/etc/fstab" itself.
303 --
304 return fstab_file_name
305 end
306 --
307 --
308 function M.dump_sample( stream_file )
309 --
310 -- An exported utility function, providing a method for displaying,
311 -- or otherwise emitting suitable content for the "/etc/fstab.sample"
312 -- file, as directed by the embedded "fstab_sample" template...
313 --
314 if not stream_file
315 then
316 -- ...writing to "stdout", in the event that no other destination
317 -- has been specified.
318 --
319 stream_file = io.stdout
320 end
321 --
322 -- Regardless of output destination, we delegate output to this local
323 -- function, processing the integral sample file template, but we omit
324 -- the current mount table configuration.
325 --
326 fstab_write_configuration( stream_file, fstab_sample )
327 end
328 --
329 --
330 function M.initialize( stream_file )
331 --
332 -- The primary initialization function, exported for use by mingw-get,
333 -- to write a working mount table configuration to the specified file
334 -- stream, which, unless otherwise specified...
335 --
336 local default_stream_file = nil
337 if not stream_file
338 then
339 -- ...is to be directed to the default "/etc/fstab" file.
340 --
341 default_stream_file = io.open( fstab_file_name, "w" )
342 stream_file = default_stream_file
343 end
344 --
345 -- Once again, regardless of how the output file has been identified,
346 -- provided the stream has been successfully assigned...
347 --
348 if stream_file
349 then
350 -- ...we delegate the actual output function to the local helper,
351 -- this time, processing the integral working file template, and we
352 -- include the record of the current mount table configuration.
353 --
354 fstab_write_configuration( stream_file, fstab_basic, fstab_as_built )
355 end
356 --
357 -- Finally, when updating the default "/etc/fstab" configuration,
358 -- via a locally opened output file stream...
359 --
360 if default_stream_file
361 then
362 -- ...we must now ensure that this output stream is closed.
363 --
364 io.close( default_stream_file )
365 end
366 end
367 --
368 -- Since this source file is intended to be loaded as a Lua module, we
369 -- must ultimately return a reference handle for it.
370 --
371 return M
372 --
373 -- $RCSfile$: end of file */