Repository: arrow Updated Branches: refs/heads/master bb8514cc9 -> 0bcb7852f
ARROW-839: [Python] Use mktime variant that is reliable on MSVC This also reverts an unintentional regression from https://github.com/apache/arrow/pull/544 when code from config.h was moved to platform.h Author: Wes McKinney <[email protected]> Closes #559 from wesm/ARROW-839 and squashes the following commits: 2e9b300 [Wes McKinney] Use _mkgmtime64 on MSVC f182bab [Wes McKinney] Restore include order in platform.h 38c29bf [Wes McKinney] Add Windows build instructions for Python Project: http://git-wip-us.apache.org/repos/asf/arrow/repo Commit: http://git-wip-us.apache.org/repos/asf/arrow/commit/0bcb7852 Tree: http://git-wip-us.apache.org/repos/asf/arrow/tree/0bcb7852 Diff: http://git-wip-us.apache.org/repos/asf/arrow/diff/0bcb7852 Branch: refs/heads/master Commit: 0bcb7852feb464790791cf5f9c4da1aaaf429970 Parents: bb8514c Author: Wes McKinney <[email protected]> Authored: Tue Apr 18 16:25:02 2017 +0200 Committer: Uwe L. Korn <[email protected]> Committed: Tue Apr 18 16:25:02 2017 +0200 ---------------------------------------------------------------------- cpp/CMakeLists.txt | 4 ++- cpp/src/arrow/python/platform.h | 2 +- cpp/src/arrow/python/util/datetime.h | 6 ++++ python/DEVELOPMENT.md | 48 +++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/arrow/blob/0bcb7852/cpp/CMakeLists.txt ---------------------------------------------------------------------- diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 08120e9..65fb2c9 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -837,7 +837,9 @@ if (${CLANG_FORMAT_FOUND}) add_custom_target(format ${BUILD_SUPPORT_DIR}/run-clang-format.sh ${CMAKE_CURRENT_SOURCE_DIR} ${CLANG_FORMAT_BIN} 1 `find ${CMAKE_CURRENT_SOURCE_DIR}/src -name \\*.cc -or -name \\*.h | sed -e '/_generated/g' | - sed -e '/windows_compatibility.h/g'`) + sed -e '/windows_compatibility.h/g' | + sed -e '/config.h/g' | + sed -e '/platform.h/g'`) # runs clang format and exits with a non-zero exit code if any files need to be reformatted add_custom_target(check-format ${BUILD_SUPPORT_DIR}/run-clang-format.sh ${CMAKE_CURRENT_SOURCE_DIR} ${CLANG_FORMAT_BIN} 0 http://git-wip-us.apache.org/repos/asf/arrow/blob/0bcb7852/cpp/src/arrow/python/platform.h ---------------------------------------------------------------------- diff --git a/cpp/src/arrow/python/platform.h b/cpp/src/arrow/python/platform.h index 38f8e0f..a354b38 100644 --- a/cpp/src/arrow/python/platform.h +++ b/cpp/src/arrow/python/platform.h @@ -21,8 +21,8 @@ #ifndef ARROW_PYTHON_PLATFORM_H #define ARROW_PYTHON_PLATFORM_H -#include <Python.h> #include <iostream> +#include <Python.h> // Work around C2528 error #if _MSC_VER >= 1900 http://git-wip-us.apache.org/repos/asf/arrow/blob/0bcb7852/cpp/src/arrow/python/util/datetime.h ---------------------------------------------------------------------- diff --git a/cpp/src/arrow/python/util/datetime.h b/cpp/src/arrow/python/util/datetime.h index 852f426..bd80d9f 100644 --- a/cpp/src/arrow/python/util/datetime.h +++ b/cpp/src/arrow/python/util/datetime.h @@ -33,7 +33,13 @@ static inline int64_t PyDate_to_ms(PyDateTime_Date* pydate) { epoch.tm_year = 70; epoch.tm_mday = 1; // Milliseconds since the epoch +#ifdef _MSC_VER + const int64_t current_timestamp = static_cast<int64_t>(_mkgmtime64(&date)); + const int64_t epoch_timestamp = static_cast<int64_t>(_mkgmtime64(&epoch)); + return (current_timestamp - epoch_timestamp) * 1000LL; +#else return lrint(difftime(mktime(&date), mktime(&epoch)) * 1000); +#endif } static inline int32_t PyDate_to_days(PyDateTime_Date* pydate) { http://git-wip-us.apache.org/repos/asf/arrow/blob/0bcb7852/python/DEVELOPMENT.md ---------------------------------------------------------------------- diff --git a/python/DEVELOPMENT.md b/python/DEVELOPMENT.md index 280314f..ca74462 100644 --- a/python/DEVELOPMENT.md +++ b/python/DEVELOPMENT.md @@ -14,6 +14,8 @@ ## Developer guide for conda users +### Linux and macOS + First, set up your thirdparty C++ toolchain using libraries from conda-forge: ```shell @@ -134,3 +136,49 @@ pyarrow/tests/test_tensor.py ................ ====================== 181 passed, 17 skipped in 0.98 seconds ======================= ``` + +### Windows + +First, make sure you can [build the C++ library][1]. + +Now, we need to build and install the C++ libraries someplace. + +```shell +mkdir cpp\build +cd cpp\build +set ARROW_HOME=C:\thirdparty +cmake -G "Visual Studio 14 2015 Win64" ^ + -DCMAKE_INSTALL_PREFIX=%ARROW_HOME% ^ + -DCMAKE_BUILD_TYPE=Release ^ + -DARROW_BUILD_TESTS=off ^ + -DARROW_PYTHON=on .. +cmake --build . --target INSTALL --config Release +cd ..\.. +``` + +After that, we must put the install directory's bin path in our `%PATH%`: + +```shell +set PATH=%ARROW_HOME%\bin;%PATH% +``` + +Now, we can build pyarrow: + +```shell +cd python +python setup.py build_ext --inplace +``` + +#### Running C++ unit tests with Python + +Getting `python-test.exe` to run is a bit tricky because your `%PYTHONPATH%` +must be configured given the active conda environment: + +```shell +set CONDA_ENV=C:\Users\wesm\Miniconda\envs\arrow-test +set PYTHONPATH=%CONDA_ENV%\Lib;%CONDA_ENV%\Lib\site-packages;%CONDA_ENV%\python35.zip;%CONDA_ENV%\DLLs;%CONDA_ENV% +``` + +Now `python-test.exe` or simply `ctest` (to run all tests) should work. + +[1]: https://github.com/apache/arrow/blob/master/cpp/doc/Windows.md \ No newline at end of file
