mirror of
https://github.com/postgres/postgres.git
synced 2025-05-31 03:21:24 +03:00
We undefined them to avoid warnings about macro redefinitions. But we haven't fully followed the necessary include order, since at least 147c2482542, in 2011. Recently the combination of the include order rules not being followed and undefining _POSIX_C_SOURCE started to cause a compile failure, starting with 03023a2664f. Undefining _POSIX_C_SOURCE hides clock_gettime(), which is referenced in an inline function as of 03023a2664f, whereas it was a macro before. After seeing some evidence that undefining _POSIX_C_SOURCE et al isn't required, I tried to build postgres with plpython on most of our supported platforms (except DragonFlyBSD and Illumos, but similar systems were tested), with/without the #undefines. No compiler warning / behavioral difference. The oldest supported python version, 3.2, defines _POSIX_C_SOURCE to 200112L ad _XOPEN_SOURCE to 600, whereas newer versions of python use 200809L/700 respectively. As _POSIX_C_SOURCE/_XOPEN_SOURCE will default to the newer operating system on most platforms, it's possible that when using python 3.2 new warnings would be emitted - but that seems acceptable. It's possible that this approach won't work on some older platforms. But getting rid of most of the include-order complexity seems promising, and it's an easily revertible patch if we end up having to go another way. Discussion: https://postgr.es/m/20230124165814.2njc7gnvubn2amh6@awork3.anarazel.de
55 lines
1.4 KiB
C
55 lines
1.4 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* plpython.h - Python as a procedural language for PostgreSQL
|
|
*
|
|
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/pl/plpython/plpython.h
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef PLPYTHON_H
|
|
#define PLPYTHON_H
|
|
|
|
/* postgres.h needs to be included before Python.h, as usual */
|
|
#if !defined(POSTGRES_H)
|
|
#error postgres.h must be included before plpython.h
|
|
#elif defined(Py_PYTHON_H)
|
|
#error Python.h must be included via plpython.h
|
|
#endif
|
|
|
|
/*
|
|
* Python versions <= 3.8 otherwise define a replacement, causing macro
|
|
* redefinition warnings.
|
|
*/
|
|
#define HAVE_SNPRINTF 1
|
|
|
|
#if defined(_MSC_VER) && defined(_DEBUG)
|
|
/* Python uses #pragma to bring in a non-default libpython on VC++ if
|
|
* _DEBUG is defined */
|
|
#undef _DEBUG
|
|
/* Also hide away errcode, since we load Python.h before postgres.h */
|
|
#define errcode __msvc_errcode
|
|
#include <Python.h>
|
|
#undef errcode
|
|
#define _DEBUG
|
|
#elif defined (_MSC_VER)
|
|
#define errcode __msvc_errcode
|
|
#include <Python.h>
|
|
#undef errcode
|
|
#else
|
|
#include <Python.h>
|
|
#endif
|
|
|
|
/* define our text domain for translations */
|
|
#undef TEXTDOMAIN
|
|
#define TEXTDOMAIN PG_TEXTDOMAIN("plpython")
|
|
|
|
/*
|
|
* Used throughout, so it's easier to just include it everywhere.
|
|
*/
|
|
#include "plpy_util.h"
|
|
|
|
#endif /* PLPYTHON_H */
|