1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00
luanti/src/config.h

50 lines
2.1 KiB
C
Raw Normal View History

#pragma once
#if defined USE_CMAKE_CONFIG_H
#include "cmake_config.h" // IWYU pragma: export
#else
#warning Missing configuration
#endif
/*
* There are three ways a Minetest source file can be built:
* 1) we are currently building it for exclusively linking into the client
* 2) we are currently building it for exclusively linking into the server
* 3) we are building it only once for linking into both the client and server
* In case of 1 and 2 that means a single source file may be built twice if
* both a client and server build was requested.
*
* These options map to the following macros:
* 1) IS_CLIENT_BUILD = 1 and CHECK_CLIENT_BUILD() = 1
* 2) IS_CLIENT_BUILD = 0 and CHECK_CLIENT_BUILD() = 0
* 3) IS_CLIENT_BUILD = 0 and CHECK_CLIENT_BUILD() undefined
* As a function style macro CHECK_CLIENT_BUILD() has the special property that it
* cause a compile error if it used but not defined.
*
* v v v v v v v v v READ THIS PART v v v v v v v v v
* So that object files can be safely shared, these macros need to be used like so:
* - use IS_CLIENT_BUILD to exclude optional helpers in header files or similar
* - use CHECK_CLIENT_BUILD() in all source files, or in headers where it
* influences program behavior or e.g. class structure
* In practice this means any shared object files (case 3) cannot include any
* code that references CHECK_CLIENT_BUILD(), because a compiler error will occur.
* ^ ^ ^ ^ ^ ^ ^ ^ ^ READ THIS PART ^ ^ ^ ^ ^ ^ ^ ^ ^
*
* The background is that for any files built only once, we need to ensure that
* they are perfectly ABI-compatible between client/server or it will not work.
* This manifests either as a linker error (good case) or insidious memory corruption
* that causes obscure runtime behavior (bad case).
* Finally, note that the best option is to split code in such a way that usage
* of these macros is not necessary.
*/
#if MT_BUILDTARGET == 1
#define IS_CLIENT_BUILD 1
#define CHECK_CLIENT_BUILD() 1
#elif MT_BUILDTARGET == 2
#define IS_CLIENT_BUILD 0
#define CHECK_CLIENT_BUILD() 0
#else
#define IS_CLIENT_BUILD 0
#endif
#undef MT_BUILDTARGET