GenerateAndroidProject.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #!/usr/bin/python
  2. # Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  3. # All rights reserved.
  4. # Code licensed under the BSD License.
  5. # http://www.anki3d.org/LICENSE
  6. import os
  7. import optparse
  8. import shutil
  9. import fileinput
  10. import sys
  11. class Context:
  12. target = ""
  13. asserts_dir = ""
  14. out_dir = ""
  15. def parse_commandline():
  16. """ Parse the command line arguments """
  17. parser = optparse.OptionParser(usage="usage: %prog [options]", description="Generate an Android gradle project")
  18. parser.add_option("-o", "--out-dir", dest="out_dir", type="string", help="Where to create the project")
  19. parser.add_option("-t", "--target", dest="target", type="string", help="The name of .so to package")
  20. parser.add_option("-a", "--assets", dest="assets", type="string", help="Assets directory")
  21. (options, args) = parser.parse_args()
  22. required = "target assets out_dir".split()
  23. for r in required:
  24. if options.__dict__[r] is None:
  25. parser.print_help()
  26. parser.error("parameter \"%s\" required" % r)
  27. ctx = Context()
  28. ctx.target = options.target
  29. ctx.asserts_dir = os.path.abspath(options.assets)
  30. ctx.out_dir = os.path.abspath(options.out_dir)
  31. return ctx
  32. def replace_in_file(filename, to_replace, to_replace_with):
  33. with fileinput.FileInput(filename, inplace=True) as file:
  34. for line in file:
  35. print(line.replace(to_replace, to_replace_with), end="")
  36. def main():
  37. """ The main """
  38. ctx = parse_commandline()
  39. # Copy dir
  40. project_dir = os.path.join(ctx.out_dir, "AndroidProject_%s" % ctx.target)
  41. if os.path.isdir(project_dir):
  42. raise Exception("Directory already exists: %s" % project_dir)
  43. this_script_dir = os.path.abspath(os.path.dirname(os.path.realpath(__file__)))
  44. shutil.copytree(this_script_dir, project_dir)
  45. # RM the script
  46. os.remove(os.path.join(project_dir, "GenerateAndroidProject.py"))
  47. # Create the assets dir structure
  48. assets_dir = os.path.join(project_dir, "assets")
  49. os.mkdir(assets_dir)
  50. os.mkdir(os.path.join(project_dir, "assets/AnKi/"))
  51. os.symlink(os.path.join(this_script_dir, "../../AnKi/Shaders"), os.path.join(project_dir, "assets/AnKi/Shaders"))
  52. os.symlink(os.path.join(this_script_dir, "../../EngineAssets"), os.path.join(project_dir, "assets/EngineAssets"))
  53. os.symlink(ctx.asserts_dir, os.path.join(project_dir, "assets/Assets"))
  54. # strings.xml
  55. replace_in_file(os.path.join(project_dir, "app/src/main/res/values/strings.xml"), "%APP_NAME%", ctx.target)
  56. # build.gradle
  57. build_gradle = os.path.join(project_dir, "app/build.gradle")
  58. replace_in_file(build_gradle, "%TARGET%", ctx.target)
  59. replace_in_file(build_gradle, "%PYTHON%", sys.executable)
  60. replace_in_file(build_gradle, "%CMAKE%", os.path.join(this_script_dir, "../../CMakeLists.txt"))
  61. # Done
  62. print("Generated project: %s" % project_dir)
  63. if __name__ == "__main__":
  64. main()