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 2016/12/28 15:54:42 UTC

arrow git commit: ARROW-330: CMake functions to simplify shared / static library configuration

Repository: arrow
Updated Branches:
  refs/heads/master cfbdb6800 -> 8aab00ee1


ARROW-330: CMake functions to simplify shared / static library configuration

This also fixes ARROW-303

Author: Uwe L. Korn <uw...@xhochy.com>

Closes #255 from xhochy/ARROW-330 and squashes the following commits:

a495d16 [Uwe L. Korn] Fix linking order
17131c9 [Uwe L. Korn] ARROW-330: CMake functions to simplify shared / static library configuration


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

Branch: refs/heads/master
Commit: 8aab00ee16d9dfe7ed578c8dbe59761eaa68670f
Parents: cfbdb68
Author: Uwe L. Korn <uw...@xhochy.com>
Authored: Wed Dec 28 10:54:27 2016 -0500
Committer: Wes McKinney <we...@twosigma.com>
Committed: Wed Dec 28 10:54:27 2016 -0500

----------------------------------------------------------------------
 cpp/CMakeLists.txt                 | 54 ++----------------
 cpp/cmake_modules/BuildUtils.cmake | 77 ++++++++++++++++++++++++++
 cpp/src/arrow/io/CMakeLists.txt    | 97 +++++++++++++++++----------------
 cpp/src/arrow/io/memory.h          |  2 +-
 cpp/src/arrow/ipc/CMakeLists.txt   | 67 ++++++++++-------------
 5 files changed, 164 insertions(+), 133 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/arrow/blob/8aab00ee/cpp/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt
index 47b7671..bf30543 100644
--- a/cpp/CMakeLists.txt
+++ b/cpp/CMakeLists.txt
@@ -717,61 +717,19 @@ set(ARROW_SRCS
   src/arrow/util/bit-util.cc
 )
 
-add_library(arrow_objlib OBJECT
-  ${ARROW_SRCS}
-)
-
-# Necessary to make static linking into other shared libraries work properly
-set_property(TARGET arrow_objlib PROPERTY POSITION_INDEPENDENT_CODE 1)
-
 if(NOT APPLE)
   # Localize thirdparty symbols using a linker version script. This hides them
   # from the client application. The OS X linker does not support the
   # version-script option.
