You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by we...@apache.org on 2017/04/17 21:46:18 UTC

arrow git commit: ARROW-734: [C++/Python] Support building PyArrow on MSVC

Repository: arrow
Updated Branches:
  refs/heads/master 312a66535 -> 7238d544c


ARROW-734: [C++/Python] Support building PyArrow on MSVC

Author: Wes McKinney <we...@twosigma.com>

Closes #553 from wesm/ARROW-734 and squashes the following commits:

6e00485 [Wes McKinney] Restore -undefined,dynamic_lookup linker logic on Linux for Python extensions
5be7e31 [Wes McKinney] do_import_numpy.h no longer needed
2d00e6b [Wes McKinney] Fix Unix library names
1e6bb6e [Wes McKinney] typos
8f4928e [Wes McKinney] More build fixes. Can now import pyarrow
5162203 [Wes McKinney] Remove unneeded exports
024579e [Wes McKinney] Wow, MSVC mangles the name CreateDirectory
990fdc2 [Wes McKinney] Install DLLs fixes in FindArrow.cmake
ccf941e [Wes McKinney] Restore CompilerInfo to original state
1e657ad [Wes McKinney] More fixes. Change TimeUnit to struct-based enum
2be93f0 [Wes McKinney] NumPy initialization / build fixes
1744f83 [Wes McKinney] Add new files
68e2d5b [Wes McKinney] Move NumPy API initialization into libarrow_python
0a2d387 [Wes McKinney] WIP MSVC support for PyArrow. Linker errors


Project: http://git-wip-us.apache.org/repos/asf/arrow/repo
Commit: http://git-wip-us.apache.org/repos/asf/arrow/commit/7238d544
Tree: http://git-wip-us.apache.org/repos/asf/arrow/tree/7238d544
Diff: http://git-wip-us.apache.org/repos/asf/arrow/diff/7238d544

Branch: refs/heads/master
Commit: 7238d544c1f0b05a393cdf68b2e2c9485bdb154e
Parents: 312a665
Author: Wes McKinney <we...@twosigma.com>
Authored: Mon Apr 17 17:46:11 2017 -0400
Committer: Wes McKinney <we...@twosigma.com>
Committed: Mon Apr 17 17:46:11 2017 -0400

----------------------------------------------------------------------
 cpp/cmake_modules/BuildUtils.cmake        |  4 +++
 cpp/cmake_modules/CompilerInfo.cmake      |  5 ++-
 cpp/cmake_modules/FindPythonLibsNew.cmake | 15 +++++---
 cpp/src/arrow/io/hdfs-internal.cc         |  2 +-
 cpp/src/arrow/io/hdfs-internal.h          |  2 +-
 cpp/src/arrow/io/hdfs.cc                  |  8 ++---
 cpp/src/arrow/io/hdfs.h                   |  2 +-
 cpp/src/arrow/io/io-hdfs-test.cc          |  8 ++---
 cpp/src/arrow/ipc/feather-internal.h      | 16 ++++-----
 cpp/src/arrow/ipc/feather.cc              |  8 ++---
 cpp/src/arrow/ipc/json-internal.cc        |  4 +--
 cpp/src/arrow/ipc/metadata.cc             |  8 ++---
 cpp/src/arrow/python/CMakeLists.txt       | 34 +++++++++---------
 cpp/src/arrow/python/builtin_convert.cc   |  3 +-
 cpp/src/arrow/python/builtin_convert.h    |  3 +-
 cpp/src/arrow/python/common.h             |  6 ++--
 cpp/src/arrow/python/config.cc            |  4 +--
 cpp/src/arrow/python/config.h             |  6 +---
 cpp/src/arrow/python/do_import_numpy.h    | 21 -----------
 cpp/src/arrow/python/helpers.cc           |  6 ++--
 cpp/src/arrow/python/helpers.h            | 12 +++----
 cpp/src/arrow/python/init.cc              | 34 ++++++++++++++++++
 cpp/src/arrow/python/init.h               | 35 +++++++++++++++++++
 cpp/src/arrow/python/io.h                 |  2 +-
 cpp/src/arrow/python/numpy-internal.h     |  7 ++--
 cpp/src/arrow/python/numpy_convert.cc     |  9 +++--
 cpp/src/arrow/python/numpy_convert.h      |  7 +++-
 cpp/src/arrow/python/numpy_interop.h      |  2 +-
 cpp/src/arrow/python/pandas_convert.cc    |  5 ++-
 cpp/src/arrow/python/pandas_convert.h     |  2 +-
 cpp/src/arrow/python/platform.h           | 32 +++++++++++++++++
 cpp/src/arrow/python/python-test.cc       |  2 +-
 cpp/src/arrow/python/type_traits.h        |  2 +-
 cpp/src/arrow/python/util/datetime.h      |  2 +-
 cpp/src/arrow/python/util/test_main.cc    |  7 ++--
 cpp/src/arrow/type.cc                     | 14 ++++----
 cpp/src/arrow/type.h                      | 32 +++++++++--------
 python/CMakeLists.txt                     | 34 +++++++++---------
 python/cmake_modules/CompilerInfo.cmake   | 48 --------------------------
 python/cmake_modules/FindArrow.cmake      | 25 ++++++++------
 python/cmake_modules/UseCython.cmake      |  8 +++--
 python/pyarrow/_config.pyx                | 11 ++----
 python/pyarrow/_io.pyx                    |  2 +-
 python/pyarrow/includes/common.pxd        |  3 +-
 python/pyarrow/includes/libarrow.pxd      |  4 +--
 python/setup.py                           | 28 ++++++++-------
 46 files changed, 289 insertions(+), 245 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/cmake_modules/BuildUtils.cmake
----------------------------------------------------------------------
diff --git a/cpp/cmake_modules/BuildUtils.cmake b/cpp/cmake_modules/BuildUtils.cmake
index 3a3b536..4e6532b 100644
--- a/cpp/cmake_modules/BuildUtils.cmake
+++ b/cpp/cmake_modules/BuildUtils.cmake
@@ -102,6 +102,8 @@ function(ADD_ARROW_LIB LIB_NAME)
   # Necessary to make static linking into other shared libraries work properly
   set_property(TARGET ${LIB_NAME}_objlib PROPERTY POSITION_INDEPENDENT_CODE 1)
 
+  set(RUNTIME_INSTALL_DIR bin)
+
   if (ARROW_BUILD_SHARED)
     add_library(${LIB_NAME}_shared SHARED $<TARGET_OBJECTS:${LIB_NAME}_objlib>)
 
