diff options
Diffstat (limited to 'bin/mesoninit')
| -rwxr-xr-x | bin/mesoninit | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/bin/mesoninit b/bin/mesoninit new file mode 100755 index 0000000..5ce3b79 --- /dev/null +++ b/bin/mesoninit @@ -0,0 +1,191 @@ +#!/bin/bash +# vim: ft=sh + +_meson_dir=`pwd` +_meson_lang=c + +while getopts ":hl:" o; do + case $o in + l) + _meson_lang=$OPTARG + ;; + h | *) + echo "usage: $0 [flags]" + echo "" + echo "-h :: print help" + echo "-l LANG (default: c) :: language to use" + echo "" + exit 0 + ;; + esac +done +shift $((OPTIND - 1)) + +log() { + echo "[*] ${@}" >&2 +} + +# allow setting target dir +if [[ -n $1 ]]; then + _meson_dir="$1" + [[ ! -d $_meson_dir ]] && mkdir -p $_meson_dir + log "creating in $_meson_dir" +fi + +_meson_bin=`basename $_meson_dir` +_meson_ignore_extra= +declare -a _meson_default_options +declare -a _meson_default_files + +case $_meson_lang in + + ### C ### + c) + _meson_default_options=( \ + 'c_std=c11' \ + 'warning_level=2' \ + 'werror=true' \ + ) + _meson_default_files=('src/main.c') + _meson_ignore_extra='**/*.o' + _meson_output=" +x = executable( + '$_meson_bin', + sources: src +)" + + log "writing main.c" + mkdir $_meson_dir/src + cat > $_meson_dir/src/main.c <<EOF +#define _POSIX_C_SOURCE 200809L + +#ifndef VERSION +#define VERSION "undefined" +#endif + +#include <stdlib.h> +#include <stdio.h> + +int main(int argc, char **argv) { + printf("%s version %s\n\n", *argv, VERSION); + + printf("args (len: %d)", argc-1); + for (int i=1; i < argc; ++i) { + printf(" '%s'", argv[i]); + } + printf("\n"); + return 0; +} +EOF + ;; + + ### JAVA ### + java) + _meson_default_options= + _meson_default_files=('pkg/Main.class') + _meson_ignore_extra='**/*.jar' + _meson_output=" +x = jar( + '$_meson_bin', + main_class: 'pkg.Main', + sources: src +) +" + + log "writing Main.java" + mkdir $_meson_dir/pkg + cat > $_meson_dir/pkg/Main.java <<EOF +package pkg + +class Main { + public static void main(String[] args) { + System.out.println("hello world o/"); + } +} +EOF + ;; + + + *) + log "$_meson_lang not supported yet :(" + exit 1 + ;; +esac + +meson_array_expand() { + for o in "${@}"; do + printf "\t'%s',\n" $o + done +} + +log "writing meson.build" +cat > $_meson_dir/meson.build <<EOF +project( + '$_meson_bin', + '$_meson_lang', + version: '0.1.0', + license: 'MIT', + default_options: [ +`meson_array_expand ${_meson_default_options[@]}` + ], +) + +version = '"@0@ (" __DATE__ ")"'.format(meson.project_version()) + +# embed version sourced from git ref +git = find_program('git', native: true, required: false) +if git.found() + git_commit_hash = run_command([git.path(), 'describe', '--always', '--tags']) + git_branch = run_command([git.path(), 'rev-parse', '--abbrev-ref', 'HEAD']) + if git_commit_hash.returncode() == 0 and git_branch.returncode() == 0 + version = '"@0@ (" __DATE__ ", branch \'@1@\')"'.format(git_commit_hash.stdout().strip(), git_branch.stdout().strip()) + endif +endif +add_project_arguments('-DVERSION=@0@'.format(version), language: 'c') + +src = files( +`meson_array_expand ${_meson_default_files[@]}` +) + +$_meson_output + +test('smoke', x) +EOF + +log "intialializing git" +git init -q $_meson_dir + +log "writing .gitignore" +cat > $_meson_dir/.gitignore <<EOF +/build +$_meson_ignore_extra +EOF + +log "writing Makefile" +cat > $_meson_dir/Makefile <<EOF +RT ?= podman +IMAGE ?= docker.io/robertgzr/mesonbuild-$_meson_lang + +all: clean compile + +build/build.ninja: + meson build + +build/$_meson_bin$([[ $_meson_lang -eq java ]] && echo '.jar'): compile +build: build/build.ninja + ninja -C build + +test: build/$_meson_bin$([[ $_meson_lang -eq java ]] && echo '.jar') + ninja -C build test + +cbuild: + \$(RT) run --rm -it -v \$(shell pwd):/src -w /src \$(IMAGE) make + +ctest: + \$(RT) run --rm -it -v \$(shell pwd):/src -w /src \$(IMAGE) make test + +clean: + \$(RM) -r build + +.PHONY: clean build test cbuild ctest +EOF |