From 896564453671eac84baa0fe200b1163b790695b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Boris=20Sch=C3=A4ling?= Date: Thu, 26 May 2016 22:42:07 +0200 Subject: [PATCH 1/2] Make examples build and run on Cygwin --- .gitignore | 1 + CMakeLists.txt | 21 +++++++++++++-------- include/pybind11/common.h | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index a7a49560d..1551bc2a2 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ cmake_install.cmake .DS_Store /example/example.so /example/example.pyd +/example/example.dll *.sln *.sdf *.opensdf diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f10bd375..510d4936d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,7 +59,7 @@ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU" # Check for Link Time Optimization support # (GCC/Clang) CHECK_CXX_COMPILER_FLAG("-flto" HAS_LTO_FLAG) - if (HAS_LTO_FLAG) + if (HAS_LTO_FLAG AND NOT CYGWIN) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto") endif() @@ -149,6 +149,9 @@ add_library(example SHARED ${PYBIND11_EXAMPLES} ) +# Link against the Python shared library +target_link_libraries(example ${PYTHON_LIBRARY}) + # Don't add a 'lib' prefix to the shared library set_target_properties(example PROPERTIES PREFIX "") @@ -182,9 +185,6 @@ if (WIN32) # .PYD file extension on Windows set_target_properties(example PROPERTIES SUFFIX ".pyd") - - # Link against the Python shared library - target_link_libraries(example ${PYTHON_LIBRARY}) elseif (UNIX) # It's quite common to have multiple copies of the same Python version # installed on one's system. E.g.: one copy from the OS and another copy @@ -200,8 +200,13 @@ elseif (UNIX) # missing symbols, but that's perfectly fine -- they will be resolved at # import time. - # .SO file extension on Linux/Mac OS - set_target_properties(example PROPERTIES SUFFIX ".so") + # .DLL file extension on Cygwin, .SO file extension on Linux/Mac OS + if (CYGWIN) + set(SUFFIX ".dll") + else() + set(SUFFIX ".so") + endif() + set_target_properties(example PROPERTIES SUFFIX ${SUFFIX}) # Optimize for a small binary size if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG) @@ -213,11 +218,11 @@ elseif (UNIX) set_target_properties(example PROPERTIES MACOSX_RPATH ".") set_target_properties(example PROPERTIES LINK_FLAGS "-undefined dynamic_lookup ") if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG) - add_custom_command(TARGET example POST_BUILD COMMAND strip -u -r ${PROJECT_SOURCE_DIR}/example/example.so) + add_custom_command(TARGET example POST_BUILD COMMAND strip -u -r ${PROJECT_SOURCE_DIR}/example/example${SUFFIX}) endif() else() if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG) - add_custom_command(TARGET example POST_BUILD COMMAND strip ${PROJECT_SOURCE_DIR}/example/example.so) + add_custom_command(TARGET example POST_BUILD COMMAND strip ${PROJECT_SOURCE_DIR}/example/example${SUFFIX}) endif() endif() endif() diff --git a/include/pybind11/common.h b/include/pybind11/common.h index e60684fc2..43e41d8d0 100644 --- a/include/pybind11/common.h +++ b/include/pybind11/common.h @@ -262,7 +262,7 @@ struct internals { std::unordered_map registered_instances; // void * -> PyObject* std::unordered_set, overload_hash> inactive_overload_cache; #if defined(WITH_THREAD) - int tstate = 0; + long tstate = 0; PyInterpreterState *istate = nullptr; #endif }; From 20ee9352038f961b5a9d76c986c9ae088f8ea969 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Boris=20Sch=C3=A4ling?= Date: Sat, 28 May 2016 12:26:18 +0200 Subject: [PATCH 2/2] Use decltype to deduce return type of PyThread_create_key --- CMakeLists.txt | 2 +- example/example10.cpp | 2 +- example/example4.cpp | 2 +- include/pybind11/common.h | 2 +- include/pybind11/pybind11.h | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 510d4936d..0452d5dab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,7 +81,7 @@ if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") endif() elseif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wconversion") endif() diff --git a/example/example10.cpp b/example/example10.cpp index cbe737e72..06528c2f0 100644 --- a/example/example10.cpp +++ b/example/example10.cpp @@ -13,7 +13,7 @@ double my_func(int x, float y, double z) { std::cout << "my_func(x:int=" << x << ", y:float=" << y << ", z:float=" << z << ")" << std::endl; - return x*y*z; + return (float) x*y*z; } std::complex my_func3(std::complex c) { diff --git a/example/example4.cpp b/example/example4.cpp index 281eafed5..7e17864e0 100644 --- a/example/example4.cpp +++ b/example/example4.cpp @@ -38,7 +38,7 @@ void test_function2(EMyEnumeration k) { float test_function3(int i) { std::cout << "test_function(" << i << ")" << std::endl; - return i / 2.f; + return (float) i / 2.f; } py::bytes return_bytes() { diff --git a/include/pybind11/common.h b/include/pybind11/common.h index 43e41d8d0..272c207e1 100644 --- a/include/pybind11/common.h +++ b/include/pybind11/common.h @@ -262,7 +262,7 @@ struct internals { std::unordered_map registered_instances; // void * -> PyObject* std::unordered_set, overload_hash> inactive_overload_cache; #if defined(WITH_THREAD) - long tstate = 0; + decltype(PyThread_create_key()) tstate = 0; // Usually an int but a long on Cygwin64 with Python 3.x PyInterpreterState *istate = nullptr; #endif }; diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h index ee76a6702..46923de4c 100644 --- a/include/pybind11/pybind11.h +++ b/include/pybind11/pybind11.h @@ -1115,7 +1115,7 @@ public: gil_scoped_release(bool disassoc = false) : disassoc(disassoc) { tstate = PyEval_SaveThread(); if (disassoc) { - int key = detail::get_internals().tstate; + auto key = detail::get_internals().tstate; #if PY_MAJOR_VERSION < 3 PyThread_delete_key_value(key); #else @@ -1128,7 +1128,7 @@ public: return; PyEval_RestoreThread(tstate); if (disassoc) { - int key = detail::get_internals().tstate; + auto key = detail::get_internals().tstate; #if PY_MAJOR_VERSION < 3 PyThread_delete_key_value(key); #endif