@@ -139,6 +141,7 @@ function(ADD_ARROW_LIB LIB_NAME)
     endif()
 
     install(TARGETS ${LIB_NAME}_shared
+      RUNTIME DESTINATION ${RUNTIME_INSTALL_DIR}
       LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
       ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
   endif()
@@ -155,6 +158,7 @@ function(ADD_ARROW_LIB LIB_NAME)
       LINK_PRIVATE ${ARG_STATIC_PRIVATE_LINK_LIBS})
 
   install(TARGETS ${LIB_NAME}_static
+      RUNTIME DESTINATION ${RUNTIME_INSTALL_DIR}
       LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
       ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
   endif()

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/cmake_modules/CompilerInfo.cmake
----------------------------------------------------------------------
diff --git a/cpp/cmake_modules/CompilerInfo.cmake b/cpp/cmake_modules/CompilerInfo.cmake
index 079d9d1..3c60391 100644
--- a/cpp/cmake_modules/CompilerInfo.cmake
+++ b/cpp/cmake_modules/CompilerInfo.cmake
@@ -19,8 +19,8 @@
 # Sets COMPILER_VERSION to the version
 execute_process(COMMAND "${CMAKE_CXX_COMPILER}" -v
                 ERROR_VARIABLE COMPILER_VERSION_FULL)
-message(INFO " ${COMPILER_VERSION_FULL}")
-message(INFO " ${CMAKE_CXX_COMPILER_ID}")
+message(INFO "Compiler version: ${COMPILER_VERSION_FULL}")
+message(INFO "Compiler id: ${CMAKE_CXX_COMPILER_ID}")
 string(TOLOWER "${COMPILER_VERSION_FULL}" COMPILER_VERSION_FULL_LOWER)
 
 if(MSVC)
@@ -62,4 +62,3 @@ else()
   message(FATAL_ERROR "Unknown compiler. Version info:\n${COMPILER_VERSION_FULL}")
 endif()
 message("Selected compiler ${COMPILER_FAMILY} ${COMPILER_VERSION}")
-

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/cmake_modules/FindPythonLibsNew.cmake
----------------------------------------------------------------------
diff --git a/cpp/cmake_modules/FindPythonLibsNew.cmake b/cpp/cmake_modules/FindPythonLibsNew.cmake
index d9cc4b3..9610816 100644
--- a/cpp/cmake_modules/FindPythonLibsNew.cmake
+++ b/cpp/cmake_modules/FindPythonLibsNew.cmake
@@ -233,12 +233,17 @@ FUNCTION(PYTHON_ADD_MODULE _NAME )
       # segfaults, so do this dynamic lookup instead.
       SET_TARGET_PROPERTIES(${_NAME} PROPERTIES LINK_FLAGS
                           "-undefined dynamic_lookup")
+    ELSEIF(MSVC)
+      target_link_libraries(${_NAME} ${PYTHON_LIBRARIES})
     ELSE()
-     # In general, we should not link against libpython as we do not embed
-     # the Python interpreter. The python binary itself can then define where
-     # the symbols should loaded from.
-     SET_TARGET_PROPERTIES(${_NAME} PROPERTIES LINK_FLAGS
-         "-Wl,-undefined,dynamic_lookup")
+      # In general, we should not link against libpython as we do not embed the
+      # Python interpreter. The python binary itself can then define where the
+      # symbols should loaded from. For being manylinux1 compliant, one is not
+      # allowed to link to libpython. Partly because not all systems ship it,
+      # also because the interpreter ABI/API was not stable between patch
+      # releases for Python < 3.5.
+      SET_TARGET_PROPERTIES(${_NAME} PROPERTIES LINK_FLAGS
+        "-Wl,-undefined,dynamic_lookup")
     ENDIF()
     IF(PYTHON_MODULE_${_NAME}_BUILD_SHARED)
       SET_TARGET_PROPERTIES(${_NAME} PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}")

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/io/hdfs-internal.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/io/hdfs-internal.cc b/cpp/src/arrow/io/hdfs-internal.cc
index e4b2cd5..e67419b 100644
--- a/cpp/src/arrow/io/hdfs-internal.cc
+++ b/cpp/src/arrow/io/hdfs-internal.cc
@@ -409,7 +409,7 @@ int LibHdfsShim::SetWorkingDirectory(hdfsFS fs, const char* path) {
   }
 }
 
