6
PYTHON setup.py build_ext --inplace
7
PYTHON -c "from include_as_c_and_cpp import test; test()"
8
PYTHON -c "from include_from_c_and_cpp import test; test()"
9
PYTHON -c "from cdefines import test; test()"
12
######## setup.py ########
14
from Cython.Build import cythonize
15
from Cython.Distutils.extension import Extension
16
from distutils.core import setup
19
include_as_c_and_cpp = Extension(
20
"include_as_c_and_cpp",
21
["include_as_c_and_cpp.pyx", "include_as_c.cpp", "include_as_cpp.cpp"],
23
include_from_c_and_cpp = Extension(
24
"include_from_c_and_cpp",
25
["include_from_c_and_cpp.pyx", "include_from_c.c", "include_from_cpp.cpp"],
30
["cdefines.pyx", "cdefines_clean.c", "cdefines_plain.cpp"],
31
define_macros = [("CYTHON_EXTERN_C", 'extern "C"')],
34
ext_modules = [include_as_c_and_cpp, include_from_c_and_cpp]
35
if sys.platform != "win32":
36
# It's very hard to get the command-line macro define to escape properly on Windows,
38
ext_modules.append(cdefines)
41
ext_modules=cythonize(ext_modules),
45
######## include_as_c_and_cpp.pyx ########
47
# distutils: language = c++
49
from libcpp cimport vector
51
cdef public vector.vector[int] get_vector():
54
cdef extern from "include_as_c_and_cpp_header.h":
55
cdef size_t size_vector1()
56
cdef size_t size_vector2()
59
assert size_vector1() == 3
60
assert size_vector2() == 3
62
######## include_as_c_and_cpp_header.h ########
67
######## include_as_cpp.cpp ########
70
#include "include_as_c_and_cpp.h"
72
size_t size_vector1() {
73
return get_vector().size();
76
######## include_as_c.cpp ########
80
// #include within `extern "C"` is legal.
81
// We want to make sure here that Cython C++ functions are flagged as `extern "C++"`.
82
// Otherwise they would be interpreted with C-linkage if the header is include within a `extern "C"` block.
83
#include "include_as_c_and_cpp.h"
86
size_t size_vector2() {
87
return get_vector().size();
91
######## include_from_c_and_cpp.pyx ########
93
cdef public char get_char():
96
cdef extern from "include_from_c_and_cpp_header.h":
101
assert get_int1() == 42
102
assert get_int2() == 42
104
######## include_from_c_and_cpp_header.h ########
109
######## include_from_c.c ########
111
#include "include_from_c_and_cpp.h"
113
int get_int1() { return (int)get_char(); }
115
######## include_from_cpp.cpp ########
118
#include "include_from_c_and_cpp.h"
121
extern "C" int get_int2() { return (int)get_char(); }
124
######## cdefines.pyx ########
126
# distutils: language = c++
128
cdef public char get_char():
131
cdef extern from "cdefines_header.h":
136
assert get_int1() == 42
137
assert get_int2() == 42
139
######## cdefines_header.h ########
142
#define cdefines_EXTERN_C extern "C"
144
#define cdefines_EXTERN_C
147
cdefines_EXTERN_C int get_int1();
150
######## cdefines_clean.c ########
152
#undef CYTHON_EXTERN_C
153
#define CYTHON_EXTERN_C
156
int get_int1() { return (int)get_char(); }
158
######## cdefines_plain.cpp ########
162
int get_int2() { return (int)get_char(); }
164
######## cdefines.py ##########
166
# Dummy module so Windows test works
168
assert sys.platform == "win32"