diff --git a/dgl/Application.hpp b/dgl/Application.hpp index ed25a64b..7d7f1c95 100644 --- a/dgl/Application.hpp +++ b/dgl/Application.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -27,6 +27,41 @@ END_NAMESPACE_DISTRHO START_NAMESPACE_DGL +// -------------------------------------------------------------------------------------------------------------------- +// build config sentinels + +/** + This set of static variables act as a build sentinel that detects a configuration error. + + Usually this means the way DGL was built and how it is being used and linked into your program are different, + we want to avoid such combinations as memory layout would then also be different + leading to all sort of nasty memory corruption issues. + + Make sure the flags used to build DGL match the ones used by your program and the link errors should go away. + */ +#define BUILD_CONFIG_SENTINEL(NAME) \ + static struct DISTRHO_JOIN_MACRO(_, NAME) { bool ok; DISTRHO_JOIN_MACRO(_, NAME)() noexcept; } NAME; + +#ifdef DPF_DEBUG +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dpf_debug_on) +#else +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dpf_debug_off) +#endif + +#ifdef DGL_USE_FILE_BROWSER +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_file_browser_on) +#else +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_file_browser_off) +#endif + +#ifdef DGL_USE_WEB_VIEW +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_web_view_on) +#else +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_web_view_off) +#endif + +#undef BUILD_CONFIG_SENTINEL + // -------------------------------------------------------------------------------------------------------------------- /** diff --git a/dgl/src/Application.cpp b/dgl/src/Application.cpp index 5fe05dea..7370b0b0 100644 --- a/dgl/src/Application.cpp +++ b/dgl/src/Application.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -24,6 +24,55 @@ START_NAMESPACE_DGL +// -------------------------------------------------------------------------------------------------------------------- +// build config sentinels + +#define BUILD_CONFIG_SENTINEL(NAME) \ + DISTRHO_JOIN_MACRO(_, NAME)::DISTRHO_JOIN_MACRO(_, NAME)() noexcept : ok(false) {} + +#ifdef DPF_DEBUG +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dpf_debug_on) +#else +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dpf_debug_off) +#endif + +#ifdef DGL_USE_FILE_BROWSER +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_file_browser_on) +#else +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_file_browser_off) +#endif + +#ifdef DGL_USE_WEB_VIEW +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_web_view_on) +#else +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_web_view_off) +#endif + +#undef BUILD_CONFIG_SENTINEL + +static inline +bool dpf_check_build_status() noexcept +{ + return ( + #ifdef DPF_DEBUG + fail_to_link_is_mismatch_dpf_debug_on.ok && + #else + fail_to_link_is_mismatch_dpf_debug_off.ok && + #endif + #ifdef DGL_USE_FILE_BROWSER + fail_to_link_is_mismatch_dgl_use_file_browser_on.ok && + #else + fail_to_link_is_mismatch_dgl_use_file_browser_off.ok && + #endif + #ifdef DGL_USE_WEB_VIEW + fail_to_link_is_mismatch_dgl_use_web_view_on.ok && + #else + fail_to_link_is_mismatch_dgl_use_web_view_off.ok && + #endif + true + ); +} + // -------------------------------------------------------------------------------------------------------------------- #ifdef __EMSCRIPTEN__ @@ -34,7 +83,26 @@ static void app_idle(void* const app) #endif Application::Application(const bool isStandalone) - : pData(new PrivateData(isStandalone)) {} + : pData(new PrivateData(isStandalone)) +{ + // build config sentinels + #ifdef DPF_DEBUG + fail_to_link_is_mismatch_dpf_debug_on.ok = true; + #else + fail_to_link_is_mismatch_dpf_debug_off.ok = true; + #endif + #ifdef DGL_USE_FILE_BROWSER + fail_to_link_is_mismatch_dgl_use_file_browser_on.ok = true; + #else + fail_to_link_is_mismatch_dgl_use_file_browser_off.ok = true; + #endif + #ifdef DGL_USE_WEB_VIEW + fail_to_link_is_mismatch_dgl_use_web_view_on.ok = true; + #else + fail_to_link_is_mismatch_dgl_use_web_view_off.ok = true; + #endif + DISTRHO_SAFE_ASSERT(dpf_check_build_status()); +} Application::~Application() {