Actually do that, and also update .gitignore.
This commit is contained in:
parent
2961adc3a9
commit
3c193916e7
7 changed files with 12 additions and 417 deletions
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
assets/*.h
|
||||||
|
build*
|
||||||
|
.vscode
|
||||||
|
subprojects/*/
|
|
@ -1,2 +0,0 @@
|
||||||
assets/*.h
|
|
||||||
build*
|
|
81
.vscode/settings.json
vendored
81
.vscode/settings.json
vendored
|
@ -1,81 +0,0 @@
|
||||||
{
|
|
||||||
"C_Cpp.default.compileCommands": "builddir/vscode_compile_commands.json",
|
|
||||||
"files.associations": {
|
|
||||||
"array": "cpp",
|
|
||||||
"atomic": "cpp",
|
|
||||||
"hash_map": "cpp",
|
|
||||||
"bit": "cpp",
|
|
||||||
"*.tcc": "cpp",
|
|
||||||
"bitset": "cpp",
|
|
||||||
"cctype": "cpp",
|
|
||||||
"charconv": "cpp",
|
|
||||||
"chrono": "cpp",
|
|
||||||
"clocale": "cpp",
|
|
||||||
"cmath": "cpp",
|
|
||||||
"codecvt": "cpp",
|
|
||||||
"compare": "cpp",
|
|
||||||
"concepts": "cpp",
|
|
||||||
"condition_variable": "cpp",
|
|
||||||
"csignal": "cpp",
|
|
||||||
"cstdarg": "cpp",
|
|
||||||
"cstddef": "cpp",
|
|
||||||
"cstdint": "cpp",
|
|
||||||
"cstdio": "cpp",
|
|
||||||
"cstdlib": "cpp",
|
|
||||||
"cstring": "cpp",
|
|
||||||
"ctime": "cpp",
|
|
||||||
"cwchar": "cpp",
|
|
||||||
"cwctype": "cpp",
|
|
||||||
"deque": "cpp",
|
|
||||||
"forward_list": "cpp",
|
|
||||||
"list": "cpp",
|
|
||||||
"map": "cpp",
|
|
||||||
"set": "cpp",
|
|
||||||
"string": "cpp",
|
|
||||||
"unordered_map": "cpp",
|
|
||||||
"unordered_set": "cpp",
|
|
||||||
"vector": "cpp",
|
|
||||||
"exception": "cpp",
|
|
||||||
"algorithm": "cpp",
|
|
||||||
"functional": "cpp",
|
|
||||||
"iterator": "cpp",
|
|
||||||
"memory": "cpp",
|
|
||||||
"memory_resource": "cpp",
|
|
||||||
"numeric": "cpp",
|
|
||||||
"optional": "cpp",
|
|
||||||
"random": "cpp",
|
|
||||||
"ratio": "cpp",
|
|
||||||
"source_location": "cpp",
|
|
||||||
"string_view": "cpp",
|
|
||||||
"system_error": "cpp",
|
|
||||||
"tuple": "cpp",
|
|
||||||
"type_traits": "cpp",
|
|
||||||
"utility": "cpp",
|
|
||||||
"fstream": "cpp",
|
|
||||||
"future": "cpp",
|
|
||||||
"initializer_list": "cpp",
|
|
||||||
"iomanip": "cpp",
|
|
||||||
"iosfwd": "cpp",
|
|
||||||
"iostream": "cpp",
|
|
||||||
"istream": "cpp",
|
|
||||||
"limits": "cpp",
|
|
||||||
"mutex": "cpp",
|
|
||||||
"new": "cpp",
|
|
||||||
"numbers": "cpp",
|
|
||||||
"ostream": "cpp",
|
|
||||||
"semaphore": "cpp",
|
|
||||||
"shared_mutex": "cpp",
|
|
||||||
"sstream": "cpp",
|
|
||||||
"stdexcept": "cpp",
|
|
||||||
"stop_token": "cpp",
|
|
||||||
"streambuf": "cpp",
|
|
||||||
"thread": "cpp",
|
|
||||||
"cfenv": "cpp",
|
|
||||||
"cinttypes": "cpp",
|
|
||||||
"typeindex": "cpp",
|
|
||||||
"typeinfo": "cpp",
|
|
||||||
"valarray": "cpp",
|
|
||||||
"variant": "cpp"
|
|
||||||
},
|
|
||||||
"mesonbuild.configureOnOpen": true
|
|
||||||
}
|
|
330
cmake2meson.py
330
cmake2meson.py
|
@ -1,330 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
# Copyright 2014 Jussi Pakkanen
|
|
||||||
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
import typing as T
|
|
||||||
from pathlib import Path
|
|
||||||
import sys
|
|
||||||
import re
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
|
|
||||||
class Token:
|
|
||||||
def __init__(self, tid: str, value: str):
|
|
||||||
self.tid = tid
|
|
||||||
self.value = value
|
|
||||||
self.lineno = 0
|
|
||||||
self.colno = 0
|
|
||||||
|
|
||||||
class Statement:
|
|
||||||
def __init__(self, name: str, args: list):
|
|
||||||
self.name = name.lower()
|
|
||||||
self.args = args
|
|
||||||
|
|
||||||
class Lexer:
|
|
||||||
def __init__(self) -> None:
|
|
||||||
self.token_specification = [
|
|
||||||
# Need to be sorted longest to shortest.
|
|
||||||
('ignore', re.compile(r'[ \t]')),
|
|
||||||
('string', re.compile(r'"([^\\]|(\\.))*?"', re.M)),
|
|
||||||
('varexp', re.compile(r'\${[-_0-9a-z/A-Z.]+}')),
|
|
||||||
('id', re.compile('''[,-><${}=+_0-9a-z/A-Z|@.*]+''')),
|
|
||||||
('eol', re.compile(r'\n')),
|
|
||||||
('comment', re.compile(r'#.*')),
|
|
||||||
('lparen', re.compile(r'\(')),
|
|
||||||
('rparen', re.compile(r'\)')),
|
|
||||||
]
|
|
||||||
|
|
||||||
def lex(self, code: str) -> T.Iterator[Token]:
|
|
||||||
lineno = 1
|
|
||||||
line_start = 0
|
|
||||||
loc = 0
|
|
||||||
col = 0
|
|
||||||
while loc < len(code):
|
|
||||||
matched = False
|
|
||||||
for (tid, reg) in self.token_specification:
|
|
||||||
mo = reg.match(code, loc)
|
|
||||||
if mo:
|
|
||||||
col = mo.start() - line_start
|
|
||||||
matched = True
|
|
||||||
loc = mo.end()
|
|
||||||
match_text = mo.group()
|
|
||||||
if tid == 'ignore':
|
|
||||||
continue
|
|
||||||
if tid == 'comment':
|
|
||||||
yield(Token('comment', match_text))
|
|
||||||
elif tid == 'lparen':
|
|
||||||
yield(Token('lparen', '('))
|
|
||||||
elif tid == 'rparen':
|
|
||||||
yield(Token('rparen', ')'))
|
|
||||||
elif tid == 'string':
|
|
||||||
yield(Token('string', match_text[1:-1]))
|
|
||||||
elif tid == 'id':
|
|
||||||
yield(Token('id', match_text))
|
|
||||||
elif tid == 'eol':
|
|
||||||
# yield('eol')
|
|
||||||
lineno += 1
|
|
||||||
col = 1
|
|
||||||
line_start = mo.end()
|
|
||||||
elif tid == 'varexp':
|
|
||||||
yield(Token('varexp', match_text[2:-1]))
|
|
||||||
else:
|
|
||||||
raise ValueError(f'lex: unknown element {tid}')
|
|
||||||
break
|
|
||||||
if not matched:
|
|
||||||
raise ValueError('Lexer got confused line %d column %d' % (lineno, col))
|
|
||||||
|
|
||||||
class Parser:
|
|
||||||
def __init__(self, code: str) -> None:
|
|
||||||
self.stream = Lexer().lex(code)
|
|
||||||
self.getsym()
|
|
||||||
|
|
||||||
def getsym(self) -> None:
|
|
||||||
try:
|
|
||||||
self.current = next(self.stream)
|
|
||||||
except StopIteration:
|
|
||||||
self.current = Token('eof', '')
|
|
||||||
|
|
||||||
def accept(self, s: str) -> bool:
|
|
||||||
if self.current.tid == s:
|
|
||||||
self.getsym()
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def expect(self, s: str) -> bool:
|
|
||||||
if self.accept(s):
|
|
||||||
return True
|
|
||||||
raise ValueError(f'Expecting {s} got {self.current.tid}.', self.current.lineno, self.current.colno)
|
|
||||||
|
|
||||||
def statement(self) -> Statement:
|
|
||||||
cur = self.current
|
|
||||||
if self.accept('comment'):
|
|
||||||
return Statement('_', [cur.value])
|
|
||||||
self.accept('id')
|
|
||||||
self.expect('lparen')
|
|
||||||
args = self.arguments()
|
|
||||||
self.expect('rparen')
|
|
||||||
return Statement(cur.value, args)
|
|
||||||
|
|
||||||
def arguments(self) -> T.List[T.Union[Token, T.Any]]:
|
|
||||||
args = [] # type: T.List[T.Union[Token, T.Any]]
|
|
||||||
if self.accept('lparen'):
|
|
||||||
args.append(self.arguments())
|
|
||||||
self.expect('rparen')
|
|
||||||
arg = self.current
|
|
||||||
if self.accept('comment'):
|
|
||||||
rest = self.arguments()
|
|
||||||
args += rest
|
|
||||||
elif self.accept('string') \
|
|
||||||
or self.accept('varexp') \
|
|
||||||
or self.accept('id'):
|
|
||||||
args.append(arg)
|
|
||||||
rest = self.arguments()
|
|
||||||
args += rest
|
|
||||||
return args
|
|
||||||
|
|
||||||
def parse(self) -> T.Iterator[Statement]:
|
|
||||||
while not self.accept('eof'):
|
|
||||||
yield(self.statement())
|
|
||||||
|
|
||||||
def token_or_group(arg: T.Union[Token, T.List[Token]]) -> str:
|
|
||||||
if isinstance(arg, Token):
|
|
||||||
return ' ' + arg.value
|
|
||||||
elif isinstance(arg, list):
|
|
||||||
line = ' ('
|
|
||||||
for a in arg:
|
|
||||||
line += ' ' + token_or_group(a)
|
|
||||||
line += ' )'
|
|
||||||
return line
|
|
||||||
raise RuntimeError('Conversion error in token_or_group')
|
|
||||||
|
|
||||||
class Converter:
|
|
||||||
ignored_funcs = {'cmake_minimum_required': True,
|
|
||||||
'enable_testing': True,
|
|
||||||
'include': True}
|
|
||||||
|
|
||||||
def __init__(self, cmake_root: str):
|
|
||||||
self.cmake_root = Path(cmake_root).expanduser()
|
|
||||||
self.indent_unit = ' '
|
|
||||||
self.indent_level = 0
|
|
||||||
self.options = [] # type: T.List[tuple]
|
|
||||||
|
|
||||||
def convert_args(self, args: T.List[Token], as_array: bool = True) -> str:
|
|
||||||
res = []
|
|
||||||
if as_array:
|
|
||||||
start = '['
|
|
||||||
end = ']'
|
|
||||||
else:
|
|
||||||
start = ''
|
|
||||||
end = ''
|
|
||||||
for i in args:
|
|
||||||
if i.tid == 'id':
|
|
||||||
res.append("'%s'" % i.value)
|
|
||||||
elif i.tid == 'varexp':
|
|
||||||
res.append('%s' % i.value.lower())
|
|
||||||
elif i.tid == 'string':
|
|
||||||
res.append("'%s'" % i.value)
|
|
||||||
else:
|
|
||||||
raise ValueError(f'Unknown arg type {i.tid}')
|
|
||||||
if len(res) > 1:
|
|
||||||
return start + ', '.join(res) + end
|
|
||||||
if len(res) == 1:
|
|
||||||
return res[0]
|
|
||||||
return ''
|
|
||||||
|
|
||||||
def write_entry(self, outfile: T.TextIO, t: Statement) -> None:
|
|
||||||
if t.name in Converter.ignored_funcs:
|
|
||||||
return
|
|
||||||
preincrement = 0
|
|
||||||
postincrement = 0
|
|
||||||
if t.name == '_':
|
|
||||||
line = t.args[0]
|
|
||||||
elif t.name == 'add_subdirectory':
|
|
||||||
line = "subdir('" + t.args[0].value + "')"
|
|
||||||
elif t.name == 'pkg_search_module' or t.name == 'pkg_search_modules':
|
|
||||||
varname = t.args[0].value.lower()
|
|
||||||
mods = ["dependency('%s')" % i.value for i in t.args[1:]]
|
|
||||||
if len(mods) == 1:
|
|
||||||
line = '{} = {}'.format(varname, mods[0])
|
|
||||||
else:
|
|
||||||
line = '{} = [{}]'.format(varname, ', '.join(["'%s'" % i for i in mods]))
|
|
||||||
elif t.name == 'find_package':
|
|
||||||
line = "{}_dep = dependency('{}')".format(t.args[0].value, t.args[0].value)
|
|
||||||
elif t.name == 'find_library':
|
|
||||||
line = "{} = find_library('{}')".format(t.args[0].value.lower(), t.args[0].value)
|
|
||||||
elif t.name == 'add_executable':
|
|
||||||
line = '{}_exe = executable({})'.format(t.args[0].value, self.convert_args(t.args, False))
|
|
||||||
elif t.name == 'add_library':
|
|
||||||
if t.args[1].value == 'SHARED':
|
|
||||||
libcmd = 'shared_library'
|
|
||||||
args = [t.args[0]] + t.args[2:]
|
|
||||||
elif t.args[1].value == 'STATIC':
|
|
||||||
libcmd = 'static_library'
|
|
||||||
args = [t.args[0]] + t.args[2:]
|
|
||||||
else:
|
|
||||||
libcmd = 'library'
|
|
||||||
args = t.args
|
|
||||||
line = '{}_lib = {}({})'.format(t.args[0].value, libcmd, self.convert_args(args, False))
|
|
||||||
elif t.name == 'add_test':
|
|
||||||
line = 'test(%s)' % self.convert_args(t.args, False)
|
|
||||||
elif t.name == 'option':
|
|
||||||
optname = t.args[0].value
|
|
||||||
description = t.args[1].value
|
|
||||||
if len(t.args) > 2:
|
|
||||||
default = t.args[2].value
|
|
||||||
else:
|
|
||||||
default = None
|
|
||||||
self.options.append((optname, description, default))
|
|
||||||
return
|
|
||||||
elif t.name == 'project':
|
|
||||||
pname = t.args[0].value
|
|
||||||
args = [pname]
|
|
||||||
for l in t.args[1:]:
|
|
||||||
l = l.value.lower()
|
|
||||||
if l == 'cxx':
|
|
||||||
l = 'cpp'
|
|
||||||
args.append(l)
|
|
||||||
args = ["'%s'" % i for i in args]
|
|
||||||
line = 'project(' + ', '.join(args) + ", default_options : ['default_library=static'])"
|
|
||||||
elif t.name == 'set':
|
|
||||||
varname = t.args[0].value.lower()
|
|
||||||
line = '{} = {}\n'.format(varname, self.convert_args(t.args[1:]))
|
|
||||||
elif t.name == 'if':
|
|
||||||
postincrement = 1
|
|
||||||
try:
|
|
||||||
line = 'if %s' % self.convert_args(t.args, False)
|
|
||||||
except AttributeError: # complex if statements
|
|
||||||
line = t.name
|
|
||||||
for arg in t.args:
|
|
||||||
line += token_or_group(arg)
|
|
||||||
elif t.name == 'elseif':
|
|
||||||
preincrement = -1
|
|
||||||
postincrement = 1
|
|
||||||
try:
|
|
||||||
line = 'elif %s' % self.convert_args(t.args, False)
|
|
||||||
except AttributeError: # complex if statements
|
|
||||||
line = t.name
|
|
||||||
for arg in t.args:
|
|
||||||
line += token_or_group(arg)
|
|
||||||
elif t.name == 'else':
|
|
||||||
preincrement = -1
|
|
||||||
postincrement = 1
|
|
||||||
line = 'else'
|
|
||||||
elif t.name == 'endif':
|
|
||||||
preincrement = -1
|
|
||||||
line = 'endif'
|
|
||||||
else:
|
|
||||||
line = '''# {}({})'''.format(t.name, self.convert_args(t.args))
|
|
||||||
self.indent_level += preincrement
|
|
||||||
indent = self.indent_level * self.indent_unit
|
|
||||||
outfile.write(indent)
|
|
||||||
outfile.write(line)
|
|
||||||
if not(line.endswith('\n')):
|
|
||||||
outfile.write('\n')
|
|
||||||
self.indent_level += postincrement
|
|
||||||
|
|
||||||
def convert(self, subdir: Path = None) -> None:
|
|
||||||
if not subdir:
|
|
||||||
subdir = self.cmake_root
|
|
||||||
cfile = Path(subdir).expanduser() / 'CMakeLists.txt'
|
|
||||||
try:
|
|
||||||
with cfile.open(encoding='utf-8') as f:
|
|
||||||
cmakecode = f.read()
|
|
||||||
except FileNotFoundError:
|
|
||||||
print('\nWarning: No CMakeLists.txt in', subdir, '\n', file=sys.stderr)
|
|
||||||
return
|
|
||||||
p = Parser(cmakecode)
|
|
||||||
with (subdir / 'meson.build').open('w', encoding='utf-8') as outfile:
|
|
||||||
for t in p.parse():
|
|
||||||
if t.name == 'add_subdirectory':
|
|
||||||
# print('\nRecursing to subdir',
|
|
||||||
# self.cmake_root / t.args[0].value,
|
|
||||||
# '\n')
|
|
||||||
self.convert(subdir / t.args[0].value)
|
|
||||||
# print('\nReturning to', self.cmake_root, '\n')
|
|
||||||
self.write_entry(outfile, t)
|
|
||||||
if subdir == self.cmake_root and len(self.options) > 0:
|
|
||||||
self.write_options()
|
|
||||||
|
|
||||||
def write_options(self) -> None:
|
|
||||||
filename = self.cmake_root / 'meson_options.txt'
|
|
||||||
with filename.open('w', encoding='utf-8') as optfile:
|
|
||||||
for o in self.options:
|
|
||||||
(optname, description, default) = o
|
|
||||||
if default is None:
|
|
||||||
typestr = ''
|
|
||||||
defaultstr = ''
|
|
||||||
else:
|
|
||||||
if default == 'OFF':
|
|
||||||
typestr = ' type : \'boolean\','
|
|
||||||
default = 'false'
|
|
||||||
elif default == 'ON':
|
|
||||||
default = 'true'
|
|
||||||
typestr = ' type : \'boolean\','
|
|
||||||
else:
|
|
||||||
typestr = ' type : \'string\','
|
|
||||||
defaultstr = ' value : %s,' % default
|
|
||||||
line = "option({!r},{}{} description : '{}')\n".format(optname,
|
|
||||||
typestr,
|
|
||||||
defaultstr,
|
|
||||||
description)
|
|
||||||
optfile.write(line)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
p = argparse.ArgumentParser(description='Convert CMakeLists.txt to meson.build and meson_options.txt')
|
|
||||||
p.add_argument('cmake_root', help='CMake project root (where top-level CMakeLists.txt is)')
|
|
||||||
P = p.parse_args()
|
|
||||||
|
|
||||||
Converter(P.cmake_root).convert()
|
|
|
@ -2,16 +2,18 @@ project('neko-player', ['c', 'cpp'],
|
||||||
version : '0.1',
|
version : '0.1',
|
||||||
default_options : ['warning_level=3',
|
default_options : ['warning_level=3',
|
||||||
'cpp_std=c++20'])
|
'cpp_std=c++20'])
|
||||||
|
|
||||||
if get_option('debug')
|
if get_option('debug')
|
||||||
add_global_arguments('-DDEBUG', language: 'cpp')
|
add_global_arguments('-DDEBUG', language: 'cpp')
|
||||||
endif
|
endif
|
||||||
|
raudio_lib = static_library('raudio', 'raudio/src/raudio.c', c_args: ['-DRAUDIO_STANDALONE', '-DSUPPORT_MODULE_RAUDIO', '-DSUPPORT_FILEFORMAT_WAV', '-DSUPPORT_FILEFORMAT_OGG', '-DSUPPORT_FILEFORMAT_MP3', '-DSUPPORT_FILEFORMAT_QOA', '-DSUPPORT_FILEFORMAT_FLAC', '-DSUPPORT_FILEFORMAT_XM', '-DSUPPORT_FILEFORMAT_MOD'])
|
||||||
|
raudio_include = include_directories('raudio/src')
|
||||||
|
raudio_dep = declare_dependency(include_directories: raudio_include, link_with: raudio_lib)
|
||||||
deps = [
|
deps = [
|
||||||
dependency('raylib'),
|
|
||||||
dependency('sdl2'),
|
dependency('sdl2'),
|
||||||
dependency('sdl2_image'),
|
dependency('sdl2_image'),
|
||||||
dependency('gl'),
|
dependency('gl'),
|
||||||
dependency('jsoncpp'),
|
dependency('jsoncpp'),
|
||||||
|
raudio_dep,
|
||||||
]
|
]
|
||||||
|
|
||||||
srcs = [
|
srcs = [
|
||||||
|
@ -32,6 +34,7 @@ include_dirs = [
|
||||||
'imgui-filebrowser',
|
'imgui-filebrowser',
|
||||||
'IconFontCppHeaders',
|
'IconFontCppHeaders',
|
||||||
'assets',
|
'assets',
|
||||||
|
'raudio/src',
|
||||||
]
|
]
|
||||||
|
|
||||||
res = run_command('./assets/update-assets.sh', check: true)
|
res = run_command('./assets/update-assets.sh', check: true)
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include "playback.h"
|
#include "playback.h"
|
||||||
#include <raylib.h>
|
extern "C" {
|
||||||
|
#include "raudio.h"
|
||||||
|
}
|
||||||
#include <thread>
|
#include <thread>
|
||||||
using namespace std::chrono;
|
using namespace std::chrono;
|
||||||
void Playback::ThreadFunc() {
|
void Playback::ThreadFunc() {
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 334e96d470c5cb09d154e1c849d04adb721a7a8c
|
|
Loading…
Reference in a new issue