mirror of
https://github.com/mesonbuild/meson.git
synced 2026-11-06 05:16:42 +00:00
This replaces all of the Apache blurbs at the start of each file with an `# SPDX-License-Identifier: Apache-2.0` string. It also fixes existing uses to be consistent in capitalization, and to be placed above any copyright notices. This removes nearly 3000 lines of boilerplate from the project (only python files), which no developer cares to look at. SPDX is in common use, particularly in the Linux kernel, and is the recommended format for Meson's own `project(license: )` field
113 lines
4.0 KiB
Python
113 lines
4.0 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
# Copyright 2012-2017 The Meson development team
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import os.path
|
|
import shutil
|
|
import subprocess
|
|
import textwrap
|
|
import typing as T
|
|
|
|
from ..mesonlib import EnvironmentException
|
|
from .compilers import Compiler, java_buildtype_args
|
|
from .mixins.islinker import BasicLinkerIsCompilerMixin
|
|
|
|
if T.TYPE_CHECKING:
|
|
from ..envconfig import MachineInfo
|
|
from ..environment import Environment
|
|
from ..mesonlib import MachineChoice
|
|
|
|
class JavaCompiler(BasicLinkerIsCompilerMixin, Compiler):
|
|
|
|
language = 'java'
|
|
id = 'unknown'
|
|
|
|
_WARNING_LEVELS: T.Dict[str, T.List[str]] = {
|
|
'0': ['-nowarn'],
|
|
'1': ['-Xlint:all'],
|
|
'2': ['-Xlint:all', '-Xdoclint:all'],
|
|
'3': ['-Xlint:all', '-Xdoclint:all'],
|
|
}
|
|
|
|
def __init__(self, exelist: T.List[str], version: str, for_machine: MachineChoice,
|
|
info: 'MachineInfo', full_version: T.Optional[str] = None):
|
|
super().__init__([], exelist, version, for_machine, info, full_version=full_version)
|
|
self.javarunner = 'java'
|
|
|
|
def get_warn_args(self, level: str) -> T.List[str]:
|
|
return self._WARNING_LEVELS[level]
|
|
|
|
def get_werror_args(self) -> T.List[str]:
|
|
return ['-Werror']
|
|
|
|
def get_output_args(self, outputname: str) -> T.List[str]:
|
|
if outputname == '':
|
|
outputname = './'
|
|
return ['-d', outputname, '-s', outputname]
|
|
|
|
def get_pic_args(self) -> T.List[str]:
|
|
return []
|
|
|
|
def get_pch_use_args(self, pch_dir: str, header: str) -> T.List[str]:
|
|
return []
|
|
|
|
def get_pch_name(self, name: str) -> str:
|
|
return ''
|
|
|
|
def get_buildtype_args(self, buildtype: str) -> T.List[str]:
|
|
return java_buildtype_args[buildtype]
|
|
|
|
def compute_parameters_with_absolute_paths(self, parameter_list: T.List[str],
|
|
build_dir: str) -> T.List[str]:
|
|
for idx, i in enumerate(parameter_list):
|
|
if i in {'-cp', '-classpath', '-sourcepath'} and idx + 1 < len(parameter_list):
|
|
path_list = parameter_list[idx + 1].split(os.pathsep)
|
|
path_list = [os.path.normpath(os.path.join(build_dir, x)) for x in path_list]
|
|
parameter_list[idx + 1] = os.pathsep.join(path_list)
|
|
|
|
return parameter_list
|
|
|
|
def sanity_check(self, work_dir: str, environment: 'Environment') -> None:
|
|
src = 'SanityCheck.java'
|
|
obj = 'SanityCheck'
|
|
source_name = os.path.join(work_dir, src)
|
|
with open(source_name, 'w', encoding='utf-8') as ofile:
|
|
ofile.write(textwrap.dedent(
|
|
'''class SanityCheck {
|
|
public static void main(String[] args) {
|
|
int i;
|
|
}
|
|
}
|
|
'''))
|
|
pc = subprocess.Popen(self.exelist + [src], cwd=work_dir)
|
|
pc.wait()
|
|
if pc.returncode != 0:
|
|
raise EnvironmentException(f'Java compiler {self.name_string()} cannot compile programs.')
|
|
runner = shutil.which(self.javarunner)
|
|
if runner:
|
|
cmdlist = [runner, '-cp', '.', obj]
|
|
pe = subprocess.Popen(cmdlist, cwd=work_dir)
|
|
pe.wait()
|
|
if pe.returncode != 0:
|
|
raise EnvironmentException(f'Executables created by Java compiler {self.name_string()} are not runnable.')
|
|
else:
|
|
m = "Java Virtual Machine wasn't found, but it's needed by Meson. " \
|
|
"Please install a JRE.\nIf you have specific needs where this " \
|
|
"requirement doesn't make sense, please open a bug at " \
|
|
"https://github.com/mesonbuild/meson/issues/new and tell us " \
|
|
"all about it."
|
|
raise EnvironmentException(m)
|
|
|
|
def needs_static_linker(self) -> bool:
|
|
return False
|
|
|
|
def get_optimization_args(self, optimization_level: str) -> T.List[str]:
|
|
return []
|
|
|
|
def get_debug_args(self, is_debug: bool) -> T.List[str]:
|
|
if is_debug:
|
|
return ['-g']
|
|
return ['-g:none']
|