procedural-3d-engine/android/build.py

142 lines
5 KiB
Python

# Single example build and deploy script
import os
import subprocess
import sys
import shutil
import glob
import json
# Android SDK version used
SDK_VERSION = "android-23"
PROJECT_FOLDER = ""
# Check if python 3, python 2 not supported
if sys.version_info <= (3, 0):
print("Sorry, requires Python 3.x, not Python 2.x")
sys.exit(-1)
# Name/folder of the project to build
if len(sys.argv) > 1:
PROJECT_FOLDER = sys.argv[1]
if not os.path.exists(PROJECT_FOLDER):
print("Please specify a valid project folder to build!")
sys.exit(-1)
# Definitions (apk name, folders, etc.) will be taken from a json definition
if not os.path.isfile(os.path.join(PROJECT_FOLDER, "example.json")):
print("Could not find json definition for example %s" % PROJECT_FOLDER)
sys.exit(-1)
# Check if a build file is present, if not create one using the android SDK version specified
if not os.path.isfile(os.path.join(PROJECT_FOLDER, "build.xml")):
print("Build.xml not present, generating with %s " % SDK_VERSION)
ANDROID_CMD = "android"
if os.name == 'nt':
ANDROID_CMD += ".bat"
if subprocess.call(("%s update project -p ./%s -t %s" % (ANDROID_CMD, PROJECT_FOLDER, SDK_VERSION)).split(' ')) != 0:
print("Error: Project update failed!")
sys.exit(-1)
# Load example definition from json file
with open(os.path.join(PROJECT_FOLDER, "example.json")) as json_file:
EXAMPLE_JSON = json.load(json_file)
APK_NAME = EXAMPLE_JSON["apkname"]
SHADER_DIR = EXAMPLE_JSON["directories"]["shaders"]
# Additional
ADDITIONAL_DIRS = []
ADDITIONAL_FILES = []
if "assets" in EXAMPLE_JSON and "additional" in EXAMPLE_JSON["assets"]:
ADDITIONAL = EXAMPLE_JSON["assets"]["additional"]
if "directories" in ADDITIONAL:
ADDITIONAL_DIRS = ADDITIONAL["directories"]
if "files" in ADDITIONAL:
ADDITIONAL_FILES = ADDITIONAL["files"]
# Get assets to be copied
ASSETS_MODELS = []
ASSETS_TEXTURES = []
if "assets" in EXAMPLE_JSON:
ASSETS = EXAMPLE_JSON["assets"]
if "models" in ASSETS:
ASSETS_MODELS = EXAMPLE_JSON["assets"]["models"]
if "textures" in ASSETS:
ASSETS_TEXTURES = EXAMPLE_JSON["assets"]["textures"]
# Enable validation
VALIDATION = False
BUILD_ARGS = ""
for arg in sys.argv[1:]:
if arg == "-validation":
VALIDATION = True
# Use a define to force validation in code
BUILD_ARGS = "APP_CFLAGS=-D_VALIDATION"
break
# Verify submodules are loaded in external folder
if not os.listdir("../external/glm/") or not os.listdir("../external/gli/"):
print("External submodules not loaded. Clone them using:")
print("\tgit submodule init\n\tgit submodule update")
sys.exit(-1)
# Build
os.chdir(PROJECT_FOLDER)
if subprocess.call("ndk-build %s" %BUILD_ARGS, shell=True) == 0:
print("Build successful")
if VALIDATION:
# Copy validation layers
# todo: Currently only arm v7
print("Validation enabled, copying validation layers...")
os.makedirs("./libs/armeabi-v7a", exist_ok=True)
for file in glob.glob("../layers/armeabi-v7a/*.so"):
print("\t" + file)
shutil.copy(file, "./libs/armeabi-v7a")
# Create folders
os.makedirs("./assets/shaders/base", exist_ok=True)
os.makedirs("./assets/shaders/%s" % SHADER_DIR, exist_ok=True)
os.makedirs("./assets/models", exist_ok=True)
os.makedirs("./assets/textures", exist_ok=True)
for directory in ADDITIONAL_DIRS:
os.makedirs("./assets/%s" % directory, exist_ok=True)
os.makedirs("./res/drawable", exist_ok=True)
for filename in glob.glob("../../data/shaders/base/*.spv"):
shutil.copy(filename, "./assets/shaders/base")
for filename in glob.glob("../../data/shaders/%s/*.spv" %SHADER_DIR):
shutil.copy(filename, "./assets/shaders/%s" % SHADER_DIR)
for filename in ASSETS_MODELS:
shutil.copy("../../data/models/%s" % filename, "./assets/models")
for filename in ASSETS_TEXTURES:
shutil.copy("../../data/textures/%s" % filename, "./assets/textures")
for filename in ADDITIONAL_FILES:
if "*." in filename:
for fname in glob.glob("../../data/%s" % filename):
locfname = fname.replace("../../data/", "")
shutil.copy(fname, "./assets/%s" % locfname)
else:
shutil.copy("../../data/%s" % filename, "./assets/%s" % filename)
shutil.copy("../../android/images/icon.png", "./res/drawable")
if subprocess.call("ant debug -Dout.final.file=%s.apk" % APK_NAME, shell=True) == 0:
# Deploy to device
for arg in sys.argv[1:]:
if arg == "-deploy":
if subprocess.call("adb install -r %s.apk" % APK_NAME, shell=True) != 0:
print("Could not deploy to device!")
else:
print("Error during build process!")
sys.exit(-1)
else:
print("Error building project!")
sys.exit(-1)
# Copy apk to bin folder
os.makedirs("../bin", exist_ok=True)
shutil.move('%s.apk' % APK_NAME, "../bin/%s.apk" % APK_NAME)