2017-08-17 22:19:39 +02:00
|
|
|
#pragma once
|
2011-01-18 15:05:29 +02:00
|
|
|
|
2015-03-28 20:25:34 +10:00
|
|
|
#if defined USE_CMAKE_CONFIG_H
|
2024-10-18 10:58:32 +02:00
|
|
|
#include "cmake_config.h" // IWYU pragma: export
|
2015-03-28 20:25:34 +10:00
|
|
|
#else
|
2023-05-26 15:21:23 +02:00
|
|
|
#warning Missing configuration
|
2014-10-01 22:18:29 +02:00
|
|
|
#endif
|
2024-10-15 15:47:23 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* 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
|