123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #!/usr/bin/env python
- # coding: UTF-8
- # This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- from __future__ import print_function
- import argparse
- import os.path
- import re
- import io
- parser = argparse.ArgumentParser()
- parser.add_argument('version', help='file version')
- parser.add_argument('outfile', help='outfile with extension .c/.h')
- parser.add_argument('inputs', nargs='*', action='store', help='input filenames')
- args = parser.parse_args()
- outname = args.outfile.split("/")[-1]
- is_c = False
- if outname[-2:] == ".c":
- is_c = True
- pos = outname.find(".")
- if pos > 0:
- outname = outname[:pos]
- include_re = re.compile("^#[\s]*include (\".*\").*$")
- guard_re = re.compile("^#(?:(?:ifndef|define)\s*[A-Z_]+_H_|endif /\* [A-Z_]+_H_ \*/|endif // [A-Z_]+_H_|endif\s*/\*\s*!?[A-Z_]+_H[_]+\s*\*/)")
- print ("Starting amalgamating file "+ args.outfile)
- file = io.open(args.outfile, 'wt', encoding='utf8', errors='replace')
- file.write(u"""/* THIS IS A SINGLE-FILE DISTRIBUTION CONCATENATED FROM THE OPEN62541 SOURCES
- * visit http://open62541.org/ for information about this software
- * Git-Revision: %s
- */
- /*
- * Copyright (C) 2014-2016 the contributors as stated in the AUTHORS file
- *
- * This file is part of open62541. open62541 is free software: you can
- * redistribute it and/or modify it under the terms of the Mozilla Public
- * License v2.0 as stated in the LICENSE file provided with open62541.
- *
- * open62541 is distributed in the hope that it will be useful, but WITHOUT ANY
- * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- * A PARTICULAR PURPOSE.
- */\n\n""" % args.version)
- if is_c:
- file.write(u'''#ifndef UA_DYNAMIC_LINKING_EXPORT
- # define UA_DYNAMIC_LINKING_EXPORT
- # define MDNSD_DYNAMIC_LINKING
- #endif
- /* Enable POSIX features */
- #if !defined(_XOPEN_SOURCE) && !defined(_WRS_KERNEL)
- # define _XOPEN_SOURCE 600
- #endif
- #ifndef _DEFAULT_SOURCE
- # define _DEFAULT_SOURCE
- #endif
- /* On older systems we need to define _BSD_SOURCE.
- * _DEFAULT_SOURCE is an alias for that. */
- #ifndef _BSD_SOURCE
- # define _BSD_SOURCE
- #endif
- /* Disable security warnings for BSD sockets on MSVC */
- #ifdef _MSC_VER
- # define _CRT_SECURE_NO_WARNINGS
- #endif
- #include "%s.h"
- ''' % outname)
- else:
- file.write(u'''#ifndef %s
- #define %s
- ''' % (outname.upper() + u"_H_", outname.upper() + u"_H_") )
- for fname in args.inputs:
- with io.open(fname, encoding='utf8', errors='replace') as infile:
- file.write(u"\n/*********************************** amalgamated original file \"" + fname + u"\" ***********************************/\n\n")
- print ("Integrating file '" + fname + "'...", end=""),
- for line in infile:
- inc_res = include_re.match(line)
- guard_res = guard_re.match(line)
- if not inc_res and not guard_res:
- file.write(line)
- # Ensure file is written to disk.
- file.flush()
- os.fsync(file.fileno())
- print ("done."),
- if not is_c:
- file.write(u"#endif /* %s */\n" % (outname.upper() + u"_H_"))
- # Ensure file is written to disk.
- # See https://stackoverflow.com/questions/13761961/large-file-not-flushed-to-disk-immediately-after-calling-close
- file.flush()
- os.fsync(file.fileno())
- file.close()
- print ("The size of "+args.outfile+" is "+ str(os.path.getsize(args.outfile))+" Bytes.")
|