1 | # Copyright Deniz Bahadir 2015
|
---|
2 | #
|
---|
3 | # Distributed under the Boost Software License, Version 1.0.
|
---|
4 | # (See accompanying file LICENSE_1_0.txt or copy at
|
---|
5 | # http://www.boost.org/LICENSE_1_0.txt)
|
---|
6 | #
|
---|
7 | # See http://www.boost.org/libs/mpl for documentation.
|
---|
8 | # See http://stackoverflow.com/a/29627158/3115457 for further information.
|
---|
9 |
|
---|
10 | import argparse
|
---|
11 | import sys
|
---|
12 | import os.path
|
---|
13 | import re
|
---|
14 | import fileinput
|
---|
15 | import datetime
|
---|
16 | import glob
|
---|
17 |
|
---|
18 |
|
---|
19 | def fix_header_comment(filename, timestamp):
|
---|
20 | """Fixes the header-comment of the given file."""
|
---|
21 | # Fix input file.
|
---|
22 | name = os.path.basename( filename )
|
---|
23 | for line in fileinput.input( filename, inplace=1, mode="rU" ):
|
---|
24 | # If header-comment already contains anything for '$Id$', remove it.
|
---|
25 | line = re.sub(r'\$Id:[^$]+\$', r'$Id$', line.rstrip())
|
---|
26 | # Replace '$Id$' by a string containing the file's name (and a timestamp)!
|
---|
27 | line = re.sub(re.escape(r'$Id$'), r'$Id: ' + name + r' ' + timestamp.isoformat() + r' $', line.rstrip())
|
---|
28 | print(line)
|
---|
29 |
|
---|
30 |
|
---|
31 | def fix_input_files_for_variadic_seq(sourceDir, timestamp):
|
---|
32 | """Fixes files used as input when pre-processing MPL-containers in their variadic form."""
|
---|
33 | files = glob.glob( os.path.join( sourceDir, "src", "*" ) )
|
---|
34 | for currentFile in sorted( files ):
|
---|
35 | fix_header_comment( currentFile, timestamp )
|
---|
36 |
|
---|
37 |
|
---|
38 | def fix_input_files_for_numbered_seq(sourceDir, suffix, timestamp, containers):
|
---|
39 | """Fixes files used as input when pre-processing MPL-containers in their numbered form."""
|
---|
40 | # Fix input files for each MPL-container type.
|
---|
41 | for container in containers:
|
---|
42 | files = glob.glob( os.path.join( sourceDir, container, container + '*' + suffix ) )
|
---|
43 | for currentFile in sorted( files ):
|
---|
44 | fix_header_comment( currentFile, timestamp )
|
---|
45 |
|
---|
46 |
|
---|
47 | def fix_input_files(headerDir, sourceDir, containers=['vector', 'list', 'set', 'map'], verbose='false'):
|
---|
48 | """Fixes source- and header-files used as input when pre-processing MPL-containers."""
|
---|
49 | # The new modification time.
|
---|
50 | timestamp = datetime.datetime.now();
|
---|
51 | # Fix the input files.
|
---|
52 | if verbose:
|
---|
53 | print "Fix input files for pre-processing Boost.MPL variadic containers."
|
---|
54 | fix_input_files_for_variadic_seq(sourceDir, timestamp)
|
---|
55 | if verbose:
|
---|
56 | print "Fix input files for pre-processing Boost.MPL numbered containers."
|
---|
57 | fix_input_files_for_numbered_seq(headerDir, ".hpp", timestamp, containers)
|
---|
58 | fix_input_files_for_numbered_seq(sourceDir, ".cpp", timestamp, containers)
|
---|
59 |
|
---|
60 |
|
---|
61 | def to_existing_absolute_path(string):
|
---|
62 | """Converts a path into its absolute path and verifies that it exists or throws an exception."""
|
---|
63 | value = os.path.abspath(string)
|
---|
64 | if not os.path.exists( value ) or not os.path.isdir( value ):
|
---|
65 | msg = '"%r" is not a valid path to a directory.' % string
|
---|
66 | raise argparse.ArgumentTypeError(msg)
|
---|
67 | return value
|
---|
68 |
|
---|
69 |
|
---|
70 | def main():
|
---|
71 | """The main function."""
|
---|
72 |
|
---|
73 | # Prepare and run cmdline-parser.
|
---|
74 | cmdlineParser = argparse.ArgumentParser(
|
---|
75 | description="Fixes the input files used for pre-processing of Boost.MPL headers.")
|
---|
76 | cmdlineParser.add_argument("-v", "--verbose", dest='verbose', action='store_true',
|
---|
77 | help="Be a little bit more verbose.")
|
---|
78 | cmdlineParser.add_argument(dest='sourceDir', metavar="<source-dir>",
|
---|
79 | type=to_existing_absolute_path,
|
---|
80 | help="The source-directory of Boost.")
|
---|
81 | args = cmdlineParser.parse_args()
|
---|
82 |
|
---|
83 | # Some verbose debug output.
|
---|
84 | if args.verbose:
|
---|
85 | print "Arguments extracted from command-line:"
|
---|
86 | print " verbose = ", args.verbose
|
---|
87 | print " source directory = ", args.sourceDir
|
---|
88 |
|
---|
89 | # The directories for header- and source files of Boost.MPL.
|
---|
90 | # NOTE: Assuming 'args.sourceDir' is the source-directory of the entire boost project.
|
---|
91 | headerDir = os.path.join( args.sourceDir, "boost", "mpl" )
|
---|
92 | sourceDir = os.path.join( args.sourceDir, "libs", "mpl", "preprocessed" )
|
---|
93 | # Check that the header/source-directories exist.
|
---|
94 | if not os.path.exists( headerDir ) or not os.path.exists( sourceDir ):
|
---|
95 | # Maybe 'args.sourceDir' is not the source-directory of the entire boost project
|
---|
96 | # but instead of the Boost.MPL git-directory, only?
|
---|
97 | headerDir = os.path.join( args.sourceDir, "include", "boost", "mpl" )
|
---|
98 | sourceDir = os.path.join( args.sourceDir, "preprocessed" )
|
---|
99 | if not os.path.exists( headerDir ) or not os.path.exists( sourceDir ):
|
---|
100 | cmdlineParser.print_usage()
|
---|
101 | print "error: Cannot find Boost.MPL header/source files in given Boost source-directory!"
|
---|
102 | sys.exit(0)
|
---|
103 |
|
---|
104 | # Some verbose debug output.
|
---|
105 | if args.verbose:
|
---|
106 | print "Chosen header-directory: ", headerDir
|
---|
107 | print "Chosen source-directory: ", sourceDir
|
---|
108 |
|
---|
109 | # Fix input file for generating pre-processed headers.
|
---|
110 | fix_input_files(headerDir, sourceDir, verbose = args.verbose)
|
---|
111 |
|
---|
112 |
|
---|
113 | if __name__ == '__main__':
|
---|
114 | main()
|
---|