diff --git a/.gitignore b/.gitignore index 567609b1234a9b8806c5a05da6c866e480aa148d..87d63aa385f0fdc2f568373c8d24edf1b34c037d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ build/ +*.so +*.dylib diff --git a/cython-example/CMakeLists.txt b/cython-example/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..7d02d41ab380e80749bfdc734c730ef6fe5db246 --- /dev/null +++ b/cython-example/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.1) + +project(Fibonacci VERSION 0.1 + DESCRIPTION "Calculate Fibonacci Numbers using C++" + LANGUAGES CXX) + +add_library(fibonacci SHARED src/fibonacci.cpp include/fibonacci.h) +target_include_directories(fibonacci PUBLIC include) + +add_executable(fib_cli apps/fib_cli.cpp) +target_link_libraries(fib_cli PUBLIC fibonacci) diff --git a/cython-example/apps/fib_cli.cpp b/cython-example/apps/fib_cli.cpp new file mode 100644 index 0000000000000000000000000000000000000000..92d46f0a3ecafc09c76e8847d3abe98519287851 --- /dev/null +++ b/cython-example/apps/fib_cli.cpp @@ -0,0 +1,12 @@ +#include <iostream> +#include "fibonacci.h" + + +int main() { + + for (unsigned int i = 0; i < 10; i++) { + std::cout << i << ": " << fibonacci(i) << std::endl; + } + + return 0; +} diff --git a/cython-example/fib_wrapper.pyx b/cython-example/fib_wrapper.pyx new file mode 100644 index 0000000000000000000000000000000000000000..08529641994d660f5539417395d2ac0144b14f9b --- /dev/null +++ b/cython-example/fib_wrapper.pyx @@ -0,0 +1,5 @@ +# cython: language_level = 3 +# distutils: language = c++ + +cdef extern from "fibonacci.h": + cpdef unsigned long fibonacci(unsigned int n) diff --git a/cython-example/include/fibonacci.h b/cython-example/include/fibonacci.h new file mode 100644 index 0000000000000000000000000000000000000000..57fd44944277a33d08f597f6b2a90b7cee4d2c11 --- /dev/null +++ b/cython-example/include/fibonacci.h @@ -0,0 +1,4 @@ +#ifndef FIBONACCI_H +#define FIBONACCI_H +unsigned long fibonacci(unsigned int n); +#endif diff --git a/cython-example/setup.py b/cython-example/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..f4069e171bb69e55501ca9690424123b6b634e38 --- /dev/null +++ b/cython-example/setup.py @@ -0,0 +1,22 @@ +from setuptools import setup, Extension +from Cython.Build import cythonize +import os + +ext_modules = [ + Extension( + 'fib_wrapper', + sources=['fib_wrapper.pyx'], + libraries=['fibonacci'], + runtime_library_dirs=[os.path.abspath('build')], + extra_link_args=['-Wl,-rpath', os.path.abspath('build')], + include_dirs=['include'], + library_dirs=['build'], + ) +] + + +setup( + name='fib_wrapper', + version='0.0.1', + ext_modules=cythonize(ext_modules) +) diff --git a/cython-example/src/fibonacci.cpp b/cython-example/src/fibonacci.cpp new file mode 100644 index 0000000000000000000000000000000000000000..799eddd82ddef4ce55518ea649a28381be71e6b7 --- /dev/null +++ b/cython-example/src/fibonacci.cpp @@ -0,0 +1,14 @@ +#include "fibonacci.h" + +unsigned long fibonacci(unsigned int n) { + unsigned long n0 = 1; + unsigned long n1 = 1; + unsigned long tmp = 1; + + for (unsigned int i = 0; i < n; i++) { + tmp = n1; + n1 = n0 + n1; + n0 = tmp; + } + return n0; +} diff --git a/pybind11-example/Makefile b/pybind11-example/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..35bf03e21c899900d44281ac1a7886093f34b6a4 --- /dev/null +++ b/pybind11-example/Makefile @@ -0,0 +1,35 @@ +all: libfibonacci.so fibmod fib_cli + +fib_cli: apps/fib_cli.cpp libfibonacci.so + # compile fib_cli.cpp using the c++ compiler + # save to `fib_cli` + # link against the library `fibonacci` + # include the current directory in the directories searched for libraries + # include the current directory in the directories searched for headers + # compile the path where the library is to find into the binary + $(CXX) apps/fib_cli.cpp \ + -o fib_cli \ + -lfibonacci \ + -L. \ + -Iinclude \ + -Wl,-rpath . + +libfibonacci.so: include/fibonacci.h src/fibonacci.cpp + # compile fibonacci.cpp into a shared library + # into libfibonacci.so + $(CXX) src/fibonacci.cpp \ + -I include \ + -o libfibonacci.so \ + -Wl,-rpath . \ + --shared + +fibmod: libfibonacci.so src/fibonacci_wrapper.cpp + # compile a python wrapper using pybind 11 + $(CXX) -O3 -Wall -shared -std=c++11 -undefined dynamic_lookup \ + -Iinclude -L. -lfibonacci \ + `python3 -m pybind11 --includes` \ + src/fibonacci_wrapper.cpp \ + -o fibmod`python3-config --extension-suffix` + +clean: + rm -f fib_cli libfibonacci.so fibmod.cpython* fib_cli diff --git a/pybind11-example/apps/fib_cli.cpp b/pybind11-example/apps/fib_cli.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0cf58fae75235c8044efc50c1306012d99b20825 --- /dev/null +++ b/pybind11-example/apps/fib_cli.cpp @@ -0,0 +1,12 @@ +#include <iostream> +#include "fibonacci.h" + + +int main() { + + for (unsigned int i = 0; i < 10; i++) { + std::cout << i << ": " << fibonacci(i) << std::endl; + } + + return 0; +} diff --git a/pybind11-example/fib_cli b/pybind11-example/fib_cli new file mode 100755 index 0000000000000000000000000000000000000000..3db9e49b452e304224eacc2e1d356fb616b04d8d Binary files /dev/null and b/pybind11-example/fib_cli differ diff --git a/pybind11-example/include/fibonacci.h b/pybind11-example/include/fibonacci.h new file mode 100644 index 0000000000000000000000000000000000000000..57fd44944277a33d08f597f6b2a90b7cee4d2c11 --- /dev/null +++ b/pybind11-example/include/fibonacci.h @@ -0,0 +1,4 @@ +#ifndef FIBONACCI_H +#define FIBONACCI_H +unsigned long fibonacci(unsigned int n); +#endif diff --git a/pybind11-example/src/fibonacci.cpp b/pybind11-example/src/fibonacci.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5ef56cea2511af865d91ad9274d81088b616ef97 --- /dev/null +++ b/pybind11-example/src/fibonacci.cpp @@ -0,0 +1,14 @@ +#include "fibonacci.h" + +unsigned long fibonacci(unsigned int n) { + unsigned long n0 = 1; + unsigned long n1 = 1; + unsigned long tmp = 1; + + for (unsigned int i = 0; i < n; i++) { + tmp = n1; + n1 = n0 + n1; + n0 = tmp; + } + return n0; +} diff --git a/pybind11-example/src/fibonacci_wrapper.cpp b/pybind11-example/src/fibonacci_wrapper.cpp new file mode 100644 index 0000000000000000000000000000000000000000..104883b7d6e7755e889e59213322a542f17e9330 --- /dev/null +++ b/pybind11-example/src/fibonacci_wrapper.cpp @@ -0,0 +1,8 @@ +#include <pybind11/pybind11.h> +#include "fibonacci.h" + +PYBIND11_MODULE(fibmod, m) { + m.doc() = "pybind11 example plugin for fibonacci"; + + m.def("fibonacci", &fibonacci, "Fibonacci function using C++"); +}