Files
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

113 lines
3.8 KiB
Python

import os
import argparse
import platform
import subprocess
import re
# NOTE: In JDK 8 and earlier, `javac` does not create the directories specified in the -d option if they do not already exist
# So we need to create them manually
def makedirs(dir):
if not os.path.exists(dir):
os.makedirs(dir)
return
def is_javac_available(javac):
try:
process = subprocess.Popen([javac, '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
ret = process.wait()
return ret == 0
except Exception:
return False
def get_jdk_version(javac):
try:
process = subprocess.Popen([javac, '-version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
output = stdout if stdout else stderr
if not output:
return 0
javac_version_str = output.decode('utf-8').strip()
match = re.search('(\d+)(?:\.(\d+))?', javac_version_str)
if not match:
return 0
major_version = int(match.group(1))
minor_version = int(match.group(2)) if match.group(2) else 0
# for JDK 9 and earlier command `javac -version` would give '1.x.xx'
if major_version == 1:
return minor_version
return major_version
except Exception:
return 0
# return all files with extension `ext` in directory `dir` as string
def getFilesInDir(dir, ext):
files = [];
for file in os.listdir(dir):
if file.endswith(ext):
files.append(os.path.join(dir, file))
return files
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Build Java wrapper for docbuilder library')
parser.add_argument('-H', '--headers', action='store_true', help='Generate C++ JNI header files')
parser.add_argument('-n', '--no-jar', dest='no_jar', action='store_true', help='Build only classes without JAR archive')
args = parser.parse_args()
file_dir = os.path.dirname(os.path.realpath(__file__));
os.chdir(file_dir + '/src/java')
java_files = getFilesInDir('docbuilder', '.java')
java_files += getFilesInDir('docbuilder/utils', '.java')
# INITIALIZE JDK TOOLS
javac = 'javac'
jar = 'jar'
ext = '.exe' if platform.system().lower() == 'windows' else ''
java_home = os.environ.get('JAVA_HOME')
if java_home:
javac = os.path.join(java_home, 'bin', 'javac' + ext)
if not os.path.exists(javac):
print('Error: Cannot find: ' + javac)
exit()
jar = os.path.join(java_home, 'bin', 'jar' + ext)
else:
print('Warning: environment variable JAVA_HOME wasn\'t set. Default Java compiler will be used (if any).')
if not is_javac_available(javac):
print('Error: javac is not available')
exit()
# CHECK JDK VERSION
jdk_version = get_jdk_version(javac)
if jdk_version < 8:
print('Error: javac version is not supported')
exit()
# BUILD
release_flags = []
if jdk_version > 8:
release_flags = ['--release', '8']
gen_headers_flags = []
if args.headers:
headers_dir = file_dir + '/src/jni'
gen_headers_flags = ['-h', headers_dir]
classes_dir = file_dir + '/build/classes'
makedirs(classes_dir + '/docbuilder/utils')
# build all Java classes
subprocess.call([javac, '-d', classes_dir] + release_flags + gen_headers_flags + java_files, cwd=os.getcwd(), stderr=subprocess.STDOUT)
# PACKING TO JAR
if not args.no_jar:
os.chdir(classes_dir)
class_files = getFilesInDir('docbuilder', '.class')
class_files += getFilesInDir('docbuilder/utils', '.class')
makedirs('../libs')
subprocess.call([jar, '-cvf', '../libs/docbuilder.jar'] + class_files, cwd=os.getcwd(), stderr=subprocess.STDOUT)