Skip to content

Commit

Permalink
build: add a tentative implementation for custom plugin PCH with clang
Browse files Browse the repository at this point in the history
This is a workaround for mesonbuild/meson#4350
This does not work with all C++ compilers and is "use at own risk",
 therefore disabled by default. Can be enabled by passing
 `-Dcustom_pch=true` to meson.
 When disabled, it should not affect anything.

Speeds up compilation by at least 20% in local tests (48s vs 38s).
  • Loading branch information
ammen99 committed Feb 26, 2025
1 parent bc9c41c commit a706894
Show file tree
Hide file tree
Showing 29 changed files with 110 additions and 30 deletions.
8 changes: 8 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,14 @@ configure_file(input: 'config.h.in',
install_dir: join_paths('include', 'wayfire'),
configuration: conf_data)

# Detect address sanitizer
cxx_flags_asan = run_command('/bin/sh', '-c', 'echo $CXXFLAGS $CPPFLAGS | grep fsanitize', check: false)
if get_option('b_sanitize').contains('address') or cxx_flags_asan.returncode() == 0
has_asan = true
else
has_asan = false
endif

subdir('proto')
subdir('src')
subdir('man')
Expand Down
1 change: 1 addition & 0 deletions meson_options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ option('xwayland', type: 'feature', value: 'auto', description: 'Build with xway
option('default_config_backend', type: 'string', value: 'default', description: 'Default configuration backend to use')
option('print_trace', type: 'boolean', value: true, description: 'Print stack trace in debug logs (disables coredump)')
option('tests', type: 'feature', value: 'auto', description: 'Enable unit tests')
option('custom_pch', type: 'boolean', value: false, description: 'Use custom PCH for plugins. May not work with all compilers and setups.')
8 changes: 7 additions & 1 deletion plugins/animate/meson.build
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
dependencies = [wlroots, pixman, wfconfig]
animate_pch_deps = [plugin_pch_dep]
animate_pch_flags = plugin_pch_args

if get_option('enable_openmp')
dependencies += [dependency('openmp')]
# PCH does not have openmp enabled
animate_pch_deps = []
animate_pch_args = []
endif

animiate = shared_module('animate',
['animate.cpp',
'fire/particle.cpp',
'fire/fire.cpp'],
include_directories: [wayfire_api_inc, wayfire_conf_inc],
dependencies: dependencies,
dependencies: dependencies + animate_pch_deps,
cpp_args: animate_pch_args,
install: true,
install_dir: join_paths(get_option('libdir'), 'wayfire'))

Expand Down
6 changes: 4 additions & 2 deletions plugins/blur/meson.build
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
blur_base = shared_library('wayfire-blur-base',
['blur-base.cpp', 'box.cpp', 'gaussian.cpp', 'kawase.cpp', 'bokeh.cpp'],
include_directories: [wayfire_api_inc, wayfire_conf_inc],
dependencies: [wlroots, pixman, wfconfig],
dependencies: [wlroots, pixman, wfconfig, plugin_pch_dep],
cpp_args: plugin_pch_args,
override_options: ['b_lundef=false'],
install: true)
install_headers(['blur.hpp'], subdir: 'wayfire/plugins/blur')

blur = shared_module('blur', ['blur.cpp'],
link_with: blur_base,
include_directories: [wayfire_api_inc, wayfire_conf_inc],
dependencies: [wlroots, pixman, wfconfig],
dependencies: [wlroots, pixman, wfconfig, plugin_pch_dep],
cpp_args: plugin_pch_args,
install: true, install_dir: join_paths(get_option('libdir'), 'wayfire'))
3 changes: 2 additions & 1 deletion plugins/cube/meson.build
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
animiate = shared_module('cube',
['cube.cpp', 'cubemap.cpp', 'skydome.cpp', 'simple-background.cpp'],
include_directories: [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc, ipc_include_dirs],
dependencies: [wlroots, pixman, wfconfig, json],
dependencies: [wlroots, pixman, wfconfig, json, plugin_pch_dep],
cpp_args: plugin_pch_args,
install: true,
install_dir: join_paths(get_option('libdir'), 'wayfire'))
3 changes: 2 additions & 1 deletion plugins/decor/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ decoration = shared_module('decoration',
['decoration.cpp', 'deco-subsurface.cpp', 'deco-button.cpp',
'deco-layout.cpp', 'deco-theme.cpp'],
include_directories: [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc],
dependencies: [wlroots, pixman, wf_protos, wfconfig, cairo, pango, pangocairo],
dependencies: [wlroots, pixman, wf_protos, wfconfig, cairo, pango, pangocairo, plugin_pch_dep],
cpp_args: plugin_pch_args,
install: true,
install_dir: join_paths(get_option('libdir'), 'wayfire'))
3 changes: 2 additions & 1 deletion plugins/grid/meson.build
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
grid_inc = include_directories('.')
all_include_dirs = [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc, wobbly_inc, grid_inc]
all_deps = [wlroots, pixman, wfconfig, wftouch, cairo, json]
all_deps = [wlroots, pixman, wfconfig, wftouch, cairo, json, plugin_pch_dep]

shared_module('grid', ['grid.cpp'],
include_directories: all_include_dirs,
dependencies: all_deps,
cpp_args: plugin_pch_args,
install: true,
install_dir: conf_data.get('PLUGIN_PATH'))

Expand Down
1 change: 0 additions & 1 deletion plugins/ipc-rules/ipc-events.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
#include <set>
#include "plugins/ipc/ipc-method-repository.hpp"
#include <wayfire/per-output-plugin.hpp>
#include <nlohmann/json.hpp>

namespace wf
{
Expand Down
1 change: 0 additions & 1 deletion plugins/ipc-rules/ipc-rules-common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
#include "plugins/ipc/ipc-helpers.hpp"
#include <wayfire/output.hpp>
#include <wayfire/workarea.hpp>
#include <nlohmann/json.hpp>
#include <wayfire/workspace-set.hpp>
#include "config.h"
#include "wayfire/plugins/common/util.hpp"
Expand Down
3 changes: 2 additions & 1 deletion plugins/ipc-rules/meson.build
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
all_include_dirs = [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc]
all_deps = [wlroots, pixman, wfconfig, wftouch, json]
all_deps = [wlroots, pixman, wfconfig, wftouch, json, plugin_pch_dep]

shared_module('ipc-rules', ['ipc-rules.cpp'],
include_directories: all_include_dirs,
cpp_args: plugin_pch_args,
dependencies: all_deps,
install: true,
install_dir: conf_data.get('PLUGIN_PATH'))
Expand Down
2 changes: 1 addition & 1 deletion plugins/ipc/ipc-helpers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
#include <wayfire/core.hpp>
#include <wayfire/output-layout.hpp>
#include <wayfire/core.hpp>
#include <nlohmann/json.hpp>
#include <nlohmann/json.hpp> // IWYU pragma: keep

namespace wf
{
Expand Down
2 changes: 1 addition & 1 deletion plugins/ipc/ipc-method-repository.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#pragma once

#include <nlohmann/json.hpp>
#include <nlohmann/json.hpp> // IWYU pragma: keep
#include <functional>
#include <map>
#include "wayfire/signal-provider.hpp"
Expand Down
2 changes: 1 addition & 1 deletion plugins/ipc/ipc.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#pragma once

#include <nlohmann/json.hpp>
#include <nlohmann/json.hpp> // IWYU pragma: keep
#include <sys/un.h>
#include <wayfire/object.hpp>
#include <wayland-server.h>
Expand Down
9 changes: 6 additions & 3 deletions plugins/ipc/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,24 @@ ipc_include_dirs = include_directories('.')
ipc = shared_module('ipc',
['ipc.cpp'],
include_directories: [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc],
dependencies: [wlroots, pixman, wfconfig, wftouch, json, evdev],
dependencies: [wlroots, pixman, wfconfig, wftouch, json, evdev, plugin_pch_dep],
cpp_args: plugin_pch_args,
install: true,
install_dir: conf_data.get('PLUGIN_PATH'))

stipc = shared_module('stipc',
['stipc.cpp'],
include_directories: [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc],
dependencies: [wlroots, pixman, wfconfig, wftouch, json, evdev],
dependencies: [wlroots, pixman, wfconfig, wftouch, json, evdev, plugin_pch_dep],
cpp_args: plugin_pch_args,
install: true,
install_dir: conf_data.get('PLUGIN_PATH'))

demoipc = shared_module('demo-ipc',
['demo-ipc.cpp'],
include_directories: [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc],
dependencies: [wlroots, pixman, wfconfig, wftouch, json, evdev],
dependencies: [wlroots, pixman, wfconfig, wftouch, json, evdev, plugin_pch_dep],
cpp_args: plugin_pch_args,
install: true,
install_dir: conf_data.get('PLUGIN_PATH'))

Expand Down
33 changes: 33 additions & 0 deletions plugins/meson.build
Original file line number Diff line number Diff line change
@@ -1,4 +1,37 @@
subdir('common')

if get_option('custom_pch')
cc = meson.get_compiler('cpp')

pch_file = meson.current_source_dir() / 'pch/pch.hpp'
if cc.get_id() == 'clang'
add_flags = []
if get_option('buildtype') == 'debugoptimized' or get_option('buildtype') == 'release'
add_flags += ['-O2']
endif

if has_asan
add_flags += ['-fsanitize=address']
endif

pch = custom_target('plugin_pch',
input: pch_file,
output: 'plugin_pch.hpp.pch',
command: cc.cmd_array() + ['@INPUT@', '-c', '-o', '@OUTPUT@',
'-std=c++17', '-pthread', '-fPIC'] + add_flags)

plugin_pch_args = ['-include-pch', pch.full_path(), '-pthread']
plugin_pch_dep = declare_dependency(sources: pch)
elif cc.get_id() == 'gcc'
error('TODO: CUSTOM PCH FOR GCC')
else
error('Unsupported compiler for custom pch: ' + cc.get_id())
endif
else
plugin_pch_args = []
plugin_pch_dep = declare_dependency()
endif

subdir('ipc')
subdir('protocols')
subdir('vswitch')
Expand Down
13 changes: 13 additions & 0 deletions plugins/pch/pch.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#include <wayland-server.h>
#include <glm/glm.hpp>

#include <string>
#include <vector>
#include <utility>
#include <memory>
#include <functional>
#include <algorithm>
#include <sstream>
#include <map>
#include <cmath>
#include <cstddef>
3 changes: 2 additions & 1 deletion plugins/protocols/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ protocol_plugins = [
]

all_include_dirs = [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc]
all_deps = [wlroots, pixman, wfconfig, wf_protos, json, cairo, pango, pangocairo]
all_deps = [wlroots, pixman, wfconfig, wf_protos, json, cairo, pango, pangocairo, plugin_pch_dep]

foreach plugin : protocol_plugins
shared_module(plugin, plugin + '.cpp',
include_directories: all_include_dirs,
dependencies: all_deps,
cpp_args: plugin_pch_args,
install: true,
install_dir: conf_data.get('PLUGIN_PATH'))
endforeach
Expand Down
4 changes: 3 additions & 1 deletion plugins/scale/meson.build
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
all_include_dirs = [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc, vswitch_inc, wobbly_inc, include_directories('.')]
all_deps = [wlroots, pixman, wfconfig, wftouch, cairo, pango, pangocairo, json]
all_deps = [wlroots, pixman, wfconfig, wftouch, cairo, pango, pangocairo, json, plugin_pch_dep]

shared_module('scale', ['scale.cpp', 'scale-title-overlay.cpp'],
include_directories: all_include_dirs,
dependencies: all_deps,
cpp_args: plugin_pch_args,
install: true,
install_dir: conf_data.get('PLUGIN_PATH'))

shared_module('scale-title-filter', 'scale-title-filter.cpp',
include_directories: all_include_dirs,
dependencies: all_deps,
cpp_args: plugin_pch_args,
install: true,
install_dir: conf_data.get('PLUGIN_PATH'))

Expand Down
3 changes: 2 additions & 1 deletion plugins/single_plugins/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@ plugins = [
]

all_include_dirs = [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc, vswitch_inc, wobbly_inc, grid_inc]
all_deps = [wlroots, pixman, wfconfig, wftouch, cairo, pango, pangocairo, json]
all_deps = [wlroots, pixman, wfconfig, wftouch, cairo, pango, pangocairo, json, plugin_pch_dep]

foreach plugin : plugins
shared_module(plugin, plugin + '.cpp',
include_directories: all_include_dirs,
dependencies: all_deps,
cpp_args: plugin_pch_args,
install: true,
install_dir: conf_data.get('PLUGIN_PATH'))
endforeach
3 changes: 2 additions & 1 deletion plugins/tile/meson.build
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
tile = shared_module('simple-tile',
['tile-plugin.cpp', 'tree.cpp', 'tree-controller.cpp'],
include_directories: [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc, grid_inc, wobbly_inc, ipc_include_dirs],
dependencies: [wlroots, pixman, wfconfig, json],
dependencies: [wlroots, pixman, wfconfig, json, plugin_pch_dep],
cpp_args: plugin_pch_args,
install: true,
install_dir: join_paths(get_option('libdir'), 'wayfire'))

Expand Down
1 change: 0 additions & 1 deletion plugins/tile/tile-ipc.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
#include <wayfire/workspace-set.hpp>
#include <wayfire/toplevel-view.hpp>
#include "tree.hpp"
#include <nlohmann/json.hpp>
#include "plugins/ipc/ipc-helpers.hpp"
#include "plugins/ipc/ipc-method-repository.hpp"
#include "tile-wset.hpp"
Expand Down
3 changes: 2 additions & 1 deletion plugins/vswitch/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ vswitch_inc = include_directories('.')
vswitch = shared_module('vswitch',
['vswitch.cpp'],
include_directories: [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc, vswitch_inc, ipc_include_dirs],
dependencies: [wlroots, pixman, wfconfig, json],
dependencies: [wlroots, pixman, wfconfig, json, plugin_pch_dep],
cpp_args: plugin_pch_args,
install: true,
install_dir: join_paths(get_option('libdir'), 'wayfire'))

Expand Down
6 changes: 3 additions & 3 deletions plugins/window-rules/meson.build
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
window_rules = shared_module('window-rules',
['window-rules.cpp', 'view-action-interface.cpp'],
include_directories: [wayfire_api_inc, wayfire_conf_inc, grid_inc, plugins_common_inc],
dependencies: [wlroots, pixman, wfconfig, wfutils],
dependencies: [wlroots, pixman, wfconfig, wfutils, plugin_pch_dep],
cpp_args: plugin_pch_args,
install: true,
install_dir: join_paths(get_option('libdir'), 'wayfire')
)
install_dir: join_paths(get_option('libdir'), 'wayfire'))
3 changes: 2 additions & 1 deletion plugins/wm-actions/meson.build
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
wm_actions = shared_module('wm-actions',
['wm-actions.cpp'],
include_directories: [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc],
dependencies: [wlroots, pixman, wfconfig, json],
dependencies: [wlroots, pixman, wfconfig, json, plugin_pch_dep],
cpp_args: plugin_pch_args,
install: true,
install_dir: join_paths(get_option('libdir'), 'wayfire'))

Expand Down
8 changes: 6 additions & 2 deletions plugins/wobbly/meson.build
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
wobbly_c_model = static_library('wobbly-c-model', ['wobbly.c'], install: false)

wobbly = shared_module('wobbly',
['wobbly.cpp', 'wobbly.c'],
['wobbly.cpp'],
include_directories: [wayfire_api_inc, wayfire_conf_inc, plugins_common_inc],
dependencies: [wlroots, pixman, wfconfig],
dependencies: [wlroots, pixman, wfconfig, plugin_pch_dep],
cpp_args: plugin_pch_args,
link_with: wobbly_c_model,
install: true,
install_dir: join_paths(get_option('libdir'), 'wayfire'))

Expand Down
1 change: 1 addition & 0 deletions plugins/wobbly/wayfire/plugins/wobbly/wobbly-signal.hpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#pragma once

#include <wayfire/signal-definitions.hpp>
#include <wayfire/core.hpp>
#include <wayfire/toplevel-view.hpp>
Expand Down
2 changes: 1 addition & 1 deletion src/api/wayfire/nonstd/wlroots.hpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#pragma once

#ifndef WLR_USE_UNSTABLE
#define WLR_USE_UNSTABLE
#define WLR_USE_UNSTABLE 1
#endif

/**
Expand Down
2 changes: 2 additions & 0 deletions src/api/wayfire/per-output-plugin.hpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#pragma once

#include "wayfire/signal-provider.hpp"
#include <wayfire/plugin.hpp>
#include <wayfire/core.hpp>
Expand Down
3 changes: 1 addition & 2 deletions src/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,7 @@ else
endif


cxx_flags_asan = run_command('/bin/sh', '-c', 'echo $CXXFLAGS $CPPFLAGS | grep fsanitize', check: false)
if get_option('b_sanitize').contains('address') or cxx_flags_asan.returncode() == 0
if has_asan
print_trace = false
debug_arguments += ['-DHAS_ASAN=1']
message('Address sanitizer enabled, disabling internal backtrace')
Expand Down

0 comments on commit a706894

Please sign in to comment.