Add vala template

pull/9589/head
Alberto Fanjul 3 years ago committed by Eli Schwartz
parent 4c62dab611
commit 05e0712f59
  1. 7
      mesonbuild/minit.py
  2. 5
      mesonbuild/templates/mesontemplates.py
  3. 4
      mesonbuild/templates/samplefactory.py
  4. 123
      mesonbuild/templates/valatemplates.py

@ -36,8 +36,8 @@ we currently have one meson template at this time.
from mesonbuild.templates.mesontemplates import create_meson_build from mesonbuild.templates.mesontemplates import create_meson_build
FORTRAN_SUFFIXES = {'.f', '.for', '.F', '.f90', '.F90'} FORTRAN_SUFFIXES = {'.f', '.for', '.F', '.f90', '.F90'}
LANG_SUFFIXES = {'.c', '.cc', '.cpp', '.cs', '.cu', '.d', '.m', '.mm', '.rs', '.java'} | FORTRAN_SUFFIXES LANG_SUFFIXES = {'.c', '.cc', '.cpp', '.cs', '.cu', '.d', '.m', '.mm', '.rs', '.java', '.vala'} | FORTRAN_SUFFIXES
LANG_SUPPORTED = {'c', 'cpp', 'cs', 'cuda', 'd', 'fortran', 'java', 'rust', 'objc', 'objcpp'} LANG_SUPPORTED = {'c', 'cpp', 'cs', 'cuda', 'd', 'fortran', 'java', 'rust', 'objc', 'objcpp', 'vala'}
DEFAULT_PROJECT = 'executable' DEFAULT_PROJECT = 'executable'
DEFAULT_VERSION = '0.1' DEFAULT_VERSION = '0.1'
@ -127,6 +127,9 @@ def autodetect_options(options: 'argparse.Namespace', sample: bool = False) -> N
if f.suffix == '.java': if f.suffix == '.java':
options.language = 'java' options.language = 'java'
break break
if f.suffix == '.vala':
options.language = 'vala'
break
if not options.language: if not options.language:
raise SystemExit("Can't autodetect language, please specify it with -l.") raise SystemExit("Can't autodetect language, please specify it with -l.")
print("Detected language: " + options.language) print("Detected language: " + options.language)

@ -14,7 +14,7 @@
import argparse import argparse
meson_executable_template = '''project('{project_name}', '{language}', meson_executable_template = '''project('{project_name}', {language},
version : '{version}', version : '{version}',
default_options : [{default_options}]) default_options : [{default_options}])
@ -55,8 +55,9 @@ def create_meson_build(options: argparse.Namespace) -> None:
for x in options.deps.split(',')) for x in options.deps.split(','))
depspec += '],' depspec += '],'
if options.language != 'java': if options.language != 'java':
language = f"'{options.language}'" if options.language != 'vala' else ['c', 'vala']
content = meson_executable_template.format(project_name=options.name, content = meson_executable_template.format(project_name=options.name,
language=options.language, language=language,
version=options.version, version=options.version,
executable=options.executable, executable=options.executable,
sourcespec=sourcespec, sourcespec=sourcespec,

@ -11,6 +11,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
from mesonbuild.templates.valatemplates import ValaProject
from mesonbuild.templates.fortrantemplates import FortranProject from mesonbuild.templates.fortrantemplates import FortranProject
from mesonbuild.templates.objcpptemplates import ObjCppProject from mesonbuild.templates.objcpptemplates import ObjCppProject
from mesonbuild.templates.dlangtemplates import DlangProject from mesonbuild.templates.dlangtemplates import DlangProject
@ -36,5 +37,6 @@ def sameple_generator(options: argparse.Namespace) -> SampleImpl:
'java': JavaProject, 'java': JavaProject,
'd': DlangProject, 'd': DlangProject,
'rust': RustProject, 'rust': RustProject,
'fortran': FortranProject 'fortran': FortranProject,
'vala': ValaProject
}[options.language](options) }[options.language](options)

@ -0,0 +1,123 @@
# Copyright 2019 The Meson development team
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from mesonbuild.templates.sampleimpl import SampleImpl
import re
hello_vala_template = '''void main (string[] args) {{
stdout.printf ("Hello {project_name}!\\n");
}}
'''
hello_vala_meson_template = '''project('{project_name}', ['c', 'vala'],
version : '{version}')
dependencies = [
dependency('glib-2.0'),
dependency('gobject-2.0'),
]
exe = executable('{exe_name}', '{source_name}', dependencies : dependencies,
install : true)
test('basic', exe)
'''
lib_vala_template = '''namespace {namespace} {{
public int sum(int a, int b) {{
return(a + b);
}}
public int square(int a) {{
return(a * a);
}}
}}
'''
lib_vala_test_template = '''using {namespace};
public void main() {{
stdout.printf("\nTesting shlib");
stdout.printf("\n\t2 + 3 is %d", sum(2, 3));
stdout.printf("\n\t8 squared is %d\\n", square(8));
}}
'''
lib_vala_meson_template = '''project('{project_name}', ['c', 'vala'],
version : '{version}')
dependencies = [
dependency('glib-2.0'),
dependency('gobject-2.0'),
]
# These arguments are only used to build the shared library
# not the executables that use the library.
shlib = shared_library('foo', '{source_file}',
dependencies: dependencies,
install: true,
install_dir: [true, true, true])
test_exe = executable('{test_exe_name}', '{test_source_file}', dependencies : dependencies,
link_with : shlib)
test('{test_name}', test_exe)
# Make this library usable as a Meson subproject.
{ltoken}_dep = declare_dependency(
include_directories: include_directories('.'),
link_with : shlib)
'''
class ValaProject(SampleImpl):
def __init__(self, options):
super().__init__()
self.name = options.name
self.version = options.version
def create_executable(self) -> None:
lowercase_token = re.sub(r'[^a-z0-9]', '_', self.name.lower())
source_name = lowercase_token + '.vala'
open(source_name, 'w', encoding='utf-8').write(hello_vala_template.format(project_name=self.name))
open('meson.build', 'w', encoding='utf-8').write(
hello_vala_meson_template.format(project_name=self.name,
exe_name=lowercase_token,
source_name=source_name,
version=self.version))
def create_library(self) -> None:
lowercase_token = re.sub(r'[^a-z0-9]', '_', self.name.lower())
uppercase_token = lowercase_token.upper()
class_name = uppercase_token[0] + lowercase_token[1:]
test_exe_name = lowercase_token + '_test'
namespace = lowercase_token
lib_vala_name = lowercase_token + '.vala'
test_vala_name = lowercase_token + '_test.vala'
kwargs = {'utoken': uppercase_token,
'ltoken': lowercase_token,
'header_dir': lowercase_token,
'class_name': class_name,
'namespace': namespace,
'source_file': lib_vala_name,
'test_source_file': test_vala_name,
'test_exe_name': test_exe_name,
'project_name': self.name,
'lib_name': lowercase_token,
'test_name': lowercase_token,
'version': self.version,
}
open(lib_vala_name, 'w', encoding='utf-8').write(lib_vala_template.format(**kwargs))
open(test_vala_name, 'w', encoding='utf-8').write(lib_vala_test_template.format(**kwargs))
open('meson.build', 'w', encoding='utf-8').write(lib_vala_meson_template.format(**kwargs))
Loading…
Cancel
Save