Skip to content

Commit

Permalink
bpo-35081: Internal headers require Py_BUILD_CORE (GH-10363)
Browse files Browse the repository at this point in the history
* All internal header files now require Py_BUILD_CORE or
  Py_BUILD_CORE_BUILTIN to be defined.
* _json.c is now compiled with Py_BUILD_CORE_BUILTIN to access
  pycore_accu.h header.
* Add an example to Modules/Setup to show how to build _json
  as a built-in module; it requires non trivial compiler options.
  • Loading branch information
vstinner committed Nov 9, 2018
1 parent 0a18e05 commit 130893d
Show file tree
Hide file tree
Showing 16 changed files with 48 additions and 13 deletions.
4 changes: 4 additions & 0 deletions Include/internal/pycore_accu.h
Expand Up @@ -9,6 +9,10 @@ extern "C" {
*** Its definition may be changed or removed at any moment.
***/

#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
#endif

/*
* A two-level accumulator of unicode objects that avoids both the overhead
* of keeping a huge number of small separate objects, and the quadratic
Expand Down
4 changes: 2 additions & 2 deletions Include/internal/pycore_atomic.h
Expand Up @@ -4,8 +4,8 @@
extern "C" {
#endif

#ifndef Py_BUILD_CORE
# error "Py_BUILD_CORE must be defined to include this header"
#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
#endif

#include "dynamic_annotations.h"
Expand Down
4 changes: 4 additions & 0 deletions Include/internal/pycore_ceval.h
Expand Up @@ -4,6 +4,10 @@
extern "C" {
#endif

#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
#endif

#include "pycore_atomic.h"
#include "pythread.h"

Expand Down
4 changes: 4 additions & 0 deletions Include/internal/pycore_condvar.h
@@ -1,6 +1,10 @@
#ifndef Py_INTERNAL_CONDVAR_H
#define Py_INTERNAL_CONDVAR_H

#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
#endif

#ifndef _POSIX_THREADS
/* This means pthreads are not implemented in libc headers, hence the macro
not present in unistd.h. But they still can be implemented as an external
Expand Down
5 changes: 3 additions & 2 deletions Include/internal/pycore_context.h
@@ -1,10 +1,12 @@
#ifndef Py_INTERNAL_CONTEXT_H
#define Py_INTERNAL_CONTEXT_H

#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
#endif

#include "pycore_hamt.h"


struct _pycontextobject {
PyObject_HEAD
PyContext *ctx_prev;
Expand Down Expand Up @@ -37,5 +39,4 @@ struct _pycontexttokenobject {
int _PyContext_Init(void);
void _PyContext_Fini(void);


#endif /* !Py_INTERNAL_CONTEXT_H */
4 changes: 4 additions & 0 deletions Include/internal/pycore_getopt.h
@@ -1,6 +1,10 @@
#ifndef Py_INTERNAL_PYGETOPT_H
#define Py_INTERNAL_PYGETOPT_H

#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
#endif

extern int _PyOS_opterr;
extern int _PyOS_optind;
extern wchar_t *_PyOS_optarg;
Expand Down
4 changes: 4 additions & 0 deletions Include/internal/pycore_gil.h
Expand Up @@ -4,6 +4,10 @@
extern "C" {
#endif

#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
#endif

#include "pycore_condvar.h"
#include "pycore_atomic.h"

Expand Down
3 changes: 3 additions & 0 deletions Include/internal/pycore_hamt.h
@@ -1,6 +1,9 @@
#ifndef Py_INTERNAL_HAMT_H
#define Py_INTERNAL_HAMT_H

#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
#endif

#define _Py_HAMT_MAX_TREE_DEPTH 7

Expand Down
4 changes: 4 additions & 0 deletions Include/internal/pycore_hash.h
@@ -1,6 +1,10 @@
#ifndef Py_INTERNAL_HASH_H
#define Py_INTERNAL_HASH_H

#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
#endif

uint64_t _Py_KeyedHash(uint64_t, const char *, Py_ssize_t);

#endif
4 changes: 2 additions & 2 deletions Include/internal/pycore_lifecycle.h
Expand Up @@ -4,8 +4,8 @@
extern "C" {
#endif

#ifndef Py_BUILD_CORE
# error "Py_BUILD_CORE must be defined to include this header"
#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
#endif

PyAPI_FUNC(int) _Py_UnixMain(int argc, char **argv);
Expand Down
4 changes: 2 additions & 2 deletions Include/internal/pycore_mem.h
Expand Up @@ -4,8 +4,8 @@
extern "C" {
#endif

#ifndef Py_BUILD_CORE
# error "Py_BUILD_CORE must be defined to include this header"
#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN defined"
#endif

#include "objimpl.h"
Expand Down
4 changes: 2 additions & 2 deletions Include/internal/pycore_pathconfig.h
Expand Up @@ -4,8 +4,8 @@
extern "C" {
#endif

#ifndef Py_BUILD_CORE
# error "Py_BUILD_CORE must be defined to include this header"
#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
#endif

PyAPI_FUNC(void) _Py_wstrlist_clear(
Expand Down
4 changes: 2 additions & 2 deletions Include/internal/pycore_state.h
Expand Up @@ -4,8 +4,8 @@
extern "C" {
#endif

#ifndef Py_BUILD_CORE
# error "Py_BUILD_CORE must be defined to include this header"
#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
#endif

#include "pystate.h"
Expand Down
4 changes: 4 additions & 0 deletions Include/internal/pycore_warnings.h
Expand Up @@ -4,6 +4,10 @@
extern "C" {
#endif

#if !defined(Py_BUILD_CORE) && !defined(Py_BUILD_CORE_BUILTIN)
# error "this header requires Py_BUILD_CORE or Py_BUILD_CORE_BUILTIN define"
#endif

#include "object.h"

struct _warnings_runtime_state {
Expand Down
1 change: 1 addition & 0 deletions Modules/Setup
Expand Up @@ -180,6 +180,7 @@ _symtable symtablemodule.c
#_bisect _bisectmodule.c # Bisection algorithms
#_heapq _heapqmodule.c # Heap queue algorithm
#_asyncio _asynciomodule.c # Fast asyncio Future
#_json -I$(srcdir)/Include/internal -DPy_BUILD_CORE_BUILTIN _json.c # _json speedups

#unicodedata unicodedata.c # static Unicode character database

Expand Down
4 changes: 3 additions & 1 deletion setup.py
Expand Up @@ -678,7 +678,9 @@ def detect_modules(self):
# atexit
exts.append( Extension("atexit", ["atexitmodule.c"]) )
# _json speedups
exts.append( Extension("_json", ["_json.c"]) )
exts.append( Extension("_json", ["_json.c"],
# pycore_accu.h requires Py_BUILD_CORE_BUILTIN
extra_compile_args=['-DPy_BUILD_CORE_BUILTIN']) )
# Python C API test module
exts.append( Extension('_testcapi', ['_testcapimodule.c'],
depends=['testcapi_long.h']) )
Expand Down

0 comments on commit 130893d

Please sign in to comment.