-int LibHdfsShim::CreateDirectory(hdfsFS fs, const char* path) {
+int LibHdfsShim::MakeDirectory(hdfsFS fs, const char* path) {
   return this->hdfsCreateDirectory(fs, path);
 }
 

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/io/hdfs-internal.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/io/hdfs-internal.h b/cpp/src/arrow/io/hdfs-internal.h
index 01cf149..c5ea397 100644
--- a/cpp/src/arrow/io/hdfs-internal.h
+++ b/cpp/src/arrow/io/hdfs-internal.h
@@ -173,7 +173,7 @@ struct LibHdfsShim {
 
   int SetWorkingDirectory(hdfsFS fs, const char* path);
 
-  int CreateDirectory(hdfsFS fs, const char* path);
+  int MakeDirectory(hdfsFS fs, const char* path);
 
   int SetReplication(hdfsFS fs, const char* path, int16_t replication);
 

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/io/hdfs.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/io/hdfs.cc b/cpp/src/arrow/io/hdfs.cc
index 3510ba1..a27e132 100644
--- a/cpp/src/arrow/io/hdfs.cc
+++ b/cpp/src/arrow/io/hdfs.cc
@@ -347,8 +347,8 @@ class HdfsClient::HdfsClientImpl {
     return Status::OK();
   }
 
-  Status CreateDirectory(const std::string& path) {
-    int ret = driver_->CreateDirectory(fs_, path.c_str());
+  Status MakeDirectory(const std::string& path) {
+    int ret = driver_->MakeDirectory(fs_, path.c_str());
     CHECK_FAILURE(ret, "create directory");
     return Status::OK();
   }
@@ -505,8 +505,8 @@ Status HdfsClient::Connect(
   return Status::OK();
 }
 
-Status HdfsClient::CreateDirectory(const std::string& path) {
-  return impl_->CreateDirectory(path);
+Status HdfsClient::MakeDirectory(const std::string& path) {
+  return impl_->MakeDirectory(path);
 }
 
 Status HdfsClient::Delete(const std::string& path, bool recursive) {

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/io/hdfs.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/io/hdfs.h b/cpp/src/arrow/io/hdfs.h
index e3f5442..f3de4a2 100644
--- a/cpp/src/arrow/io/hdfs.h
+++ b/cpp/src/arrow/io/hdfs.h
@@ -82,7 +82,7 @@ class ARROW_EXPORT HdfsClient : public FileSystemClient {
   //
   // @param path (in): absolute HDFS path
   // @returns Status
-  Status CreateDirectory(const std::string& path);
+  Status MakeDirectory(const std::string& path);
 
   // Delete file or directory
   // @param path: absolute path to data

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/io/io-hdfs-test.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/io/io-hdfs-test.cc b/cpp/src/arrow/io/io-hdfs-test.cc
index 0a9f5d9..0fdb897 100644
--- a/cpp/src/arrow/io/io-hdfs-test.cc
+++ b/cpp/src/arrow/io/io-hdfs-test.cc
@@ -45,7 +45,7 @@ class TestHdfsClient : public ::testing::Test {
     if (client_->Exists(scratch_dir_)) {
       RETURN_NOT_OK((client_->Delete(scratch_dir_, true)));
     }
-    return client_->CreateDirectory(scratch_dir_);
+    return client_->MakeDirectory(scratch_dir_);
   }
 
   Status WriteDummyFile(const std::string& path, const uint8_t* buffer, int64_t size,
@@ -161,14 +161,14 @@ TYPED_TEST(TestHdfsClient, ConnectsAgain) {
   ASSERT_OK(client->Disconnect());
 }
 
-TYPED_TEST(TestHdfsClient, CreateDirectory) {
+TYPED_TEST(TestHdfsClient, MakeDirectory) {
   SKIP_IF_NO_DRIVER();
 
   std::string path = this->ScratchPath("create-directory");
 
   if (this->client_->Exists(path)) { ASSERT_OK(this->client_->Delete(path, true)); }
 
-  ASSERT_OK(this->client_->CreateDirectory(path));
+  ASSERT_OK(this->client_->MakeDirectory(path));
   ASSERT_TRUE(this->client_->Exists(path));
   std::vector<HdfsPathInfo> listing;
   EXPECT_OK(this->client_->ListDirectory(path, &listing));
@@ -253,7 +253,7 @@ TYPED_TEST(TestHdfsClient, ListDirectory) {
   ASSERT_OK(this->MakeScratchDir());
   ASSERT_OK(this->WriteDummyFile(p1, data.data(), size));
   ASSERT_OK(this->WriteDummyFile(p2, data.data(), size / 2));
-  ASSERT_OK(this->client_->CreateDirectory(d1));
+  ASSERT_OK(this->client_->MakeDirectory(d1));
 
   std::vector<HdfsPathInfo> listing;
   ASSERT_OK(this->client_->ListDirectory(this->scratch_dir_, &listing));

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/ipc/feather-internal.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/ipc/feather-internal.h b/cpp/src/arrow/ipc/feather-internal.h
index 6847445..646c3b2 100644
--- a/cpp/src/arrow/ipc/feather-internal.h
+++ b/cpp/src/arrow/ipc/feather-internal.h
@@ -75,7 +75,7 @@ struct ARROW_EXPORT CategoryMetadata {
 };
 
 struct ARROW_EXPORT TimestampMetadata {
-  TimeUnit unit;
+  TimeUnit::type unit;
 
   // A timezone name known to the Olson timezone database. For display purposes
   // because the actual data is all UTC
@@ -83,7 +83,7 @@ struct ARROW_EXPORT TimestampMetadata {
 };
 
 struct ARROW_EXPORT TimeMetadata {
-  TimeUnit unit;
+  TimeUnit::type unit;
 };
 
 static constexpr const char* kFeatherMagicBytes = "FEA1";
@@ -156,12 +156,12 @@ static inline flatbuffers::Offset<fbs::PrimitiveArray> GetPrimitiveArray(
       array.length, array.null_count, array.total_bytes);
 }
 
-static inline fbs::TimeUnit ToFlatbufferEnum(TimeUnit unit) {
+static inline fbs::TimeUnit ToFlatbufferEnum(TimeUnit::type unit) {
   return static_cast<fbs::TimeUnit>(static_cast<int>(unit));
 }
 
-static inline TimeUnit FromFlatbufferEnum(fbs::TimeUnit unit) {
-  return static_cast<TimeUnit>(static_cast<int>(unit));
+static inline TimeUnit::type FromFlatbufferEnum(fbs::TimeUnit unit) {
+  return static_cast<TimeUnit::type>(static_cast<int>(unit));
 }
 
 // Convert Feather enums to Flatbuffer enums
@@ -197,10 +197,10 @@ class ARROW_EXPORT ColumnBuilder {
   void SetValues(const ArrayMetadata& values);
   void SetUserMetadata(const std::string& data);
   void SetCategory(const ArrayMetadata& levels, bool ordered = false);
-  void SetTimestamp(TimeUnit unit);
-  void SetTimestamp(TimeUnit unit, const std::string& timezone);
+  void SetTimestamp(TimeUnit::type unit);
+  void SetTimestamp(TimeUnit::type unit, const std::string& timezone);
   void SetDate();
-  void SetTime(TimeUnit unit);
+  void SetTime(TimeUnit::type unit);
   FBB& fbb();
 
  private:

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/ipc/feather.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/ipc/feather.cc b/cpp/src/arrow/ipc/feather.cc
index 5dc0396..7d0abdd 100644
--- a/cpp/src/arrow/ipc/feather.cc
+++ b/cpp/src/arrow/ipc/feather.cc
@@ -184,12 +184,12 @@ void ColumnBuilder::SetCategory(const ArrayMetadata& levels, bool ordered) {
   meta_category_.ordered = ordered;
 }
 
-void ColumnBuilder::SetTimestamp(TimeUnit unit) {
+void ColumnBuilder::SetTimestamp(TimeUnit::type unit) {
   type_ = ColumnType::TIMESTAMP;
   meta_timestamp_.unit = unit;
 }
 
-void ColumnBuilder::SetTimestamp(TimeUnit unit, const std::string& timezone) {
+void ColumnBuilder::SetTimestamp(TimeUnit::type unit, const std::string& timezone) {
   SetTimestamp(unit);
   meta_timestamp_.timezone = timezone;
 }
@@ -198,7 +198,7 @@ void ColumnBuilder::SetDate() {
   type_ = ColumnType::DATE;
 }
 
-void ColumnBuilder::SetTime(TimeUnit unit) {
+void ColumnBuilder::SetTime(TimeUnit::type unit) {
   type_ = ColumnType::TIME;
   meta_time_.unit = unit;
 }
@@ -279,7 +279,7 @@ class TableReader::TableReaderImpl {
       }
       case fbs::TypeMetadata_TimestampMetadata: {
         auto meta = static_cast<const fbs::TimestampMetadata*>(metadata);
-        TimeUnit unit = FromFlatbufferEnum(meta->unit());
+        TimeUnit::type unit = FromFlatbufferEnum(meta->unit());
         std::string tz;
         // flatbuffer non-null
         if (meta->timezone() != 0) {

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/ipc/json-internal.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/ipc/json-internal.cc b/cpp/src/arrow/ipc/json-internal.cc
index 18ee834..2ab3acb 100644
--- a/cpp/src/arrow/ipc/json-internal.cc
+++ b/cpp/src/arrow/ipc/json-internal.cc
@@ -77,7 +77,7 @@ static std::string GetFloatingPrecisionName(FloatingPoint::Precision precision)
   return "UNKNOWN";
 }
 
-static std::string GetTimeUnitName(TimeUnit unit) {
+static std::string GetTimeUnitName(TimeUnit::type unit) {
   switch (unit) {
     case TimeUnit::SECOND:
       return "SECOND";
@@ -645,7 +645,7 @@ static Status GetTimestamp(const RjObject& json_type, std::shared_ptr<DataType>*
 
   std::string unit_str = json_unit->value.GetString();
 
-  TimeUnit unit;
+  TimeUnit::type unit;
   if (unit_str == "SECOND") {
     unit = TimeUnit::SECOND;
   } else if (unit_str == "MILLISECOND") {

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/ipc/metadata.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/ipc/metadata.cc b/cpp/src/arrow/ipc/metadata.cc
index ee21156..791948b 100644
--- a/cpp/src/arrow/ipc/metadata.cc
+++ b/cpp/src/arrow/ipc/metadata.cc
@@ -188,7 +188,7 @@ static Status UnionToFlatBuffer(FBB& fbb, const std::shared_ptr<DataType>& type,
   *offset = IntToFlatbuffer(fbb, BIT_WIDTH, IS_SIGNED); \
   break;
 
-static inline flatbuf::TimeUnit ToFlatbufferUnit(TimeUnit unit) {
+static inline flatbuf::TimeUnit ToFlatbufferUnit(TimeUnit::type unit) {
   switch (unit) {
     case TimeUnit::SECOND:
       return flatbuf::TimeUnit_SECOND;
@@ -204,7 +204,7 @@ static inline flatbuf::TimeUnit ToFlatbufferUnit(TimeUnit unit) {
   return flatbuf::TimeUnit_MIN;
 }
 
-static inline TimeUnit FromFlatbufferUnit(flatbuf::TimeUnit unit) {
+static inline TimeUnit::type FromFlatbufferUnit(flatbuf::TimeUnit unit) {
   switch (unit) {
     case flatbuf::TimeUnit_SECOND:
       return TimeUnit::SECOND;
@@ -258,7 +258,7 @@ static Status TypeFromFlatbuffer(flatbuf::Type type, const void* type_data,
     }
     case flatbuf::Type_Time: {
       auto time_type = static_cast<const flatbuf::Time*>(type_data);
-      TimeUnit unit = FromFlatbufferUnit(time_type->unit());
+      TimeUnit::type unit = FromFlatbufferUnit(time_type->unit());
       int32_t bit_width = time_type->bitWidth();
       switch (unit) {
         case TimeUnit::SECOND:
@@ -279,7 +279,7 @@ static Status TypeFromFlatbuffer(flatbuf::Type type, const void* type_data,
     }
     case flatbuf::Type_Timestamp: {
       auto ts_type = static_cast<const flatbuf::Timestamp*>(type_data);
-      TimeUnit unit = FromFlatbufferUnit(ts_type->unit());
+      TimeUnit::type unit = FromFlatbufferUnit(ts_type->unit());
       if (ts_type->timezone() != 0 && ts_type->timezone()->Length() > 0) {
         *out = timestamp(unit, ts_type->timezone()->str());
       } else {

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/CMakeLists.txt b/cpp/src/arrow/python/CMakeLists.txt
index 8f7991e..607a1c4 100644
--- a/cpp/src/arrow/python/CMakeLists.txt
+++ b/cpp/src/arrow/python/CMakeLists.txt
@@ -17,18 +17,18 @@ if (ARROW_BUILD_TESTS)
   add_library(arrow_python_test_main STATIC
 	util/test_main.cc)
 
+  target_link_libraries(arrow_python_test_main
+    gtest)
+
   if (APPLE)
 	target_link_libraries(arrow_python_test_main
-      gtest
-      dl)
+      ${CMAKE_DL_LIBS})
 	set_target_properties(arrow_python_test_main
       PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
-  else()
+  elseif(NOT MSVC)
 	target_link_libraries(arrow_python_test_main
-      gtest
       pthread
-      dl
-	  )
+      ${CMAKE_DL_LIBS})
   endif()
 endif()
 
@@ -38,12 +38,6 @@ set(ARROW_PYTHON_MIN_TEST_LIBS
   arrow_static
   ${BOOST_REGEX_LIBRARY})
 
-if(ARROW_BUILD_TESTS)
-  ADD_THIRDPARTY_LIB(python
-    SHARED_LIB "${PYTHON_LIBRARIES}")
-  list(APPEND ARROW_PYTHON_MIN_TEST_LIBS python)
-endif()
-
 set(ARROW_PYTHON_TEST_LINK_LIBS ${ARROW_PYTHON_MIN_TEST_LIBS})
 
 # ----------------------------------------------------------------------
@@ -53,6 +47,7 @@ set(ARROW_PYTHON_SRCS
   common.cc
   config.cc
   helpers.cc
+  init.cc
   io.cc
   numpy_convert.cc
   pandas_convert.cc
@@ -66,9 +61,14 @@ ADD_ARROW_LIB(arrow_python
   SOURCES ${ARROW_PYTHON_SRCS}
   SHARED_LINK_FLAGS ""
   SHARED_LINK_LIBS ${ARROW_PYTHON_SHARED_LINK_LIBS}
-  STATIC_LINK_LIBS ${ARROW_IO_SHARED_PRIVATE_LINK_LIBS}
+  STATIC_LINK_LIBS ""
 )
 
+if (MSVC)
+  target_link_libraries(arrow_python_shared
+    ${PYTHON_LIBRARIES})
+endif()
+
 if ("${COMPILER_FAMILY}" STREQUAL "clang")
   # Clang, be quiet. Python C API has lots of macros
   set_property(SOURCE ${ARROW_PYTHON_SRCS}
@@ -82,19 +82,19 @@ install(FILES
   builtin_convert.h
   common.h
   config.h
-  do_import_numpy.h
   helpers.h
+  init.h
   io.h
   numpy_convert.h
   numpy_interop.h
   pandas_convert.h
+  platform.h
   type_traits.h
   DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/arrow/python")
 
-# set_target_properties(arrow_python_shared PROPERTIES
-#     INSTALL_RPATH "\$ORIGIN")
-
 if (ARROW_BUILD_TESTS)
   ADD_ARROW_TEST(python-test
     STATIC_LINK_LIBS "${ARROW_PYTHON_TEST_LINK_LIBS}")
+  target_link_libraries(python-test
+    ${PYTHON_LIBRARIES})
 endif()

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/builtin_convert.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/builtin_convert.cc b/cpp/src/arrow/python/builtin_convert.cc
index 8cc9876..137937c 100644
--- a/cpp/src/arrow/python/builtin_convert.cc
+++ b/cpp/src/arrow/python/builtin_convert.cc
@@ -15,7 +15,8 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include <Python.h>
+#include "arrow/python/platform.h"
+
 #include <datetime.h>
 
 #include <algorithm>

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/builtin_convert.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/builtin_convert.h b/cpp/src/arrow/python/builtin_convert.h
index 2141c25..a6180d4 100644
--- a/cpp/src/arrow/python/builtin_convert.h
+++ b/cpp/src/arrow/python/builtin_convert.h
@@ -21,13 +21,12 @@
 #ifndef ARROW_PYTHON_ADAPTERS_BUILTIN_H
 #define ARROW_PYTHON_ADAPTERS_BUILTIN_H
 
-#include <Python.h>
+#include "arrow/python/platform.h"
 
 #include <memory>
 #include <string>
 
 #include "arrow/type.h"
-
 #include "arrow/util/visibility.h"
 
 #include "arrow/python/common.h"

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/common.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/common.h b/cpp/src/arrow/python/common.h
index a6806ab..882bb15 100644
--- a/cpp/src/arrow/python/common.h
+++ b/cpp/src/arrow/python/common.h
@@ -32,7 +32,7 @@ class MemoryPool;
 
 namespace py {
 
-class PyAcquireGIL {
+class ARROW_EXPORT PyAcquireGIL {
  public:
   PyAcquireGIL() { state_ = PyGILState_Ensure(); }
 
@@ -45,7 +45,7 @@ class PyAcquireGIL {
 
 #define PYARROW_IS_PY2 PY_MAJOR_VERSION <= 2
 
-class OwnedRef {
+class ARROW_EXPORT OwnedRef {
  public:
   OwnedRef() : obj_(nullptr) {}
 
@@ -70,7 +70,7 @@ class OwnedRef {
   PyObject* obj_;
 };
 
-struct PyObjectStringify {
+struct ARROW_EXPORT PyObjectStringify {
   OwnedRef tmp_obj;
   const char* bytes;
   Py_ssize_t size;

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/config.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/config.cc b/cpp/src/arrow/python/config.cc
index c2a6916..3cec7c4 100644
--- a/cpp/src/arrow/python/config.cc
+++ b/cpp/src/arrow/python/config.cc
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include <Python.h>
+#include "arrow/python/platform.h"
 #include <datetime.h>
 
 #include "arrow/python/config.h"
@@ -23,8 +23,6 @@
 namespace arrow {
 namespace py {
 
-void Init() {}
-
 PyObject* numpy_nan = nullptr;
 
 void set_numpy_nan(PyObject* obj) {

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/config.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/config.h b/cpp/src/arrow/python/config.h
index c132726..c2b089d 100644
--- a/cpp/src/arrow/python/config.h
+++ b/cpp/src/arrow/python/config.h
@@ -18,8 +18,7 @@
 #ifndef ARROW_PYTHON_CONFIG_H
 #define ARROW_PYTHON_CONFIG_H
 
-#include <iostream>
-#include <Python.h>
+#include "arrow/python/platform.h"
 
 #include "arrow/python/numpy_interop.h"
 #include "arrow/util/visibility.h"
@@ -35,9 +34,6 @@ ARROW_EXPORT
 extern PyObject* numpy_nan;
 
 ARROW_EXPORT
-void Init();
-
-ARROW_EXPORT
 void set_numpy_nan(PyObject* obj);
 
 }  // namespace py

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/do_import_numpy.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/do_import_numpy.h b/cpp/src/arrow/python/do_import_numpy.h
deleted file mode 100644
index bb4a382..0000000
--- a/cpp/src/arrow/python/do_import_numpy.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-// Trick borrowed from dynd-python for initializing the NumPy array API
-
-// Trigger the array import (inversion of NO_IMPORT_ARRAY)
-#define NUMPY_IMPORT_ARRAY

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/helpers.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/helpers.cc b/cpp/src/arrow/python/helpers.cc
index 3d3d07a..f7c73a8 100644
--- a/cpp/src/arrow/python/helpers.cc
+++ b/cpp/src/arrow/python/helpers.cc
@@ -92,11 +92,11 @@ Status PythonDecimalToArrowDecimal(
   return FromString(c_string, arrow_decimal);
 }
 
-template Status PythonDecimalToArrowDecimal(
+template Status ARROW_TEMPLATE_EXPORT PythonDecimalToArrowDecimal(
     PyObject* python_decimal, decimal::Decimal32* arrow_decimal);
-template Status PythonDecimalToArrowDecimal(
+template Status ARROW_TEMPLATE_EXPORT PythonDecimalToArrowDecimal(
     PyObject* python_decimal, decimal::Decimal64* arrow_decimal);
-template Status PythonDecimalToArrowDecimal(
+template Status ARROW_TEMPLATE_EXPORT PythonDecimalToArrowDecimal(
     PyObject* python_decimal, decimal::Decimal128* arrow_decimal);
 
 Status InferDecimalPrecisionAndScale(

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/helpers.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/helpers.h b/cpp/src/arrow/python/helpers.h
index 77fde26..c6402d8 100644
--- a/cpp/src/arrow/python/helpers.h
+++ b/cpp/src/arrow/python/helpers.h
@@ -18,7 +18,7 @@
 #ifndef PYARROW_HELPERS_H
 #define PYARROW_HELPERS_H
 
-#include <Python.h>
+#include "arrow/python/platform.h"
 
 #include <memory>
 #include <string>
@@ -42,18 +42,18 @@ class OwnedRef;
 
 ARROW_EXPORT std::shared_ptr<DataType> GetPrimitiveType(Type::type type);
 
-Status ImportModule(const std::string& module_name, OwnedRef* ref);
-Status ImportFromModule(
+Status ARROW_EXPORT ImportModule(const std::string& module_name, OwnedRef* ref);
+Status ARROW_EXPORT ImportFromModule(
     const OwnedRef& module, const std::string& module_name, OwnedRef* ref);
 
 template <typename T>
-Status PythonDecimalToArrowDecimal(
+Status ARROW_EXPORT PythonDecimalToArrowDecimal(
     PyObject* python_decimal, decimal::Decimal<T>* arrow_decimal);
 
-Status InferDecimalPrecisionAndScale(
+Status ARROW_EXPORT InferDecimalPrecisionAndScale(
     PyObject* python_decimal, int* precision = nullptr, int* scale = nullptr);
 
-Status DecimalFromString(
+Status ARROW_EXPORT DecimalFromString(
     PyObject* decimal_constructor, const std::string& decimal_string, PyObject** out);
 
 }  // namespace py

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/init.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/init.cc b/cpp/src/arrow/python/init.cc
new file mode 100644
index 0000000..fa70af7
--- /dev/null
+++ b/cpp/src/arrow/python/init.cc
@@ -0,0 +1,34 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#include "arrow/python/platform.h"
+
+// Trigger the array import (inversion of NO_IMPORT_ARRAY)
+#define NUMPY_IMPORT_ARRAY
+
+#include "arrow/python/init.h"
+#include "arrow/python/numpy_interop.h"
+
+namespace arrow {
+namespace py {
+
+void InitNumPy() {
+  import_numpy();
+}
+
+}  // namespace py
+}  // namespace arrow

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/init.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/init.h b/cpp/src/arrow/python/init.h
new file mode 100644
index 0000000..a2533d8
--- /dev/null
+++ b/cpp/src/arrow/python/init.h
@@ -0,0 +1,35 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+#ifndef ARROW_PYTHON_INIT_H
+#define ARROW_PYTHON_INIT_H
+
+#include "arrow/python/platform.h"
+
+#include "arrow/python/numpy_interop.h"
+#include "arrow/util/visibility.h"
+
+namespace arrow {
+namespace py {
+
+ARROW_EXPORT
+void InitNumPy();
+
+}  // namespace py
+}  // namespace arrow
+
+#endif  // ARROW_PYTHON_INIT_H

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/io.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/io.h b/cpp/src/arrow/python/io.h
index 905bd6c..bf14cd6 100644
--- a/cpp/src/arrow/python/io.h
+++ b/cpp/src/arrow/python/io.h
@@ -34,7 +34,7 @@ namespace py {
 
 // A common interface to a Python file-like object. Must acquire GIL before
 // calling any methods
-class PythonFile {
+class ARROW_EXPORT PythonFile {
  public:
   explicit PythonFile(PyObject* file);
   ~PythonFile();

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/numpy-internal.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/numpy-internal.h b/cpp/src/arrow/python/numpy-internal.h
index fcc6a58..f1ef7da 100644
--- a/cpp/src/arrow/python/numpy-internal.h
+++ b/cpp/src/arrow/python/numpy-internal.h
@@ -20,12 +20,11 @@
 #ifndef ARROW_PYTHON_NUMPY_INTERNAL_H
 #define ARROW_PYTHON_NUMPY_INTERNAL_H
 
-#include <Python.h>
+#include "arrow/python/numpy_interop.h"
 
-#include <cstdint>
+#include "arrow/python/platform.h"
 
-#include "arrow/python/numpy_convert.h"
-#include "arrow/python/numpy_interop.h"
+#include <cstdint>
 
 namespace arrow {
 namespace py {

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/numpy_convert.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/numpy_convert.cc b/cpp/src/arrow/python/numpy_convert.cc
index ab79e17..2c1a591 100644
--- a/cpp/src/arrow/python/numpy_convert.cc
+++ b/cpp/src/arrow/python/numpy_convert.cc
@@ -15,10 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include <Python.h>
+#include "arrow/python/numpy_interop.h"
 
 #include "arrow/python/numpy_convert.h"
-#include "arrow/python/numpy_interop.h"
 
 #include <cstdint>
 #include <memory>
@@ -38,8 +37,8 @@ namespace py {
 
 bool is_contiguous(PyObject* array) {
   if (PyArray_Check(array)) {
-    return PyArray_FLAGS(reinterpret_cast<PyArrayObject*>(array)) &
-           (NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_F_CONTIGUOUS);
+    return (PyArray_FLAGS(reinterpret_cast<PyArrayObject*>(array)) &
+               (NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_F_CONTIGUOUS)) != 0;
   } else {
     return false;
   }
@@ -167,7 +166,7 @@ Status NumPyDtypeToArrow(PyObject* dtype, std::shared_ptr<DataType>* out) {
     case NPY_DATETIME: {
       auto date_dtype =
           reinterpret_cast<PyArray_DatetimeDTypeMetaData*>(descr->c_metadata);
-      TimeUnit unit;
+      TimeUnit::type unit;
       switch (date_dtype->meta.base) {
         case NPY_FR_s:
           unit = TimeUnit::SECOND;

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/numpy_convert.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/numpy_convert.h b/cpp/src/arrow/python/numpy_convert.h
index c252640..a486646 100644
--- a/cpp/src/arrow/python/numpy_convert.h
+++ b/cpp/src/arrow/python/numpy_convert.h
@@ -21,7 +21,7 @@
 #ifndef ARROW_PYTHON_NUMPY_CONVERT_H
 #define ARROW_PYTHON_NUMPY_CONVERT_H
 
-#include <Python.h>
+#include "arrow/python/platform.h"
 
 #include <memory>
 #include <string>
@@ -48,14 +48,19 @@ class ARROW_EXPORT NumPyBuffer : public Buffer {
 };
 
 // Handle misbehaved types like LONGLONG and ULONGLONG
+ARROW_EXPORT
 int cast_npy_type_compat(int type_num);
 
+ARROW_EXPORT
 bool is_contiguous(PyObject* array);
 
 ARROW_EXPORT
 Status NumPyDtypeToArrow(PyObject* dtype, std::shared_ptr<DataType>* out);
 
+ARROW_EXPORT
 Status GetTensorType(PyObject* dtype, std::shared_ptr<DataType>* out);
+
+ARROW_EXPORT
 Status GetNumPyType(const DataType& type, int* type_num);
 
 ARROW_EXPORT Status NdarrayToTensor(

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/numpy_interop.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/numpy_interop.h b/cpp/src/arrow/python/numpy_interop.h
index 0a4b425..b93200c 100644
--- a/cpp/src/arrow/python/numpy_interop.h
+++ b/cpp/src/arrow/python/numpy_interop.h
@@ -18,7 +18,7 @@
 #ifndef PYARROW_NUMPY_INTEROP_H
 #define PYARROW_NUMPY_INTEROP_H
 
-#include <Python.h>
+#include "arrow/python/platform.h"
 
 #include <numpy/numpyconfig.h>
 

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/pandas_convert.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/pandas_convert.cc b/cpp/src/arrow/python/pandas_convert.cc
index 5cdcb6f..636a3fd 100644
--- a/cpp/src/arrow/python/pandas_convert.cc
+++ b/cpp/src/arrow/python/pandas_convert.cc
@@ -17,9 +17,8 @@
 
 // Functions for pandas conversion via NumPy
 
-#include <Python.h>
-
 #include "arrow/python/numpy_interop.h"
+
 #include "arrow/python/pandas_convert.h"
 
 #include <algorithm>
@@ -490,7 +489,7 @@ struct UnboxDate {};
 
 template <>
 struct UnboxDate<Date32Type> {
-  static int64_t Unbox(PyObject* obj) {
+  static int32_t Unbox(PyObject* obj) {
     return PyDate_to_days(reinterpret_cast<PyDateTime_Date*>(obj));
   }
 };

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/pandas_convert.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/pandas_convert.h b/cpp/src/arrow/python/pandas_convert.h
index fd901d8..45c8a1a 100644
--- a/cpp/src/arrow/python/pandas_convert.h
+++ b/cpp/src/arrow/python/pandas_convert.h
@@ -21,7 +21,7 @@
 #ifndef ARROW_PYTHON_ADAPTERS_PANDAS_H
 #define ARROW_PYTHON_ADAPTERS_PANDAS_H
 
-#include <Python.h>
+#include "arrow/python/platform.h"
 
 #include <memory>
 #include <string>

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/platform.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/platform.h b/cpp/src/arrow/python/platform.h
new file mode 100644
index 0000000..38f8e0f
--- /dev/null
+++ b/cpp/src/arrow/python/platform.h
@@ -0,0 +1,32 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+// Functions for converting between pandas's NumPy-based data representation
+// and Arrow data structures
+
+#ifndef ARROW_PYTHON_PLATFORM_H
+#define ARROW_PYTHON_PLATFORM_H
+
+#include <Python.h>
+#include <iostream>
+
+// Work around C2528 error
+#if _MSC_VER >= 1900
+#undef timezone
+#endif
+
+#endif  // ARROW_PYTHON_PLATFORM_H

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/python-test.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/python-test.cc b/cpp/src/arrow/python/python-test.cc
index a4a11c0..cbc9377 100644
--- a/cpp/src/arrow/python/python-test.cc
+++ b/cpp/src/arrow/python/python-test.cc
@@ -19,7 +19,7 @@
 
 #include <memory>
 
-#include <Python.h>
+#include "arrow/python/platform.h"
 
 #include "arrow/array.h"
 #include "arrow/builder.h"

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/type_traits.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/type_traits.h b/cpp/src/arrow/python/type_traits.h
index c464d65..26b15bd 100644
--- a/cpp/src/arrow/python/type_traits.h
+++ b/cpp/src/arrow/python/type_traits.h
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include <Python.h>
+#include "arrow/python/platform.h"
 
 #include <cstdint>
 #include <limits>

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/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 82cf6fc..852f426 100644
--- a/cpp/src/arrow/python/util/datetime.h
+++ b/cpp/src/arrow/python/util/datetime.h
@@ -18,7 +18,7 @@
 #ifndef PYARROW_UTIL_DATETIME_H
 #define PYARROW_UTIL_DATETIME_H
 
-#include <Python.h>
+#include "arrow/python/platform.h"
 #include <datetime.h>
 
 namespace arrow {

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/python/util/test_main.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/python/util/test_main.cc b/cpp/src/arrow/python/util/test_main.cc
index c83514d..c24da40 100644
--- a/cpp/src/arrow/python/util/test_main.cc
+++ b/cpp/src/arrow/python/util/test_main.cc
@@ -15,18 +15,17 @@
 // specific language governing permissions and limitations
 // under the License.
 
-#include <Python.h>
+#include "arrow/python/platform.h"
 
 #include <gtest/gtest.h>
 
-#include "arrow/python/do_import_numpy.h"
-#include "arrow/python/numpy_interop.h"
+#include "arrow/python/init.h"
 
 int main(int argc, char** argv) {
   ::testing::InitGoogleTest(&argc, argv);
 
   Py_Initialize();
-  arrow::py::import_numpy();
+  arrow::py::InitNumPy();
 
   int ret = RUN_ALL_TESTS();
 

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/type.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/type.cc b/cpp/src/arrow/type.cc
index a2300d6..2e454ae 100644
--- a/cpp/src/arrow/type.cc
+++ b/cpp/src/arrow/type.cc
@@ -134,10 +134,10 @@ std::string Date32Type::ToString() const {
 // ----------------------------------------------------------------------
 // Time types
 
-TimeType::TimeType(Type::type type_id, TimeUnit unit)
+TimeType::TimeType(Type::type type_id, TimeUnit::type unit)
     : FixedWidthType(type_id), unit_(unit) {}
 
-Time32Type::Time32Type(TimeUnit unit) : TimeType(Type::TIME32, unit) {
+Time32Type::Time32Type(TimeUnit::type unit) : TimeType(Type::TIME32, unit) {
   DCHECK(unit == TimeUnit::SECOND || unit == TimeUnit::MILLI)
       << "Must be seconds or milliseconds";
 }
@@ -148,7 +148,7 @@ std::string Time32Type::ToString() const {
   return ss.str();
 }
 
-Time64Type::Time64Type(TimeUnit unit) : TimeType(Type::TIME64, unit) {
+Time64Type::Time64Type(TimeUnit::type unit) : TimeType(Type::TIME64, unit) {
   DCHECK(unit == TimeUnit::MICRO || unit == TimeUnit::NANO)
       << "Must be microseconds or nanoseconds";
 }
@@ -338,19 +338,19 @@ std::shared_ptr<DataType> fixed_size_binary(int32_t byte_width) {
   return std::make_shared<FixedSizeBinaryType>(byte_width);
 }
 
-std::shared_ptr<DataType> timestamp(TimeUnit unit) {
+std::shared_ptr<DataType> timestamp(TimeUnit::type unit) {
   return std::make_shared<TimestampType>(unit);
 }
 
-std::shared_ptr<DataType> timestamp(TimeUnit unit, const std::string& timezone) {
+std::shared_ptr<DataType> timestamp(TimeUnit::type unit, const std::string& timezone) {
   return std::make_shared<TimestampType>(unit, timezone);
 }
 
-std::shared_ptr<DataType> time32(TimeUnit unit) {
+std::shared_ptr<DataType> time32(TimeUnit::type unit) {
   return std::make_shared<Time32Type>(unit);
 }
 
-std::shared_ptr<DataType> time64(TimeUnit unit) {
+std::shared_ptr<DataType> time64(TimeUnit::type unit) {
   return std::make_shared<Time64Type>(unit);
 }
 

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/cpp/src/arrow/type.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/type.h b/cpp/src/arrow/type.h
index 6810b35..ea4ea03 100644
--- a/cpp/src/arrow/type.h
+++ b/cpp/src/arrow/type.h
@@ -538,9 +538,11 @@ class ARROW_EXPORT Date64Type : public DateType {
   static std::string name() { return "date"; }
 };
 
-enum class TimeUnit : char { SECOND = 0, MILLI = 1, MICRO = 2, NANO = 3 };
+struct TimeUnit {
+  enum type { SECOND = 0, MILLI = 1, MICRO = 2, NANO = 3 };
+};
 
-static inline std::ostream& operator<<(std::ostream& os, TimeUnit unit) {
+static inline std::ostream& operator<<(std::ostream& os, TimeUnit::type unit) {
   switch (unit) {
     case TimeUnit::SECOND:
       os << "s";
@@ -560,11 +562,11 @@ static inline std::ostream& operator<<(std::ostream& os, TimeUnit unit) {
 
 class ARROW_EXPORT TimeType : public FixedWidthType {
  public:
-  TimeUnit unit() const { return unit_; }
+  TimeUnit::type unit() const { return unit_; }
 
  protected:
-  TimeType(Type::type type_id, TimeUnit unit);
-  TimeUnit unit_;
+  TimeType(Type::type type_id, TimeUnit::type unit);
+  TimeUnit::type unit_;
 };
 
 class ARROW_EXPORT Time32Type : public TimeType {
@@ -574,7 +576,7 @@ class ARROW_EXPORT Time32Type : public TimeType {
 
   int bit_width() const override { return static_cast<int>(sizeof(c_type) * CHAR_BIT); }
 
-  explicit Time32Type(TimeUnit unit = TimeUnit::MILLI);
+  explicit Time32Type(TimeUnit::type unit = TimeUnit::MILLI);
 
   Status Accept(TypeVisitor* visitor) const override;
   std::string ToString() const override;
@@ -587,7 +589,7 @@ class ARROW_EXPORT Time64Type : public TimeType {
 
   int bit_width() const override { return static_cast<int>(sizeof(c_type) * CHAR_BIT); }
 
-  explicit Time64Type(TimeUnit unit = TimeUnit::MILLI);
+  explicit Time64Type(TimeUnit::type unit = TimeUnit::MILLI);
 
   Status Accept(TypeVisitor* visitor) const override;
   std::string ToString() const override;
@@ -602,21 +604,21 @@ class ARROW_EXPORT TimestampType : public FixedWidthType {
 
   int bit_width() const override { return static_cast<int>(sizeof(int64_t) * CHAR_BIT); }
 
-  explicit TimestampType(TimeUnit unit = TimeUnit::MILLI)
+  explicit TimestampType(TimeUnit::type unit = TimeUnit::MILLI)
       : FixedWidthType(Type::TIMESTAMP), unit_(unit) {}
 
-  explicit TimestampType(TimeUnit unit, const std::string& timezone)
+  explicit TimestampType(TimeUnit::type unit, const std::string& timezone)
       : FixedWidthType(Type::TIMESTAMP), unit_(unit), timezone_(timezone) {}
 
   Status Accept(TypeVisitor* visitor) const override;
   std::string ToString() const override;
   static std::string name() { return "timestamp"; }
 
-  TimeUnit unit() const { return unit_; }
+  TimeUnit::type unit() const { return unit_; }
   const std::string& timezone() const { return timezone_; }
 
  private:
-  TimeUnit unit_;
+  TimeUnit::type unit_;
   std::string timezone_;
 };
 
@@ -710,15 +712,15 @@ std::shared_ptr<DataType> ARROW_EXPORT fixed_size_binary(int32_t byte_width);
 std::shared_ptr<DataType> ARROW_EXPORT list(const std::shared_ptr<Field>& value_type);
 std::shared_ptr<DataType> ARROW_EXPORT list(const std::shared_ptr<DataType>& value_type);
 
-std::shared_ptr<DataType> ARROW_EXPORT timestamp(TimeUnit unit);
+std::shared_ptr<DataType> ARROW_EXPORT timestamp(TimeUnit::type unit);
 std::shared_ptr<DataType> ARROW_EXPORT timestamp(
-    TimeUnit unit, const std::string& timezone);
+    TimeUnit::type unit, const std::string& timezone);
 
 /// Unit can be either SECOND or MILLI
-std::shared_ptr<DataType> ARROW_EXPORT time32(TimeUnit unit);
+std::shared_ptr<DataType> ARROW_EXPORT time32(TimeUnit::type unit);
 
 /// Unit can be either MICRO or NANO
-std::shared_ptr<DataType> ARROW_EXPORT time64(TimeUnit unit);
+std::shared_ptr<DataType> ARROW_EXPORT time64(TimeUnit::type unit);
 
 std::shared_ptr<DataType> ARROW_EXPORT struct_(
     const std::vector<std::shared_ptr<Field>>& fields);

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/python/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt
index 36052bc..c1431af 100644
--- a/python/CMakeLists.txt
+++ b/python/CMakeLists.txt
@@ -28,7 +28,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/../cpp/cmake_mod
 
 include(CMakeParseArguments)
 
-set(BUILD_SUPPORT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../cpp/build-support)
+set(BUILD_SUPPORT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../cpp/build-support")
 
 # Allow "make install" to not depend on all targets.
 #
@@ -58,10 +58,6 @@ if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
     OFF)
 endif()
 
-if(NOT PYARROW_BUILD_TESTS)
-  set(NO_TESTS 1)
-endif()
-
 find_program(CCACHE_FOUND ccache)
 if(CCACHE_FOUND)
   set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
@@ -73,18 +69,19 @@ endif(CCACHE_FOUND)
 ############################################################
 
 include(BuildUtils)
-include(CompilerInfo)
 include(SetupCxxFlags)
+include(CompilerInfo)
 
 # Add common flags
 set(CMAKE_CXX_FLAGS "${CXX_COMMON_FLAGS} ${CMAKE_CXX_FLAGS}")
 
-# Enable perf and other tools to work properly
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
-
-# Suppress Cython warnings
-set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-variable")
+if (NOT MSVC)
+  # Enable perf and other tools to work properly
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
 
+  # Suppress Cython warnings
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-variable")
+endif()
 
 if ("${COMPILER_FAMILY}" STREQUAL "clang")
   # Using Clang with ccache causes a bunch of spurious warnings that are
@@ -146,9 +143,10 @@ endif()
 #
 # The gold linker is only for ELF binaries, which OSX doesn't use. We can
 # just skip.
-if (NOT APPLE)
+if (NOT APPLE AND NOT MSVC)
   execute_process(COMMAND ${CMAKE_CXX_COMPILER} -Wl,--version OUTPUT_VARIABLE LINKER_OUTPUT)
 endif ()
+
 if (LINKER_OUTPUT MATCHES "gold")
   if ("${PYARROW_LINK}" STREQUAL "d" AND
       "${CMAKE_BUILD_TYPE}" STREQUAL "RELEASE")
@@ -166,9 +164,6 @@ endif()
 # act on its value.
 if ("${PYARROW_LINK}" STREQUAL "d")
   set(BUILD_SHARED_LIBS ON)
-
-  # Position independent code is only necessary when producing shared objects.
-  add_definitions(-fPIC)
 endif()
 
 # set compile output directory
@@ -188,9 +183,16 @@ if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
 EXECUTE_PROCESS(COMMAND ln ${MORE_ARGS} -sf ${BUILD_OUTPUT_ROOT_DIRECTORY}
   ${CMAKE_CURRENT_BINARY_DIR}/build/latest)
 else()
-  set(BUILD_OUTPUT_ROOT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${BUILD_SUBDIR_NAME}/")
+  if (MSVC)
+    # MSVC makes its own output directories based on the build configuration
+    set(BUILD_OUTPUT_ROOT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/")
+  else()
+    set(BUILD_OUTPUT_ROOT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${BUILD_SUBDIR_NAME}/")
+  endif()
 endif()
 
+message(STATUS "Build output directory: ${BUILD_OUTPUT_ROOT_DIRECTORY}")
+
 # where to put generated archives (.a files)
 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}")
 set(ARCHIVE_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}")

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/python/cmake_modules/CompilerInfo.cmake
----------------------------------------------------------------------
diff --git a/python/cmake_modules/CompilerInfo.cmake b/python/cmake_modules/CompilerInfo.cmake
deleted file mode 100644
index 8e85bde..0000000
--- a/python/cmake_modules/CompilerInfo.cmake
+++ /dev/null
@@ -1,48 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#   http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied.  See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-# Sets COMPILER_FAMILY to 'clang' or 'gcc'
-# Sets COMPILER_VERSION to the version
-execute_process(COMMAND "${CMAKE_CXX_COMPILER}" -v
-                ERROR_VARIABLE COMPILER_VERSION_FULL)
-message(INFO " ${COMPILER_VERSION_FULL}")
-
-# clang on Linux and Mac OS X before 10.9
-if("${COMPILER_VERSION_FULL}" MATCHES ".*clang version.*")
-  set(COMPILER_FAMILY "clang")
-  string(REGEX REPLACE ".*clang version ([0-9]+\\.[0-9]+).*" "\\1"
-    COMPILER_VERSION "${COMPILER_VERSION_FULL}")
-# clang on Mac OS X 10.9 and later
-elseif("${COMPILER_VERSION_FULL}" MATCHES ".*based on LLVM.*")
-  set(COMPILER_FAMILY "clang")
-  string(REGEX REPLACE ".*based on LLVM ([0-9]+\\.[0.9]+).*" "\\1"
-    COMPILER_VERSION "${COMPILER_VERSION_FULL}")
-
-# clang on Mac OS X, XCode 7+. No version replacement is done
-# because Apple no longer advertises the upstream LLVM version.
-elseif("${COMPILER_VERSION_FULL}" MATCHES "clang-.*")
-  set(COMPILER_FAMILY "clang")
-
-# gcc
-elseif("${COMPILER_VERSION_FULL}" MATCHES ".*gcc version.*")
-  set(COMPILER_FAMILY "gcc")
-  string(REGEX REPLACE ".*gcc version ([0-9\\.]+).*" "\\1"
-    COMPILER_VERSION "${COMPILER_VERSION_FULL}")
-else()
-  message(FATAL_ERROR "Unknown compiler. Version info:\n${COMPILER_VERSION_FULL}")
-endif()
-message("Selected compiler ${COMPILER_FAMILY} ${COMPILER_VERSION}")

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/python/cmake_modules/FindArrow.cmake
----------------------------------------------------------------------
diff --git a/python/cmake_modules/FindArrow.cmake b/python/cmake_modules/FindArrow.cmake
index 51a8871..8e13dd6 100644
--- a/python/cmake_modules/FindArrow.cmake
+++ b/python/cmake_modules/FindArrow.cmake
@@ -67,18 +67,23 @@ find_library(ARROW_PYTHON_LIB_PATH NAMES arrow_python
 
 if (ARROW_INCLUDE_DIR AND ARROW_LIBS)
   set(ARROW_FOUND TRUE)
-  set(ARROW_LIB_NAME libarrow)
-  set(ARROW_JEMALLOC_LIB_NAME libarrow_jemalloc)
-  set(ARROW_PYTHON_LIB_NAME libarrow_python)
 
-  set(ARROW_STATIC_LIB ${ARROW_SEARCH_LIB_PATH}/${ARROW_LIB_NAME}.a)
-  set(ARROW_SHARED_LIB ${ARROW_LIBS}/${ARROW_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
+  if (MSVC)
+    set(ARROW_STATIC_LIB ${ARROW_LIB_PATH})
+    set(ARROW_PYTHON_STATIC_LIB ${ARROW_PYTHON_LIB_PATH})
+    set(ARROW_JEMALLOC_STATIC_LIB ${ARROW_JEMALLOC_LIB_PATH})
+    set(ARROW_SHARED_LIB ${ARROW_STATIC_LIB})
+    set(ARROW_PYTHON_SHARED_LIB ${ARROW_PYTHON_STATIC_LIB})
+    set(ARROW_JEMALLOC_SHARED_LIB ${ARROW_JEMALLOC_STATIC_LIB})
+  else()
+    set(ARROW_STATIC_LIB ${ARROW_PYTHON_LIB_PATH}/libarrow.a)
+    set(ARROW_PYTHON_STATIC_LIB ${ARROW_PYTHON_LIB_PATH}/libarrow_python.a)
+    set(ARROW_JEMALLOC_STATIC_LIB ${ARROW_PYTHON_LIB_PATH}/libarrow_jemalloc.a)
 
-  set(ARROW_JEMALLOC_STATIC_LIB ${ARROW_SEARCH_LIB_PATH}/${ARROW_JEMALLOC_LIB_NAME}.a)
-  set(ARROW_JEMALLOC_SHARED_LIB ${ARROW_LIBS}/${ARROW_JEMALLOC_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
-
-  set(ARROW_PYTHON_STATIC_LIB ${ARROW_SEARCH_LIB_PATH}/${ARROW_PYTHON_LIB_NAME}.a)
-  set(ARROW_PYTHON_SHARED_LIB ${ARROW_LIBS}/${ARROW_PYTHON_LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
+    set(ARROW_SHARED_LIB ${ARROW_LIBS}/libarrow${CMAKE_SHARED_LIBRARY_SUFFIX})
+    set(ARROW_JEMALLOC_SHARED_LIB ${ARROW_LIBS}/libarrow_jemalloc${CMAKE_SHARED_LIBRARY_SUFFIX})
+    set(ARROW_PYTHON_SHARED_LIB ${ARROW_LIBS}/libarrow_python${CMAKE_SHARED_LIBRARY_SUFFIX})
+  endif()
 
   if (NOT Arrow_FIND_QUIETLY)
     message(STATUS "Found the Arrow core library: ${ARROW_LIB_PATH}")

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/python/cmake_modules/UseCython.cmake
----------------------------------------------------------------------
diff --git a/python/cmake_modules/UseCython.cmake b/python/cmake_modules/UseCython.cmake
index 7c06b02..7920940 100644
--- a/python/cmake_modules/UseCython.cmake
+++ b/python/cmake_modules/UseCython.cmake
@@ -122,9 +122,11 @@ function( compile_pyx _name pyx_target_name generated_files pyx_file)
   endif()
   set_source_files_properties( ${_generated_files} PROPERTIES GENERATED TRUE )
 
-  # Cython creates a lot of compiler warning detritus on clang
-  set_source_files_properties(${_generated_files} PROPERTIES
-    COMPILE_FLAGS -Wno-unused-function)
+  if (NOT WIN32)
+    # Cython creates a lot of compiler warning detritus on clang
+    set_source_files_properties(${_generated_files} PROPERTIES
+      COMPILE_FLAGS -Wno-unused-function)
+  endif()
 
   set( ${generated_files} ${_generated_files} PARENT_SCOPE )
 

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/python/pyarrow/_config.pyx
----------------------------------------------------------------------
diff --git a/python/pyarrow/_config.pyx b/python/pyarrow/_config.pyx
index 536f278..2c1e6bf 100644
--- a/python/pyarrow/_config.pyx
+++ b/python/pyarrow/_config.pyx
@@ -14,18 +14,13 @@
 # distutils: language = c++
 # cython: embedsignature = True
 
-cdef extern from 'arrow/python/do_import_numpy.h':
-    pass
-
-cdef extern from 'arrow/python/numpy_interop.h' namespace 'arrow::py':
-    int import_numpy()
+cdef extern from 'arrow/python/init.h' namespace 'arrow::py':
+    void InitNumPy()
 
 cdef extern from 'arrow/python/config.h' namespace 'arrow::py':
-    void Init()
     void set_numpy_nan(object o)
 
-import_numpy()
-Init()
+InitNumPy()
 
 import numpy as np
 set_numpy_nan(np.nan)

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/python/pyarrow/_io.pyx
----------------------------------------------------------------------
diff --git a/python/pyarrow/_io.pyx b/python/pyarrow/_io.pyx
index ec37de0..09e8233 100644
--- a/python/pyarrow/_io.pyx
+++ b/python/pyarrow/_io.pyx
@@ -807,7 +807,7 @@ cdef class _HdfsClient:
         cdef c_string c_path = tobytes(path)
         with nogil:
             check_status(self.client.get()
-                         .CreateDirectory(c_path))
+                         .MakeDirectory(c_path))
 
     def delete(self, path, bint recursive=False):
         """

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/python/pyarrow/includes/common.pxd
----------------------------------------------------------------------
diff --git a/python/pyarrow/includes/common.pxd b/python/pyarrow/includes/common.pxd
index ab38ff3..44723fa 100644
--- a/python/pyarrow/includes/common.pxd
+++ b/python/pyarrow/includes/common.pxd
@@ -26,8 +26,7 @@ from libcpp.vector cimport vector
 from cpython cimport PyObject
 cimport cpython
 
-# This must be included for cerr and other things to work
-cdef extern from "<iostream>":
+cdef extern from "arrow/python/platform.h":
     pass
 
 cdef extern from "<Python.h>":

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/python/pyarrow/includes/libarrow.pxd
----------------------------------------------------------------------
diff --git a/python/pyarrow/includes/libarrow.pxd b/python/pyarrow/includes/libarrow.pxd
index b8aa24c..ea835f6 100644
--- a/python/pyarrow/includes/libarrow.pxd
+++ b/python/pyarrow/includes/libarrow.pxd
@@ -54,7 +54,7 @@ cdef extern from "arrow/api.h" namespace "arrow" nogil:
         _Type_STRUCT" arrow::Type::STRUCT"
         _Type_DICTIONARY" arrow::Type::DICTIONARY"
 
-    enum TimeUnit" arrow::TimeUnit":
+    enum TimeUnit" arrow::TimeUnit::type":
         TimeUnit_SECOND" arrow::TimeUnit::SECOND"
         TimeUnit_MILLI" arrow::TimeUnit::MILLI"
         TimeUnit_MICRO" arrow::TimeUnit::MICRO"
@@ -435,7 +435,7 @@ cdef extern from "arrow/io/hdfs.h" namespace "arrow::io" nogil:
         CStatus Connect(const HdfsConnectionConfig* config,
                         shared_ptr[CHdfsClient]* client)
 
-        CStatus CreateDirectory(const c_string& path)
+        CStatus MakeDirectory(const c_string& path)
 
         CStatus Delete(const c_string& path, c_bool recursive)
 

http://git-wip-us.apache.org/repos/asf/arrow/blob/7238d544/python/setup.py
----------------------------------------------------------------------
diff --git a/python/setup.py b/python/setup.py
index 3991856..ab71e78 100644
--- a/python/setup.py
+++ b/python/setup.py
@@ -91,6 +91,13 @@ class build_ext(_build_ext):
         _build_ext.initialize_options(self)
         self.extra_cmake_args = os.environ.get('PYARROW_CMAKE_OPTIONS', '')
         self.build_type = os.environ.get('PYARROW_BUILD_TYPE', 'debug').lower()
+
+        if sys.platform == 'win32':
+            # Cannot do debug builds in Windows unless Python itself is a debug
+            # build
+            if not hasattr(sys, 'gettotalrefcount'):
+                self.build_type = 'release'
+
         self.with_parquet = strtobool(
             os.environ.get('PYARROW_WITH_PARQUET', '0'))
         self.with_jemalloc = strtobool(
@@ -132,13 +139,10 @@ class build_ext(_build_ext):
                 return
 
         static_lib_option = ''
-        build_tests_option = ''
 
         cmake_options = [
             '-DPYTHON_EXECUTABLE=%s' % sys.executable,
-            '-DPYARROW_BUILD_TESTS=off',
             static_lib_option,
-            build_tests_option,
         ]
 
         if self.with_parquet:
@@ -150,10 +154,10 @@ class build_ext(_build_ext):
         if self.bundle_arrow_cpp:
             cmake_options.append('-DPYARROW_BUNDLE_ARROW_CPP=ON')
 
-        if sys.platform != 'win32':
-            cmake_options.append('-DCMAKE_BUILD_TYPE={0}'
-                                 .format(self.build_type))
+        cmake_options.append('-DCMAKE_BUILD_TYPE={0}'
+                             .format(self.build_type))
 
+        if sys.platform != 'win32':
             cmake_command = (['cmake', self.extra_cmake_args] +
                              cmake_options + [source])
 
@@ -167,15 +171,15 @@ class build_ext(_build_ext):
             self.spawn(args)
         else:
             import shlex
-            cmake_generator = 'Visual Studio 14 2015'
-            if is_64_bit:
-                cmake_generator += ' Win64'
+            cmake_generator = 'Visual Studio 14 2015 Win64'
+            if not is_64_bit:
+                raise RuntimeError('Not supported on 32-bit Windows')
+
             # Generate the build files
             extra_cmake_args = shlex.split(self.extra_cmake_args)
             cmake_command = (['cmake'] + extra_cmake_args +
                              cmake_options +
-                             [source,
-                             '-G', cmake_generator])
+                             [source, '-G', cmake_generator])
             if "-G" in self.extra_cmake_args:
                 cmake_command = cmake_command[:-2]
 
@@ -336,7 +340,7 @@ setup(
     use_scm_version={"root": "..", "relative_to": __file__},
     setup_requires=['setuptools_scm', 'cython >= 0.23'],
     install_requires=['numpy >= 1.9', 'six >= 1.0.0'],
-    test_requires=['pytest'],
+    tests_require=['pytest'],
     description="Python library for Apache Arrow",
     long_description=long_description,
     classifiers=[