amalgamate.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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_ \*/|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
  41. """ % args.version)
  42. if not is_c:
  43. file.write(u'''#ifndef %s
  44. #define %s
  45. #ifdef __cplusplus
  46. extern "C" {
  47. #endif\n\n''' % (outname.upper() + u"_H_", outname.upper() + u"_H_") )
  48. if not is_c:
  49. for inc in includes:
  50. file.write(u"#include " + inc + "\n")
  51. else:
  52. file.write(u'''#ifndef UA_DYNAMIC_LINKING
  53. # define UA_DYNAMIC_LINKING
  54. #endif
  55. #ifndef UA_INTERNAL
  56. #define UA_INTERNAL
  57. #endif
  58. \n''')
  59. file.write(u"#include \"" + outname + ".h\"\n")
  60. for fname in args.inputs:
  61. with io.open(fname, encoding="utf8") as infile:
  62. file.write(u"\n/*********************************** amalgamated original file \"" + fname + u"\" ***********************************/\n\n")
  63. print ("Integrating file '" + fname + "'...", end=""),
  64. for line in infile:
  65. inc_res = include_re.match(line)
  66. guard_res = guard_re.match(line)
  67. if not inc_res and not guard_res:
  68. file.write(line)
  69. print ("done."),
  70. if not is_c:
  71. file.write(u'''
  72. #ifdef __cplusplus
  73. } // extern "C"
  74. #endif
  75. #endif /* %s */''' % (outname.upper() + u"_H_"))
  76. file.close()
  77. print ("The size of "+args.outfile+" is "+ str(os.path.getsize(args.outfile))+" Bytes.")