From 6e60bcc698c03b86e39d6e4a1b1ba814ba2e2cdf Mon Sep 17 00:00:00 2001 From: Robin Broda Date: Thu, 4 Apr 2019 00:48:06 +0200 Subject: [PATCH] Change build system to meson --- .gitignore | 4 +- Makefile | 136 ++------------------- README.md | 13 +- glad_generate.sh | 10 ++ fifo.c => glava/fifo.c | 0 fifo.h => glava/fifo.h | 0 glad.c => glava/glad.c | 0 glad.h => glava/glad.h | 0 glava.c => glava/glava.c | 0 glfw_wcb.c => glava/glfw_wcb.c | 0 glsl_ext.c => glava/glsl_ext.c | 0 glsl_ext.h => glava/glsl_ext.h | 0 glx_wcb.c => glava/glx_wcb.c | 0 khrplatform.h => glava/khrplatform.h | 0 pulse_input.c => glava/pulse_input.c | 0 pulse_input.h => glava/pulse_input.h | 0 render.c => glava/render.c | 0 render.h => glava/render.h | 0 xwin.c => glava/xwin.c | 0 xwin.h => glava/xwin.h | 0 meson.build | 96 +++++++++++++++ meson_options.txt | 5 + shaders/{ => glava}/bars.glsl | 0 shaders/{ => glava}/bars/1.frag | 0 shaders/{ => glava}/circle.glsl | 0 shaders/{ => glava}/circle/1.frag | 0 shaders/{ => glava}/circle/2.frag | 0 shaders/{ => glava}/circle/3.frag | 0 shaders/{ => glava}/env_KWin.glsl | 0 shaders/{ => glava}/env_Openbox.glsl | 0 shaders/{ => glava}/env_Xfwm4.glsl | 0 shaders/{ => glava}/env_awesome.glsl | 0 shaders/{ => glava}/env_default.glsl | 0 shaders/{ => glava}/env_i3.glsl | 0 shaders/{ => glava}/graph.glsl | 0 shaders/{ => glava}/graph/1.frag | 0 shaders/{ => glava}/graph/2.frag | 0 shaders/{ => glava}/graph/3.frag | 0 shaders/{ => glava}/radial.glsl | 0 shaders/{ => glava}/radial/1.frag | 0 shaders/{ => glava}/radial/2.frag | 0 shaders/{ => glava}/rc.glsl | 0 shaders/{ => glava}/smooth_parameters.glsl | 0 shaders/{ => glava}/test/1.frag | 0 shaders/{ => glava}/test/2.frag | 0 shaders/{ => glava}/test/3.frag | 0 shaders/{ => glava}/test_rc.glsl | 0 shaders/{ => glava}/util/premultiply.frag | 0 shaders/{ => glava}/util/smooth.glsl | 0 shaders/{ => glava}/util/smooth_pass.frag | 0 shaders/{ => glava}/wave.glsl | 0 shaders/{ => glava}/wave/1.frag | 0 shaders/{ => glava}/wave/2.frag | 0 53 files changed, 128 insertions(+), 136 deletions(-) create mode 100755 glad_generate.sh rename fifo.c => glava/fifo.c (100%) rename fifo.h => glava/fifo.h (100%) rename glad.c => glava/glad.c (100%) rename glad.h => glava/glad.h (100%) rename glava.c => glava/glava.c (100%) rename glfw_wcb.c => glava/glfw_wcb.c (100%) rename glsl_ext.c => glava/glsl_ext.c (100%) rename glsl_ext.h => glava/glsl_ext.h (100%) rename glx_wcb.c => glava/glx_wcb.c (100%) rename khrplatform.h => glava/khrplatform.h (100%) rename pulse_input.c => glava/pulse_input.c (100%) rename pulse_input.h => glava/pulse_input.h (100%) rename render.c => glava/render.c (100%) rename render.h => glava/render.h (100%) rename xwin.c => glava/xwin.c (100%) rename xwin.h => glava/xwin.h (100%) create mode 100644 meson.build create mode 100644 meson_options.txt rename shaders/{ => glava}/bars.glsl (100%) rename shaders/{ => glava}/bars/1.frag (100%) rename shaders/{ => glava}/circle.glsl (100%) rename shaders/{ => glava}/circle/1.frag (100%) rename shaders/{ => glava}/circle/2.frag (100%) rename shaders/{ => glava}/circle/3.frag (100%) rename shaders/{ => glava}/env_KWin.glsl (100%) rename shaders/{ => glava}/env_Openbox.glsl (100%) rename shaders/{ => glava}/env_Xfwm4.glsl (100%) rename shaders/{ => glava}/env_awesome.glsl (100%) rename shaders/{ => glava}/env_default.glsl (100%) rename shaders/{ => glava}/env_i3.glsl (100%) rename shaders/{ => glava}/graph.glsl (100%) rename shaders/{ => glava}/graph/1.frag (100%) rename shaders/{ => glava}/graph/2.frag (100%) rename shaders/{ => glava}/graph/3.frag (100%) rename shaders/{ => glava}/radial.glsl (100%) rename shaders/{ => glava}/radial/1.frag (100%) rename shaders/{ => glava}/radial/2.frag (100%) rename shaders/{ => glava}/rc.glsl (100%) rename shaders/{ => glava}/smooth_parameters.glsl (100%) rename shaders/{ => glava}/test/1.frag (100%) rename shaders/{ => glava}/test/2.frag (100%) rename shaders/{ => glava}/test/3.frag (100%) rename shaders/{ => glava}/test_rc.glsl (100%) rename shaders/{ => glava}/util/premultiply.frag (100%) rename shaders/{ => glava}/util/smooth.glsl (100%) rename shaders/{ => glava}/util/smooth_pass.frag (100%) rename shaders/{ => glava}/wave.glsl (100%) rename shaders/{ => glava}/wave/1.frag (100%) rename shaders/{ => glava}/wave/2.frag (100%) diff --git a/.gitignore b/.gitignore index 15180ac..d163863 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ -*.o -build_state -glava +build/ \ No newline at end of file diff --git a/Makefile b/Makefile index 872f4a7..e0f2650 100644 --- a/Makefile +++ b/Makefile @@ -1,133 +1,11 @@ -SHELL := /bin/bash -.SHELLFLAGS = -O extglob -c +.PHONY: all install clean -src = $(wildcard *.c) -obj = $(src:.c=.o) +all: + meson build + ninja -C build -# Build type parameter - -ifeq ($(BUILD),debug) - CFLAGS_BUILD = -O0 -ggdb -Wall -DGLAVA_DEBUG - GLAD_GEN = c-debug - STRIP_CMD = $(info Skipping `strip` for debug builds) -else - CFLAGS_BUILD = -O2 -Wstringop-overflow=0 - GLAD_GEN = c - STRIP_CMD = strip --strip-all glava -endif - -# Detect OS if not specified (OSX, Linux, BSD are supported) - -ifndef INSTALL - UNAME_S := $(shell uname -s) - ifeq ($(UNAME_S),Darwin) - INSTALL = osx - else - INSTALL = unix - endif -endif - -ifndef EXECDIR - EXECDIR = /usr/bin/ -endif - -# Install type parameter - -ifeq ($(INSTALL),standalone) - CFLAGS_INSTALL = -DGLAVA_STANDALONE -endif - -ifeq ($(INSTALL),unix) - CFLAGS_INSTALL = -DGLAVA_UNIX - ifndef SHADERDIR - ifdef XDG_CONFIG_DIRS - SHADERDIR = /$(firstword $(subst :, ,$(XDG_CONFIG_DIRS)))/glava/ - ifeq ($(wildcard $(SHADERDIR)/..),) - SHADERDIR = /etc/xdg/glava/ - endif - else - SHADERDIR = /etc/xdg/glava/ - endif - endif -endif - -ifdef ENABLE_GLFW - CFLAGS_GLFW = -DGLAVA_GLFW - LDFLAGS_GLFW = -lglfw -endif - -ifndef DISABLE_GLX - CFLAGS_GLX = -DGLAVA_GLX - LDFLAGS_GLX = -lXrender -endif - -ifeq ($(INSTALL),osx) - CFLAGS_INSTALL = -DGLAVA_OSX - ifndef SHADERDIR - SHADERDIR = /Library/glava - endif -endif - -LDFLAGS += $(ASAN) -lpulse -lpulse-simple -pthread $(LDFLAGS_GLFW) -ldl -lm -lX11 -lXext $(LDFLAGS_GLX) - -PYTHON = python - -GLAVA_VERSION = \"$(shell git describe --tags 2>/dev/null)\" -ifeq ($(GLAVA_VERSION),\"\") - GLAVA_VERSION = \"unknown\" -endif - -ifdef DESTDIR - DESTDIR += / -endif - -GLAD_INSTALL_DIR = glad -GLAD_SRCFILE = glad.c -GLAD_ARGS = --generator=$(GLAD_GEN) --extensions=GL_EXT_framebuffer_multisample,GL_EXT_texture_filter_anisotropic -CFLAGS_COMMON = -DGLAVA_VERSION="$(GLAVA_VERSION)" -DSHADER_INSTALL_PATH="\"$(SHADERDIR)\"" -CFLAGS_USE = $(CFLAGS_COMMON) $(CFLAGS_GLX) $(CFLAGS_GLFW) $(CFLAGS_BUILD) $(CFLAGS_INSTALL) $(CFLAGS) - -# Store relevant variables that may change depending on the environment or user input -STATE = $(BUILD),$(INSTALL),$(PREFIX),$(ENABLE_GLFW),$(DISABLE_GLX),$(PYTHON),$(CC),$(CFLAGS_USE) -# Only update the file if the contents changed, `make` just looks at the timestamp -$(shell if [[ ! -e build_state ]]; then touch build_state; fi) -$(shell if [ '$(STATE)' != "`cat build_state`" ]; then echo '$(STATE)' > build_state; fi) - -all: glava - -%.o: %.c build_state - @$(CC) $(CFLAGS_USE) -o $@ -c $(firstword $<) - @echo "CC $@" - -glava: $(obj) - @$(CC) -o glava $(obj) $(LDFLAGS) - @echo "CC glava" - $(STRIP_CMD) - -.PHONY: glad -glad: build_state - @cd $(GLAD_INSTALL_DIR) && $(PYTHON) -m glad $(GLAD_ARGS) --local-files --out-path=. - @cp glad/*.h . - @cp glad/glad.c . - -# Empty build state goal, used to force some of the above rules to re-run if `build_state` was updated -build_state: ; - -.PHONY: clean -clean: - rm -f $(obj) glava glad.o build_state - -EXECTARGET = $(shell readlink -m "$(DESTDIR)$(EXECDIR)/glava") -SHADERTARGET = $(shell readlink -m "$(DESTDIR)$(SHADERDIR)") - -.PHONY: install install: - install -Dm755 glava $(EXECTARGET) - install -d $(SHADERTARGET) - cp -Rv shaders/!(test|test_rc.glsl) $(SHADERTARGET) - -.PHONY: uninstall -uninstall: - rm $(EXECTARGET) - rm -rf $(SHADERTARGET) + cd build && meson install +clean: + rm -rf build \ No newline at end of file diff --git a/README.md b/README.md index 46178bb..532ee04 100644 --- a/README.md +++ b/README.md @@ -8,12 +8,16 @@ ```bash $ git clone https://github.com/wacossusca34/glava $ cd glava -$ CFLAGS="-march=native" make -$ sudo make install +$ CFLAGS="-march=native" meson build +$ ninja -C build +$ cd build +$ sudo meson install $ glava ``` -You can pass `BUILD=debug` to the makefile for debug builds of both glad and glava, and you can manually specify install targets with `INSTALL=...`, possible arguments are `unix` for FHS compliant Linux and BSD distros, `osx` for Mac OSX, and `standalone` which allows you to run GLava in the build directory. +You can run `meson configure` in the project directory to get a list of available compile-time configuration options. + +You can pass `-DDEBUG` to meson for debug builds of both glad (only with `-Dglad`) and glava, `-Dstandalone` allows you to run GLava in the build directory. **Requirements:** @@ -23,6 +27,7 @@ You can pass `BUILD=debug` to the makefile for debug builds of both glad and gla **Additional compile time requirements:** +- Meson - GCC (this program uses GNU C features) **Optional requirements:** @@ -31,7 +36,7 @@ You can pass `BUILD=debug` to the makefile for debug builds of both glad and gla **Ubuntu/Debian users:** the following command ensures you have all the needed packages and headers to compile GLava: ```bash -sudo apt-get install libpulse0 libpulse-dev libxext6 libxext-dev libxrender-dev libxcomposite-dev make gcc +sudo apt-get install libpulse0 libpulse-dev libxext6 libxext-dev libxrender-dev libxcomposite-dev meson gcc ``` ## Installation diff --git a/glad_generate.sh b/glad_generate.sh new file mode 100755 index 0000000..2d70be4 --- /dev/null +++ b/glad_generate.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -e +GLAD_GEN="${1:-c}" + +pushd glad +python -m glad --generator=${GLAD_GEN} --extensions=GL_EXT_framebuffer_multisample,GL_EXT_texture_filter_anisotropic --local-files --out-path=. +popd +cp glad/*.h glava/ +cp glad/glad.c glava/ diff --git a/fifo.c b/glava/fifo.c similarity index 100% rename from fifo.c rename to glava/fifo.c diff --git a/fifo.h b/glava/fifo.h similarity index 100% rename from fifo.h rename to glava/fifo.h diff --git a/glad.c b/glava/glad.c similarity index 100% rename from glad.c rename to glava/glad.c diff --git a/glad.h b/glava/glad.h similarity index 100% rename from glad.h rename to glava/glad.h diff --git a/glava.c b/glava/glava.c similarity index 100% rename from glava.c rename to glava/glava.c diff --git a/glfw_wcb.c b/glava/glfw_wcb.c similarity index 100% rename from glfw_wcb.c rename to glava/glfw_wcb.c diff --git a/glsl_ext.c b/glava/glsl_ext.c similarity index 100% rename from glsl_ext.c rename to glava/glsl_ext.c diff --git a/glsl_ext.h b/glava/glsl_ext.h similarity index 100% rename from glsl_ext.h rename to glava/glsl_ext.h diff --git a/glx_wcb.c b/glava/glx_wcb.c similarity index 100% rename from glx_wcb.c rename to glava/glx_wcb.c diff --git a/khrplatform.h b/glava/khrplatform.h similarity index 100% rename from khrplatform.h rename to glava/khrplatform.h diff --git a/pulse_input.c b/glava/pulse_input.c similarity index 100% rename from pulse_input.c rename to glava/pulse_input.c diff --git a/pulse_input.h b/glava/pulse_input.h similarity index 100% rename from pulse_input.h rename to glava/pulse_input.h diff --git a/render.c b/glava/render.c similarity index 100% rename from render.c rename to glava/render.c diff --git a/render.h b/glava/render.h similarity index 100% rename from render.h rename to glava/render.h diff --git a/xwin.c b/glava/xwin.c similarity index 100% rename from xwin.c rename to glava/xwin.c diff --git a/xwin.h b/glava/xwin.h similarity index 100% rename from xwin.h rename to glava/xwin.h diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..abe8c33 --- /dev/null +++ b/meson.build @@ -0,0 +1,96 @@ +project( + 'glava', + 'c', + version: run_command('git', 'describe', '--tags').stdout().strip() +) + +cc = meson.get_compiler('c') + +if get_option('buildtype').startswith('debug') + add_project_arguments( + '-O0', + '-ggdb', + '-Wall', + '-DGLAVA_DEBUG', + language: 'c' + ) + if get_option('glad') + run_command('./glad_generate.sh', 'c-debug') + endif +else + add_project_arguments( + '-O2', + '-Wstringpop-overflow=0', + language: 'c' + ) + if get_option('glad') + run_command('./glad_generate.sh') + endif +endif + +glava_dependencies = [ + dependency('threads'), + cc.find_library('pulse'), + cc.find_library('pulse-simple'), + cc.find_library('dl'), + cc.find_library('m'), + cc.find_library('X11'), + cc.find_library('Xext') +] + +glava_version = meson.project_version() +if glava_version == '' + glava_version = 'unknown' +endif + +shaderdir = get_option('shaderdir') +if host_machine.system() == 'linux' + add_project_arguments( + '-DGLAVA_UNIX', + language: 'c' + ) +endif +if host_machine.system() == 'darwin' + add_project_arguments( + '-DGLAVA_OSX', + language: 'c' + ) + shaderdir = '/Library/glava/' +endif + +if get_option('enable_glfw') + add_project_arguments( + '-DGLAVA_GLFW', + language: 'c' + ) + glava_dependencies += dependency('glfw') +endif + +if not get_option('disable_glx') + add_project_arguments( + '-DGLAVA_GLX', + language: 'c' + ) + glava_dependencies += cc.find_library('Xrender') +endif + +if get_option('standalone') + add_project_arguments( + '-DGLAVA_STANDALONE', + language: 'c') +endif + +add_project_arguments( + '-DGLAVA_VERSION="'+glava_version+'"', + '-DSHADER_INSTALL_PATH="'+get_option('shaderdir')+'"', + language: 'c' +) + +executable( + 'glava', + sources: run_command('find', 'glava', '-type', 'f', '-name', '*.c', '-print').stdout().strip().split('\n'), + dependencies: glava_dependencies, + install: true +) + +install_subdir('shaders/glava', install_dir: shaderdir+'/../') diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..a6461a8 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,5 @@ +option('shaderdir', type: 'string', value: '/etc/xdg/glava/', description: 'Default shader directory') +option('enable_glfw', type: 'boolean', value: false, description: 'Enable GLFW backend') +option('disable_glx', type: 'boolean', value: false, description: 'Disable GLX') +option('standalone', type: 'boolean', value: false, description: 'OS-independent build') +option('glad', type: 'boolean', value: false, description: 'Regenerate GLAD') diff --git a/shaders/bars.glsl b/shaders/glava/bars.glsl similarity index 100% rename from shaders/bars.glsl rename to shaders/glava/bars.glsl diff --git a/shaders/bars/1.frag b/shaders/glava/bars/1.frag similarity index 100% rename from shaders/bars/1.frag rename to shaders/glava/bars/1.frag diff --git a/shaders/circle.glsl b/shaders/glava/circle.glsl similarity index 100% rename from shaders/circle.glsl rename to shaders/glava/circle.glsl diff --git a/shaders/circle/1.frag b/shaders/glava/circle/1.frag similarity index 100% rename from shaders/circle/1.frag rename to shaders/glava/circle/1.frag diff --git a/shaders/circle/2.frag b/shaders/glava/circle/2.frag similarity index 100% rename from shaders/circle/2.frag rename to shaders/glava/circle/2.frag diff --git a/shaders/circle/3.frag b/shaders/glava/circle/3.frag similarity index 100% rename from shaders/circle/3.frag rename to shaders/glava/circle/3.frag diff --git a/shaders/env_KWin.glsl b/shaders/glava/env_KWin.glsl similarity index 100% rename from shaders/env_KWin.glsl rename to shaders/glava/env_KWin.glsl diff --git a/shaders/env_Openbox.glsl b/shaders/glava/env_Openbox.glsl similarity index 100% rename from shaders/env_Openbox.glsl rename to shaders/glava/env_Openbox.glsl diff --git a/shaders/env_Xfwm4.glsl b/shaders/glava/env_Xfwm4.glsl similarity index 100% rename from shaders/env_Xfwm4.glsl rename to shaders/glava/env_Xfwm4.glsl diff --git a/shaders/env_awesome.glsl b/shaders/glava/env_awesome.glsl similarity index 100% rename from shaders/env_awesome.glsl rename to shaders/glava/env_awesome.glsl diff --git a/shaders/env_default.glsl b/shaders/glava/env_default.glsl similarity index 100% rename from shaders/env_default.glsl rename to shaders/glava/env_default.glsl diff --git a/shaders/env_i3.glsl b/shaders/glava/env_i3.glsl similarity index 100% rename from shaders/env_i3.glsl rename to shaders/glava/env_i3.glsl diff --git a/shaders/graph.glsl b/shaders/glava/graph.glsl similarity index 100% rename from shaders/graph.glsl rename to shaders/glava/graph.glsl diff --git a/shaders/graph/1.frag b/shaders/glava/graph/1.frag similarity index 100% rename from shaders/graph/1.frag rename to shaders/glava/graph/1.frag diff --git a/shaders/graph/2.frag b/shaders/glava/graph/2.frag similarity index 100% rename from shaders/graph/2.frag rename to shaders/glava/graph/2.frag diff --git a/shaders/graph/3.frag b/shaders/glava/graph/3.frag similarity index 100% rename from shaders/graph/3.frag rename to shaders/glava/graph/3.frag diff --git a/shaders/radial.glsl b/shaders/glava/radial.glsl similarity index 100% rename from shaders/radial.glsl rename to shaders/glava/radial.glsl diff --git a/shaders/radial/1.frag b/shaders/glava/radial/1.frag similarity index 100% rename from shaders/radial/1.frag rename to shaders/glava/radial/1.frag diff --git a/shaders/radial/2.frag b/shaders/glava/radial/2.frag similarity index 100% rename from shaders/radial/2.frag rename to shaders/glava/radial/2.frag diff --git a/shaders/rc.glsl b/shaders/glava/rc.glsl similarity index 100% rename from shaders/rc.glsl rename to shaders/glava/rc.glsl diff --git a/shaders/smooth_parameters.glsl b/shaders/glava/smooth_parameters.glsl similarity index 100% rename from shaders/smooth_parameters.glsl rename to shaders/glava/smooth_parameters.glsl diff --git a/shaders/test/1.frag b/shaders/glava/test/1.frag similarity index 100% rename from shaders/test/1.frag rename to shaders/glava/test/1.frag diff --git a/shaders/test/2.frag b/shaders/glava/test/2.frag similarity index 100% rename from shaders/test/2.frag rename to shaders/glava/test/2.frag diff --git a/shaders/test/3.frag b/shaders/glava/test/3.frag similarity index 100% rename from shaders/test/3.frag rename to shaders/glava/test/3.frag diff --git a/shaders/test_rc.glsl b/shaders/glava/test_rc.glsl similarity index 100% rename from shaders/test_rc.glsl rename to shaders/glava/test_rc.glsl diff --git a/shaders/util/premultiply.frag b/shaders/glava/util/premultiply.frag similarity index 100% rename from shaders/util/premultiply.frag rename to shaders/glava/util/premultiply.frag diff --git a/shaders/util/smooth.glsl b/shaders/glava/util/smooth.glsl similarity index 100% rename from shaders/util/smooth.glsl rename to shaders/glava/util/smooth.glsl diff --git a/shaders/util/smooth_pass.frag b/shaders/glava/util/smooth_pass.frag similarity index 100% rename from shaders/util/smooth_pass.frag rename to shaders/glava/util/smooth_pass.frag diff --git a/shaders/wave.glsl b/shaders/glava/wave.glsl similarity index 100% rename from shaders/wave.glsl rename to shaders/glava/wave.glsl diff --git a/shaders/wave/1.frag b/shaders/glava/wave/1.frag similarity index 100% rename from shaders/wave/1.frag rename to shaders/glava/wave/1.frag diff --git a/shaders/wave/2.frag b/shaders/glava/wave/2.frag similarity index 100% rename from shaders/wave/2.frag rename to shaders/glava/wave/2.frag