amalgamate.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from __future__ import print_function
  2. import re
  3. import argparse
  4. import os.path
  5. import io
  6. parser = argparse.ArgumentParser()
  7. parser.add_argument('version', help='file version')
  8. parser.add_argument('outfile', help='outfile with extension .c/.h')
  9. parser.add_argument('inputs', nargs='*', action='store', help='input filenames')
  10. args = parser.parse_args()
  11. outname = args.outfile.split("/")[-1]
  12. is_c = False
  13. if outname[-2:] == ".c":
  14. is_c = True
  15. pos = outname.find(".")
  16. if pos > 0:
  17. outname = outname[:pos]
  18. include_re = re.compile("^#include (\".*\").*$")
  19. guard_re = re.compile("^#(?:(?:ifndef|define) [A-Z_]+_H_|endif /\* [A-Z_]+_H_ \*/)")
  20. includes = []
  21. print ("Starting amalgamating file "+ args.outfile)
  22. file = io.open(args.outfile, 'w')
  23. file.write(u'''/* THIS IS A SINGLE-FILE DISTRIBUTION CONCATENATED FROM THE OPEN62541 SOURCES
  24. * visit http://open62541.org/ for information about this software
  25. * Git-Revision: %s
  26. */
  27. /*
  28. * Copyright (C) 2015 the contributors as stated in the AUTHORS file
  29. *
  30. * This file is part of open62541. open62541 is free software: you can
  31. * redistribute it and/or modify it under the terms of the GNU Lesser General
  32. * Public License, version 3 (as published by the Free Software Foundation) with
  33. * a static linking exception as stated in the LICENSE file provided with
  34. * open62541.
  35. *
  36. * open62541 is distributed in the hope that it will be useful, but WITHOUT ANY
  37. * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
  38. * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
  39. * details.
  40. */\n\n''' % args.version)
  41. if not is_c:
  42. file.write(u'''#ifndef %s
  43. #define %s
  44. #ifdef __cplusplus
  45. extern "C" {
  46. #endif\n\n''' % (outname.upper() + u"_H_", outname.upper() + u"_H_") )
  47. if not is_c:
  48. for inc in includes:
  49. file.write(u"#include " + inc + "\n")
  50. file.write(u'''#ifndef UA_AMALGAMATE
  51. # define UA_AMALGAMATE
  52. #endif\n\n''')
  53. else:
  54. file.write(u'''#ifndef UA_DYNAMIC_LINKING
  55. # define UA_DYNAMIC_LINKING
  56. #endif\n\n''')
  57. file.write(u"#include \"" + outname + ".h\"\n")
  58. for fname in args.inputs:
  59. with io.open(fname, encoding="utf8") as infile:
  60. file.write(u"\n/*********************************** amalgamated original file \"" + fname + u"\" ***********************************/\n\n")
  61. print ("Integrating file '" + fname + "'...", end=""),
  62. for line in infile:
  63. inc_res = include_re.match(line)
  64. guard_res = guard_re.match(line)
  65. if not inc_res and not guard_res:
  66. file.write(line)
  67. print ("done."),
  68. if not is_c:
  69. file.write(u'''
  70. #ifdef __cplusplus
  71. } // extern "C"
  72. #endif
  73. #endif /* %s */''' % (outname.upper() + u"_H_"))
  74. file.close()
  75. print ("The size of "+args.outfile+" is "+ str(os.path.getsize(args.outfile))+" Bytes.")