From 1118da579607bac768ae953fecadb6153818488d Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 20 May 2022 10:41:34 -0400 Subject: MacOS: Build examples as application bundles This is required on MacOS to make the examples usable. When run as bare programs, they don't show up as normal windows or receive keyboard input. --- bindings/cpp/meson.build | 5 + examples/meson.build | 131 +++++++++++++-------- examples/pugl_cairo_demo.app/MacOS/meson.build | 7 ++ examples/pugl_cairo_demo.app/meson.build | 8 ++ examples/pugl_cpp_demo.app/MacOS/meson.build | 7 ++ examples/pugl_cpp_demo.app/meson.build | 8 ++ examples/pugl_cursor_demo.app/MacOS/meson.build | 7 ++ examples/pugl_cursor_demo.app/meson.build | 8 ++ examples/pugl_embed_demo.app/MacOS/meson.build | 7 ++ examples/pugl_embed_demo.app/meson.build | 8 ++ examples/pugl_shader_demo.app/MacOS/meson.build | 11 ++ .../pugl_shader_demo.app/Resources/meson.build | 12 ++ examples/pugl_shader_demo.app/meson.build | 21 ++++ examples/pugl_shader_demo.c | 15 ++- .../pugl_vulkan_cpp_demo.app/MacOS/meson.build | 10 ++ examples/pugl_vulkan_cpp_demo.app/meson.build | 27 +++++ examples/pugl_vulkan_cpp_demo.cpp | 12 +- examples/pugl_vulkan_demo.app/MacOS/meson.build | 9 ++ examples/pugl_vulkan_demo.app/meson.build | 8 ++ examples/pugl_window_demo.app/MacOS/meson.build | 7 ++ examples/pugl_window_demo.app/meson.build | 8 ++ examples/shaders/meson.build | 42 ++++--- scripts/cp.py | 9 ++ 23 files changed, 313 insertions(+), 74 deletions(-) create mode 100644 examples/pugl_cairo_demo.app/MacOS/meson.build create mode 100644 examples/pugl_cairo_demo.app/meson.build create mode 100644 examples/pugl_cpp_demo.app/MacOS/meson.build create mode 100644 examples/pugl_cpp_demo.app/meson.build create mode 100644 examples/pugl_cursor_demo.app/MacOS/meson.build create mode 100644 examples/pugl_cursor_demo.app/meson.build create mode 100644 examples/pugl_embed_demo.app/MacOS/meson.build create mode 100644 examples/pugl_embed_demo.app/meson.build create mode 100644 examples/pugl_shader_demo.app/MacOS/meson.build create mode 100644 examples/pugl_shader_demo.app/Resources/meson.build create mode 100644 examples/pugl_shader_demo.app/meson.build create mode 100644 examples/pugl_vulkan_cpp_demo.app/MacOS/meson.build create mode 100644 examples/pugl_vulkan_cpp_demo.app/meson.build create mode 100644 examples/pugl_vulkan_demo.app/MacOS/meson.build create mode 100644 examples/pugl_vulkan_demo.app/meson.build create mode 100644 examples/pugl_window_demo.app/MacOS/meson.build create mode 100644 examples/pugl_window_demo.app/meson.build create mode 100644 scripts/cp.py diff --git a/bindings/cpp/meson.build b/bindings/cpp/meson.build index 6502690..5dd30da 100644 --- a/bindings/cpp/meson.build +++ b/bindings/cpp/meson.build @@ -3,6 +3,11 @@ subdir('include') +puglpp_dep = declare_dependency( + include_directories: include_directories('include'), + link_with: libpugl, + dependencies: core_deps + [pugl_dep]) + pkg.generate(name: 'Pugl++', filebase: 'puglpp-@0@'.format(major_version), subdirs: ['puglpp-@0@'.format(major_version)], diff --git a/examples/meson.build b/examples/meson.build index d57fea4..a4bf84c 100644 --- a/examples/meson.build +++ b/examples/meson.build @@ -74,58 +74,85 @@ endif subdir('shaders') -# Build GL examples -if opengl_dep.found() - foreach example : gl_examples - source = [example] - target = example.split('.')[0] - dependencies = [gl_backend_dep] - defines = [] - - if target == 'pugl_shader_demo' - source += ['file_utils.c', 'glad/glad.c'] - dependencies += [dl_dep] - defines += ['-D_POSIX_C_SOURCE=200809L'] - elif target == 'pugl_print_events' - dependencies += [stub_backend_dep] - endif - - executable(target, source, - include_directories: includes, - c_args: example_defines + example_c_args + defines, - cpp_args: example_defines + example_cpp_args + defines, - dependencies: dependencies) - endforeach -endif +if host_machine.system() == 'darwin' + # On Darwin, build examples as application bundles (required to work properly) -# Build Cairo examples -if cairo_dep.found() - foreach example : cairo_examples - target = example.split('.')[0] - executable(target, example, - include_directories: includes, - c_args: example_defines + example_c_args, - dependencies: [pugl_dep, cairo_backend_dep]) - endforeach -endif + subdir('pugl_cursor_demo.app') + + if cairo_dep.found() + subdir('pugl_cairo_demo.app') + endif -# Build Vulkan examples -if vulkan_dep.found() - foreach example : vulkan_examples - source = [example] - target = example.split('.')[0] - dependencies = [dl_dep, vulkan_backend_dep] - defines = [] - - if target == 'pugl_vulkan_cpp_demo' - source += ['file_utils.c'] - defines += ['-D_POSIX_C_SOURCE=200809L'] - endif - - executable(target, source, - include_directories: includes, - c_args: example_defines + example_c_args + defines, - cpp_args: example_defines + example_cpp_args + defines, - dependencies: dependencies) - endforeach + if opengl_dep.found() + subdir('pugl_cpp_demo.app') + subdir('pugl_embed_demo.app') + subdir('pugl_shader_demo.app') + subdir('pugl_window_demo.app') + endif + + if vulkan_dep.found() + subdir('pugl_vulkan_cpp_demo.app') + subdir('pugl_vulkan_demo.app') + endif + +else + # On all other platforms, build examples as simple programs + + # Build GL examples + if opengl_dep.found() + foreach example : gl_examples + source = [example] + target = example.split('.')[0] + dependencies = [gl_backend_dep] + defines = [] + + if target == 'pugl_shader_demo' + source += ['file_utils.c', 'glad/glad.c'] + dependencies += [dl_dep] + defines += ['-D_POSIX_C_SOURCE=200809L'] + elif target == 'pugl_print_events' + dependencies += [stub_backend_dep] + elif target == 'pugl_cpp_demo' + dependencies += [puglpp_dep] + endif + + executable(target, source, + include_directories: includes, + c_args: example_defines + example_c_args + defines, + cpp_args: example_defines + example_cpp_args + defines, + dependencies: dependencies) + endforeach + endif + + # Build Cairo examples + if cairo_dep.found() + foreach example : cairo_examples + target = example.split('.')[0] + executable(target, example, + include_directories: includes, + c_args: example_defines + example_c_args, + dependencies: [pugl_dep, cairo_backend_dep]) + endforeach + endif + + # Build Vulkan examples + if vulkan_dep.found() + foreach example : vulkan_examples + source = [example] + target = example.split('.')[0] + dependencies = [dl_dep, vulkan_backend_dep] + defines = [] + + if target == 'pugl_vulkan_cpp_demo' + source += ['file_utils.c'] + defines += ['-D_POSIX_C_SOURCE=200809L'] + endif + + executable(target, source, + include_directories: includes, + c_args: example_defines + example_c_args + defines, + cpp_args: example_defines + example_cpp_args + defines, + dependencies: dependencies) + endforeach + endif endif diff --git a/examples/pugl_cairo_demo.app/MacOS/meson.build b/examples/pugl_cairo_demo.app/MacOS/meson.build new file mode 100644 index 0000000..d50da8a --- /dev/null +++ b/examples/pugl_cairo_demo.app/MacOS/meson.build @@ -0,0 +1,7 @@ +executable( + 'pugl_cairo_demo', + ['../../pugl_cairo_demo.c'], + include_directories: include_directories('../../../../include', '../../..'), + c_args: example_defines + example_c_args, + cpp_args: example_defines + example_cpp_args, + dependencies: [pugl_dep, cairo_backend_dep]) diff --git a/examples/pugl_cairo_demo.app/meson.build b/examples/pugl_cairo_demo.app/meson.build new file mode 100644 index 0000000..59793e1 --- /dev/null +++ b/examples/pugl_cairo_demo.app/meson.build @@ -0,0 +1,8 @@ +config = configuration_data() +config.set('NAME', 'pugl_cairo_demo') + +info_plist = configure_file(configuration: config, + input: files('../../resources/Info.plist.in'), + output: 'Info.plist') + +subdir('MacOS') diff --git a/examples/pugl_cpp_demo.app/MacOS/meson.build b/examples/pugl_cpp_demo.app/MacOS/meson.build new file mode 100644 index 0000000..5317789 --- /dev/null +++ b/examples/pugl_cpp_demo.app/MacOS/meson.build @@ -0,0 +1,7 @@ +executable( + 'pugl_cpp_demo', + '../../pugl_cpp_demo.cpp', + include_directories: include_directories('../../../../include', '../../..'), + c_args: example_defines + example_c_args, + cpp_args: example_defines + example_cpp_args, + dependencies: [puglpp_dep, gl_backend_dep]) diff --git a/examples/pugl_cpp_demo.app/meson.build b/examples/pugl_cpp_demo.app/meson.build new file mode 100644 index 0000000..d9d47ba --- /dev/null +++ b/examples/pugl_cpp_demo.app/meson.build @@ -0,0 +1,8 @@ +config = configuration_data() +config.set('NAME', 'pugl_cpp_demo') + +info_plist = configure_file(configuration: config, + input: files('../../resources/Info.plist.in'), + output: 'Info.plist') + +subdir('MacOS') diff --git a/examples/pugl_cursor_demo.app/MacOS/meson.build b/examples/pugl_cursor_demo.app/MacOS/meson.build new file mode 100644 index 0000000..d702c49 --- /dev/null +++ b/examples/pugl_cursor_demo.app/MacOS/meson.build @@ -0,0 +1,7 @@ +executable( + 'pugl_cursor_demo', + '../../pugl_cursor_demo.c', + include_directories: include_directories('../../../../include', '../../..'), + c_args: example_defines + example_c_args, + cpp_args: example_defines + example_cpp_args, + dependencies: [pugl_dep, gl_backend_dep]) diff --git a/examples/pugl_cursor_demo.app/meson.build b/examples/pugl_cursor_demo.app/meson.build new file mode 100644 index 0000000..dfbb30c --- /dev/null +++ b/examples/pugl_cursor_demo.app/meson.build @@ -0,0 +1,8 @@ +config = configuration_data() +config.set('NAME', 'pugl_cursor_demo') + +info_plist = configure_file(configuration: config, + input: files('../../resources/Info.plist.in'), + output: 'Info.plist') + +subdir('MacOS') diff --git a/examples/pugl_embed_demo.app/MacOS/meson.build b/examples/pugl_embed_demo.app/MacOS/meson.build new file mode 100644 index 0000000..4ad3781 --- /dev/null +++ b/examples/pugl_embed_demo.app/MacOS/meson.build @@ -0,0 +1,7 @@ +executable( + 'pugl_embed_demo', + '../../pugl_embed_demo.c', + include_directories: include_directories('../../../../include', '../../..'), + c_args: example_defines + example_c_args, + cpp_args: example_defines + example_cpp_args, + dependencies: [pugl_dep, gl_backend_dep]) diff --git a/examples/pugl_embed_demo.app/meson.build b/examples/pugl_embed_demo.app/meson.build new file mode 100644 index 0000000..3913bad --- /dev/null +++ b/examples/pugl_embed_demo.app/meson.build @@ -0,0 +1,8 @@ +config = configuration_data() +config.set('NAME', 'pugl_embed_demo') + +info_plist = configure_file(configuration: config, + input: files('../../resources/Info.plist.in'), + output: 'Info.plist') + +subdir('MacOS') diff --git a/examples/pugl_shader_demo.app/MacOS/meson.build b/examples/pugl_shader_demo.app/MacOS/meson.build new file mode 100644 index 0000000..3eb9ae1 --- /dev/null +++ b/examples/pugl_shader_demo.app/MacOS/meson.build @@ -0,0 +1,11 @@ +executable( + 'pugl_shader_demo', + [ + '../../file_utils.c', + '../../glad/glad.c', + '../../pugl_shader_demo.c', + ], + include_directories: include_directories('../../../../include', '../../..'), + c_args: example_defines + example_c_args, + cpp_args: example_defines + example_cpp_args, + dependencies: [pugl_dep, gl_backend_dep, dl_dep]) diff --git a/examples/pugl_shader_demo.app/Resources/meson.build b/examples/pugl_shader_demo.app/Resources/meson.build new file mode 100644 index 0000000..87e3a71 --- /dev/null +++ b/examples/pugl_shader_demo.app/Resources/meson.build @@ -0,0 +1,12 @@ +shaders = [ + 'header_330.glsl', + 'header_420.glsl', + 'rect.vert', + 'rect.frag', +] + +foreach shader : shaders + configure_file(input: files('..' / '..' / 'shaders' / shader), + output: shader, + copy: true) +endforeach diff --git a/examples/pugl_shader_demo.app/meson.build b/examples/pugl_shader_demo.app/meson.build new file mode 100644 index 0000000..82b4a34 --- /dev/null +++ b/examples/pugl_shader_demo.app/meson.build @@ -0,0 +1,21 @@ +config = configuration_data() +config.set('NAME', 'pugl_shader_demo') + +info_plist = configure_file(configuration: config, + input: files('../../resources/Info.plist.in'), + output: 'Info.plist') + +shaders = [ + 'header_330.glsl', + 'header_420.glsl', + 'rect.vert', + 'rect.frag', +] + +foreach shader : shaders + configure_file(input: files('..' / 'shaders' / shader), + output: shader, + copy: true) +endforeach + +subdir('MacOS') diff --git a/examples/pugl_shader_demo.c b/examples/pugl_shader_demo.c index f4679e2..a2f3589 100644 --- a/examples/pugl_shader_demo.c +++ b/examples/pugl_shader_demo.c @@ -39,6 +39,12 @@ #include #include +#ifdef __APPLE__ +# define SHADER_DIR "../" +#else +# define SHADER_DIR "shaders/" +#endif + static const int defaultWidth = 512; static const int defaultHeight = 512; static const uintptr_t resizeTimerId = 1u; @@ -284,16 +290,17 @@ setupGl(PuglTestApp* app) } const char* const headerFile = - (app->glMajorVersion == 3 ? "shaders/header_330.glsl" - : "shaders/header_420.glsl"); + (app->glMajorVersion == 3 ? SHADER_DIR "header_330.glsl" + : SHADER_DIR "header_420.glsl"); // Load shader sources char* const headerSource = loadShader(app->programPath, headerFile); - char* const vertexSource = loadShader(app->programPath, "shaders/rect.vert"); + char* const vertexSource = + loadShader(app->programPath, SHADER_DIR "rect.vert"); char* const fragmentSource = - loadShader(app->programPath, "shaders/rect.frag"); + loadShader(app->programPath, SHADER_DIR "rect.frag"); if (!vertexSource || !fragmentSource) { logError("Failed to load shader sources\n"); diff --git a/examples/pugl_vulkan_cpp_demo.app/MacOS/meson.build b/examples/pugl_vulkan_cpp_demo.app/MacOS/meson.build new file mode 100644 index 0000000..2ff4e87 --- /dev/null +++ b/examples/pugl_vulkan_cpp_demo.app/MacOS/meson.build @@ -0,0 +1,10 @@ +executable( + 'pugl_vulkan_cpp_demo', + [ + '../../pugl_vulkan_cpp_demo.cpp', + '../../file_utils.c', + ], + include_directories: include_directories('../../../../include', '../../..'), + c_args: example_defines + example_c_args, + cpp_args: example_defines + example_cpp_args, + dependencies: [puglpp_dep, vulkan_backend_dep]) diff --git a/examples/pugl_vulkan_cpp_demo.app/meson.build b/examples/pugl_vulkan_cpp_demo.app/meson.build new file mode 100644 index 0000000..90b2329 --- /dev/null +++ b/examples/pugl_vulkan_cpp_demo.app/meson.build @@ -0,0 +1,27 @@ +config = configuration_data() +config.set('NAME', 'pugl_vulkan_cpp_demo') + +info_plist = configure_file(configuration: config, + input: files('../../resources/Info.plist.in'), + output: 'Info.plist') + +shaders = [ + 'rect.frag.spv', + 'rect.vert.spv', +] + +cp = find_program('../../scripts/cp.py') + +custom_target('rect.vert.spv', + input: rect_vert_spv, + output: 'rect.vert.spv', + command: [cp, '@INPUT@', '@OUTPUT@'], + build_by_default: true) + +custom_target('rect.frag.spv', + input: rect_frag_spv, + output: 'rect.frag.spv', + command: [cp, '@INPUT@', '@OUTPUT@'], + build_by_default: true) + +subdir('MacOS') diff --git a/examples/pugl_vulkan_cpp_demo.cpp b/examples/pugl_vulkan_cpp_demo.cpp index 0b34c81..6ed3885 100644 --- a/examples/pugl_vulkan_cpp_demo.cpp +++ b/examples/pugl_vulkan_cpp_demo.cpp @@ -42,6 +42,12 @@ #include #include +#ifdef __APPLE__ +# define SHADER_DIR "../" +#else +# define SHADER_DIR "shaders/" +#endif + namespace { constexpr uintptr_t resizeTimerId = 1u; @@ -712,9 +718,11 @@ RectShaders::init(const sk::VulkanApi& vk, const GraphicsDevice& gpu, const std::string& programPath) { - auto vertShaderCode = readFile(programPath.c_str(), "shaders/rect.vert.spv"); + auto vertShaderCode = + readFile(programPath.c_str(), SHADER_DIR "rect.vert.spv"); - auto fragShaderCode = readFile(programPath.c_str(), "shaders/rect.frag.spv"); + auto fragShaderCode = + readFile(programPath.c_str(), SHADER_DIR "rect.frag.spv"); if (vertShaderCode.empty() || fragShaderCode.empty()) { return VK_ERROR_INITIALIZATION_FAILED; diff --git a/examples/pugl_vulkan_demo.app/MacOS/meson.build b/examples/pugl_vulkan_demo.app/MacOS/meson.build new file mode 100644 index 0000000..d2863b3 --- /dev/null +++ b/examples/pugl_vulkan_demo.app/MacOS/meson.build @@ -0,0 +1,9 @@ +executable( + 'pugl_vulkan_demo', + [ + '../../pugl_vulkan_demo.c', + '../../file_utils.c', + ], + include_directories: include_directories('../../../../include', '../../..'), + c_args: example_defines + example_c_args, + dependencies: [pugl_dep, vulkan_backend_dep]) diff --git a/examples/pugl_vulkan_demo.app/meson.build b/examples/pugl_vulkan_demo.app/meson.build new file mode 100644 index 0000000..240c129 --- /dev/null +++ b/examples/pugl_vulkan_demo.app/meson.build @@ -0,0 +1,8 @@ +config = configuration_data() +config.set('NAME', 'pugl_vulkan_demo') + +info_plist = configure_file(configuration: config, + input: files('../../resources/Info.plist.in'), + output: 'Info.plist') + +subdir('MacOS') diff --git a/examples/pugl_window_demo.app/MacOS/meson.build b/examples/pugl_window_demo.app/MacOS/meson.build new file mode 100644 index 0000000..84b4c59 --- /dev/null +++ b/examples/pugl_window_demo.app/MacOS/meson.build @@ -0,0 +1,7 @@ +executable( + 'pugl_window_demo', + '../../pugl_window_demo.c', + include_directories: include_directories('../../../../include', '../../..'), + c_args: example_defines + example_c_args, + cpp_args: example_defines + example_cpp_args, + dependencies: [pugl_dep, gl_backend_dep]) diff --git a/examples/pugl_window_demo.app/meson.build b/examples/pugl_window_demo.app/meson.build new file mode 100644 index 0000000..2d1cd9a --- /dev/null +++ b/examples/pugl_window_demo.app/meson.build @@ -0,0 +1,8 @@ +config = configuration_data() +config.set('NAME', 'pugl_window_demo') + +info_plist = configure_file(configuration: config, + input: files('../../resources/Info.plist.in'), + output: 'Info.plist') + +subdir('MacOS') diff --git a/examples/shaders/meson.build b/examples/shaders/meson.build index 83859b3..2fdd946 100644 --- a/examples/shaders/meson.build +++ b/examples/shaders/meson.build @@ -18,21 +18,31 @@ if vulkan_dep.found() cat = find_program('../../scripts/cat.py') glslang = find_program('glslangValidator') - shaders = ['rect.vert', 'rect.frag'] - foreach shader : shaders - source = shader.split('.')[0] + '.vulkan.' + shader.split('.')[1] - shader_input = custom_target(source, - output: source, - input: ['header_420.glsl', shader], - command: [cat, '@INPUT@'], - build_by_default: true, - capture: true) + rect_vulkan_vert = custom_target('rect.vulkan.vert', + output: 'rect.vulkan.vert', + input: ['header_420.glsl', 'rect.vert'], + command: [cat, '@INPUT@'], + build_by_default: true, + capture: true) - mytarget = custom_target(shader, - output: shader + '.spv', - input: shader_input, - command: [glslang, '-V', '-o', '@OUTPUT@', '@INPUT@'], - build_by_default: true, - install: false) - endforeach + rect_vulkan_frag = custom_target('rect.vulkan.frag', + output: 'rect.vulkan.frag', + input: ['header_420.glsl', 'rect.frag'], + command: [cat, '@INPUT@'], + build_by_default: true, + capture: true) + + rect_vert_spv = custom_target('rect.vert.spv', + output: 'rect.vert.spv', + input: rect_vulkan_vert, + command: [glslang, '-V', '-o', '@OUTPUT@', '@INPUT@'], + build_by_default: true, + install: false) + + rect_frag_spv = custom_target('rect.frag.spv', + output: 'rect.frag.spv', + input: rect_vulkan_frag, + command: [glslang, '-V', '-o', '@OUTPUT@', '@INPUT@'], + build_by_default: true, + install: false) endif diff --git a/scripts/cp.py b/scripts/cp.py new file mode 100644 index 0000000..2a25f74 --- /dev/null +++ b/scripts/cp.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python3 + +# Copyright 2021 David Robillard +# SPDX-License-Identifier: ISC + +import shutil +import sys + +shutil.copy(sys.argv[1], sys.argv[2]) -- cgit v1.2.1