-  set(SHARED_LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/src/arrow/symbols.map")
-endif()
-
-if (ARROW_BUILD_SHARED)
-  add_library(arrow_shared SHARED $<TARGET_OBJECTS:arrow_objlib>)
-  if(APPLE)
-    set_target_properties(arrow_shared PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
-  endif()
-  set_target_properties(arrow_shared
-    PROPERTIES
-    LIBRARY_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}"
-    LINK_FLAGS "${SHARED_LINK_FLAGS}"
-    OUTPUT_NAME "arrow")
-  target_link_libraries(arrow_shared
-    LINK_PUBLIC ${ARROW_LINK_LIBS}
-    LINK_PRIVATE ${ARROW_PRIVATE_LINK_LIBS})
-
-  install(TARGETS arrow_shared
-    LIBRARY DESTINATION lib
-    ARCHIVE DESTINATION lib)
+  set(ARROW_SHARED_LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/src/arrow/symbols.map")
 endif()
 
-if (ARROW_BUILD_STATIC)
-  add_library(arrow_static STATIC $<TARGET_OBJECTS:arrow_objlib>)
-  set_target_properties(arrow_static
-    PROPERTIES
-    LIBRARY_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}"
-    OUTPUT_NAME "arrow")
+include(BuildUtils)
 
-  target_link_libraries(arrow_static
-    LINK_PUBLIC ${ARROW_LINK_LIBS}
-    LINK_PRIVATE ${ARROW_PRIVATE_LINK_LIBS})
-
-  install(TARGETS arrow_static
-    LIBRARY DESTINATION lib
-    ARCHIVE DESTINATION lib)
-endif()
-
-if (APPLE)
-  set_target_properties(arrow_shared
-    PROPERTIES
-    BUILD_WITH_INSTALL_RPATH ON
-    INSTALL_NAME_DIR "@rpath")
-endif()
+ADD_ARROW_LIB(arrow
+    SOURCES ${ARROW_SRCS}
+    SHARED_LINK_FLAGS ${ARROW_SHARED_LINK_FLAGS}
+)
 
 add_subdirectory(src/arrow)
 add_subdirectory(src/arrow/io)

http://git-wip-us.apache.org/repos/asf/arrow/blob/8aab00ee/cpp/cmake_modules/BuildUtils.cmake
----------------------------------------------------------------------
diff --git a/cpp/cmake_modules/BuildUtils.cmake b/cpp/cmake_modules/BuildUtils.cmake
new file mode 100644
index 0000000..b620de5
--- /dev/null
+++ b/cpp/cmake_modules/BuildUtils.cmake
@@ -0,0 +1,77 @@
+# 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.
+
+function(ADD_ARROW_LIB LIB_NAME)
+  set(options)
+  set(one_value_args SHARED_LINK_FLAGS)
+  set(multi_value_args SOURCES STATIC_LINK_LIBS STATIC_PRIVATE_LINK_LIBS SHARED_LINK_LIBS SHARED_PRIVATE_LINK_LIBS)
+  cmake_parse_arguments(ARG "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN})
+  if(ARG_UNPARSED_ARGUMENTS)
+    message(SEND_ERROR "Error: unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}")
+  endif()
+
+  add_library(${LIB_NAME}_objlib OBJECT
+      ${ARG_SOURCES}
+  )
+
+  # Necessary to make static linking into other shared libraries work properly
+  set_property(TARGET ${LIB_NAME}_objlib PROPERTY POSITION_INDEPENDENT_CODE 1)
+
+  if (ARROW_BUILD_SHARED)
+    add_library(${LIB_NAME}_shared SHARED $<TARGET_OBJECTS:${LIB_NAME}_objlib>)
+    if(APPLE)
+      set_target_properties(${LIB_NAME}_shared PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
+    endif()
+    set_target_properties(${LIB_NAME}_shared
+      PROPERTIES
+      LIBRARY_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}"
+      LINK_FLAGS "${ARG_SHARED_LINK_FLAGS}"
+      OUTPUT_NAME ${LIB_NAME})
+  target_link_libraries(${LIB_NAME}_shared
+      LINK_PUBLIC ${ARG_SHARED_LINK_LIBS}
+      LINK_PRIVATE ${ARG_SHARED_PRIVATE_LINK_LIBS})
+  
+  install(TARGETS ${LIB_NAME}_shared
+      LIBRARY DESTINATION lib
+      ARCHIVE DESTINATION lib)
+  endif()
+  
+  if (ARROW_BUILD_STATIC)
+      add_library(${LIB_NAME}_static STATIC $<TARGET_OBJECTS:${LIB_NAME}_objlib>)
+    set_target_properties(${LIB_NAME}_static
+      PROPERTIES
+      LIBRARY_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}"
+      OUTPUT_NAME ${LIB_NAME})
+  
+  target_link_libraries(${LIB_NAME}_static
+      LINK_PUBLIC ${ARG_STATIC_LINK_LIBS}
+      LINK_PRIVATE ${ARG_STATIC_PRIVATE_LINK_LIBS})
+  
+  install(TARGETS ${LIB_NAME}_static
+      LIBRARY DESTINATION lib
+      ARCHIVE DESTINATION lib)
+  endif()
+  
+  if (APPLE)
+      set_target_properties(${LIB_NAME}_shared
+      PROPERTIES
+      BUILD_WITH_INSTALL_RPATH ON
+      INSTALL_NAME_DIR "@rpath")
+  endif()
+
+endfunction()
+

http://git-wip-us.apache.org/repos/asf/arrow/blob/8aab00ee/cpp/src/arrow/io/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/io/CMakeLists.txt b/cpp/src/arrow/io/CMakeLists.txt
index 1e65a1a..b8882e4 100644
--- a/cpp/src/arrow/io/CMakeLists.txt
+++ b/cpp/src/arrow/io/CMakeLists.txt
@@ -18,30 +18,65 @@
 # ----------------------------------------------------------------------
 # arrow_io : Arrow IO interfaces
 
+# HDFS thirdparty setup
+if (DEFINED ENV{HADOOP_HOME})
+  set(HADOOP_HOME $ENV{HADOOP_HOME})
+  if (NOT EXISTS "${HADOOP_HOME}/include/hdfs.h")
+    message(STATUS "Did not find hdfs.h in expected location, using vendored one")
+    set(HADOOP_HOME "${THIRDPARTY_DIR}/hadoop")
+  endif()
+else()
+  set(HADOOP_HOME "${THIRDPARTY_DIR}/hadoop")
+endif()
+
+set(HDFS_H_PATH "${HADOOP_HOME}/include/hdfs.h")
+if (NOT EXISTS ${HDFS_H_PATH})
+  message(FATAL_ERROR "Did not find hdfs.h at ${HDFS_H_PATH}")
+endif()
+message(STATUS "Found hdfs.h at: " ${HDFS_H_PATH})
+
+include_directories(SYSTEM "${HADOOP_HOME}/include")
+
+# arrow_io library
 if (MSVC)
-  set(ARROW_IO_LINK_LIBS
+  set(ARROW_IO_STATIC_LINK_LIBS
+    arrow_static
+  )
+  set(ARROW_IO_SHARED_LINK_LIBS
     arrow_shared
   )
 else()
-  set(ARROW_IO_LINK_LIBS
+  set(ARROW_IO_STATIC_LINK_LIBS
+    arrow_static
+    dl
+  )
+  set(ARROW_IO_SHARED_LINK_LIBS
     arrow_shared
     dl
   )
 endif()
 
 if (ARROW_BOOST_USE_SHARED)
-  set(ARROW_IO_PRIVATE_LINK_LIBS
+  set(ARROW_IO_SHARED_PRIVATE_LINK_LIBS
     boost_system_shared
     boost_filesystem_shared)
 else()
-  set(ARROW_IO_PRIVATE_LINK_LIBS
+  set(ARROW_IO_SHARED_PRIVATE_LINK_LIBS
     boost_system_static
     boost_filesystem_static)
 endif()
 
-set(ARROW_IO_TEST_LINK_LIBS
-  arrow_io
-  ${ARROW_IO_PRIVATE_LINK_LIBS})
+set(ARROW_IO_STATIC_PRIVATE_LINK_LIBS
+  boost_system_static
+  boost_filesystem_static)
+
+if (ARROW_BUILD_STATIC)
+  set(ARROW_IO_TEST_LINK_LIBS
+    arrow_io_static)
+else()
+  set(ARROW_IO_TEST_LINK_LIBS
+    arrow_io_shared)
+endif()
 
 set(ARROW_IO_SRCS
   file.cc
@@ -51,32 +86,6 @@ set(ARROW_IO_SRCS
   memory.cc
 )
 
-# HDFS thirdparty setup
-if (DEFINED ENV{HADOOP_HOME})
-  set(HADOOP_HOME $ENV{HADOOP_HOME})
-  if (NOT EXISTS "${HADOOP_HOME}/include/hdfs.h")
-    message(STATUS "Did not find hdfs.h in expected location, using vendored one")
-    set(HADOOP_HOME "${THIRDPARTY_DIR}/hadoop")
-  endif()
-else()
-  set(HADOOP_HOME "${THIRDPARTY_DIR}/hadoop")
-endif()
-
-set(HDFS_H_PATH "${HADOOP_HOME}/include/hdfs.h")
-if (NOT EXISTS ${HDFS_H_PATH})
-  message(FATAL_ERROR "Did not find hdfs.h at ${HDFS_H_PATH}")
-endif()
-message(STATUS "Found hdfs.h at: " ${HDFS_H_PATH})
-
-include_directories(SYSTEM "${HADOOP_HOME}/include")
-
-add_library(arrow_io SHARED
-  ${ARROW_IO_SRCS}
-)
-target_link_libraries(arrow_io
-  LINK_PUBLIC ${ARROW_IO_LINK_LIBS}
-  LINK_PRIVATE ${ARROW_IO_PRIVATE_LINK_LIBS})
-
 if(NOT APPLE)
   # Localize thirdparty symbols using a linker version script. This hides them
   # from the client application. The OS X linker does not support the
@@ -84,16 +93,14 @@ if(NOT APPLE)
   set(ARROW_IO_LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/symbols.map")
 endif()
 
-SET_TARGET_PROPERTIES(arrow_io PROPERTIES
-  LINKER_LANGUAGE CXX
-  LINK_FLAGS "${ARROW_IO_LINK_FLAGS}")
-
-if (APPLE)
-  set_target_properties(arrow_io
-    PROPERTIES
-    BUILD_WITH_INSTALL_RPATH ON
-    INSTALL_NAME_DIR "@rpath")
-endif()
+ADD_ARROW_LIB(arrow_io
+  SOURCES ${ARROW_IO_SRCS}
+  SHARED_LINK_FLAGS ${ARROW_IO_LINK_FLAGS}
+  SHARED_LINK_LIBS ${ARROW_IO_SHARED_LINK_LIBS}
+  SHARED_PRIVATE_LINK_LIBS ${ARROW_IO_SHARED_PRIVATE_LINK_LIBS}
+  STATIC_LINK_LIBS ${ARROW_IO_STATIC_LINK_LIBS}
+  STATIC_PRIVATE_LINK_LIBS ${ARROW_IO_STATIC_PRIVATE_LINK_LIBS}
+)
 
 ADD_ARROW_TEST(io-file-test)
 ARROW_TEST_LINK_LIBRARIES(io-file-test
@@ -115,10 +122,6 @@ install(FILES
   memory.h
   DESTINATION include/arrow/io)
 
-install(TARGETS arrow_io
-  LIBRARY DESTINATION lib
-  ARCHIVE DESTINATION lib)
-
 # pkg-config support
 configure_file(arrow-io.pc.in
   "${CMAKE_CURRENT_BINARY_DIR}/arrow-io.pc"

http://git-wip-us.apache.org/repos/asf/arrow/blob/8aab00ee/cpp/src/arrow/io/memory.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/io/memory.h b/cpp/src/arrow/io/memory.h
index b72f93b..2faf280 100644
--- a/cpp/src/arrow/io/memory.h
+++ b/cpp/src/arrow/io/memory.h
@@ -101,7 +101,7 @@ class ARROW_EXPORT BufferReader : public ReadableFileInterface {
  public:
   explicit BufferReader(const std::shared_ptr<Buffer>& buffer);
   BufferReader(const uint8_t* data, int64_t size);
-  ~BufferReader();
+  virtual ~BufferReader();
 
   Status Close() override;
   Status Tell(int64_t* position) override;

http://git-wip-us.apache.org/repos/asf/arrow/blob/8aab00ee/cpp/src/arrow/ipc/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/ipc/CMakeLists.txt b/cpp/src/arrow/ipc/CMakeLists.txt
index d3e625a..11ca191 100644
--- a/cpp/src/arrow/ipc/CMakeLists.txt
+++ b/cpp/src/arrow/ipc/CMakeLists.txt
@@ -19,17 +19,25 @@
 # arrow_ipc
 #######################################
 
-set(ARROW_IPC_LINK_LIBS
-  arrow_io
+set(ARROW_IPC_SHARED_LINK_LIBS
+  arrow_io_shared
   arrow_shared
 )
 
-set(ARROW_IPC_PRIVATE_LINK_LIBS
-  )
+set(ARROW_IPC_STATIC_LINK_LIBS
+  arrow_static
+  arrow_io_static
+)
 
-set(ARROW_IPC_TEST_LINK_LIBS
-  arrow_ipc
-  ${ARROW_IPC_PRIVATE_LINK_LIBS})
+if (ARROW_BUILD_STATIC)
+  set(ARROW_IPC_TEST_LINK_LIBS
+    arrow_io_static
+    arrow_ipc_static)
+else()
+  set(ARROW_IPC_TEST_LINK_LIBS
+    arrow_io_shared
+    arrow_ipc_shared)
+endif()
 
 set(ARROW_IPC_SRCS
   adapter.cc
@@ -40,20 +48,6 @@ set(ARROW_IPC_SRCS
   metadata-internal.cc
 )
 
-# TODO(wesm): SHARED and STATIC targets
-add_library(arrow_ipc SHARED
-  ${ARROW_IPC_SRCS}
-)
-if(RAPIDJSON_VENDORED)
-  add_dependencies(arrow_ipc rapidjson_ep)
-endif()
-if(FLATBUFFERS_VENDORED)
-  add_dependencies(arrow_ipc flatbuffers_ep)
-endif()
-target_link_libraries(arrow_ipc
-  LINK_PUBLIC ${ARROW_IPC_LINK_LIBS}
-  LINK_PRIVATE ${ARROW_IPC_PRIVATE_LINK_LIBS})
-
 if(NOT APPLE)
   # Localize thirdparty symbols using a linker version script. This hides them
   # from the client application. The OS X linker does not support the
@@ -61,15 +55,18 @@ if(NOT APPLE)
   set(ARROW_IPC_LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/symbols.map")
 endif()
 
-SET_TARGET_PROPERTIES(arrow_ipc PROPERTIES
-  LINKER_LANGUAGE CXX
-  LINK_FLAGS "${ARROW_IPC_LINK_FLAGS}")
+ADD_ARROW_LIB(arrow_ipc
+    SOURCES ${ARROW_IPC_SRCS}
+    SHARED_LINK_FLAGS ${ARROW_IPC_LINK_FLAGS}
+    SHARED_LINK_LIBS ${ARROW_IPC_SHARED_LINK_LIBS}
+    STATIC_LINK_LIBS ${ARROW_IO_SHARED_PRIVATE_LINK_LIBS}
+)
 
-if (APPLE)
-  set_target_properties(arrow_ipc
-    PROPERTIES
-    BUILD_WITH_INSTALL_RPATH ON
-    INSTALL_NAME_DIR "@rpath")
+if(RAPIDJSON_VENDORED)
+  add_dependencies(arrow_ipc_objlib rapidjson_ep)
+endif()
+if(FLATBUFFERS_VENDORED)
+  add_dependencies(arrow_ipc_objlib flatbuffers_ep)
 endif()
 
 ADD_ARROW_TEST(ipc-adapter-test)
@@ -93,9 +90,9 @@ ADD_ARROW_TEST(json-integration-test)
 if (ARROW_BUILD_TESTS)
   if (APPLE)
     target_link_libraries(json-integration-test
+      arrow_ipc_static
+      arrow_io_static
       arrow_static
-      arrow_io
-      arrow_ipc
       gflags
       gtest
       boost_filesystem_static
@@ -105,9 +102,9 @@ if (ARROW_BUILD_TESTS)
       PROPERTIES LINK_FLAGS "-undefined dynamic_lookup")
   else()
     target_link_libraries(json-integration-test
+      arrow_ipc_static
+      arrow_io_static
       arrow_static
-      arrow_io
-      arrow_ipc
       gflags
       gtest
       pthread
@@ -156,10 +153,6 @@ install(FILES
   metadata.h
   DESTINATION include/arrow/ipc)
 
-install(TARGETS arrow_ipc
-  LIBRARY DESTINATION lib
-  ARCHIVE DESTINATION lib)
-
 # pkg-config support
 configure_file(arrow-ipc.pc.in
   "${CMAKE_CURRENT_BINARY_DIR}/arrow-ipc.pc"