PARQUET-1070 Add CPack support to the build

Author: Mike Trinkala <trink@acm.org>

Closes #409 from trink/PARQUET-1070 and squashes the following commits:

dafee2c [Mike Trinkala] PARQUET-1070: Add CPack support to the build
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c6989fa..5aa8b93 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,10 +18,25 @@
 # Require cmake that supports BYPRODUCTS in add_custom_command, ExternalProject_Add [1].
 cmake_minimum_required(VERSION 3.2.0)
 
-project(parquet-cpp)
-
 file(READ "${CMAKE_CURRENT_SOURCE_DIR}/.parquetcppversion" PARQUET_VERSION)
 string(REPLACE "\n" "" PARQUET_VERSION "${PARQUET_VERSION}")
+string(REGEX MATCH "^([0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?)" VERSION ${PARQUET_VERSION})
+if(NOT VERSION)
+  message(FATAL_ERROR "invalid .parquetcppversion")
+endif()
+
+project(parquet-cpp VERSION ${VERSION})
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "C++ library to read and write the Apache Parquet columnar data format")
+set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR})
+set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR})
+set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH})
+set(CPACK_PACKAGE_VENDOR        "Apache Software Foundation")
+set(CPACK_PACKAGE_CONTACT       "Apache Parquet Development <dev@parquet.apache.org>")
+set(CPACK_STRIP_FILES           TRUE)
+set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt")
+set(CPACK_DEBIAN_FILE_NAME      "DEB-DEFAULT")
+set(CPACK_RPM_FILE_NAME         "RPM-DEFAULT")
+set(CPACK_RPM_PACKAGE_LICENSE   "Apache v2.0")
 
 include(ExternalProject)
 include(FindPkgConfig)
@@ -34,8 +49,26 @@
 
 include(GNUInstallDirs)
 
-set(PARQUET_SO_VERSION "1")
-set(PARQUET_ABI_VERSION "${PARQUET_SO_VERSION}.0.0")
+set(PARQUET_SO_VERSION ${PROJECT_VERSION_MAJOR})
+set(PARQUET_ABI_VERSION ${PROJECT_VERSION})
+if(WIN32)
+  set(INSTALL_CMAKE_DIR cmake)
+else()
+  set(INSTALL_CMAKE_DIR "${CMAKE_INSTALL_DATAROOTDIR}/${PROJECT_NAME}/cmake")
+endif()
+set(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/usr/${CMAKE_INSTALL_LIBDIR}/pkgconfig")
+include(CPack)
+
+include(CMakePackageConfigHelpers)
+configure_package_config_file(cmake_modules/${PROJECT_NAME}Config.cmake.in
+                              ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
+                              INSTALL_DESTINATION ${INSTALL_CMAKE_DIR}
+                              PATH_VARS CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_LIBDIR)
+write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
+                                 COMPATIBILITY SameMajorVersion)
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
+              ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
+DESTINATION ${INSTALL_CMAKE_DIR})
 
 if (NOT "$ENV{PARQUET_GCC_ROOT}" STREQUAL "")
   set(GCC_ROOT $ENV{PARQUET_GCC_ROOT})
diff --git a/cmake_modules/parquet-cppConfig.cmake.in b/cmake_modules/parquet-cppConfig.cmake.in
new file mode 100644
index 0000000..02e0d23
--- /dev/null
+++ b/cmake_modules/parquet-cppConfig.cmake.in
@@ -0,0 +1,15 @@
+set(PARQUET-CPP_VERSION x.y.z)
+
+@PACKAGE_INIT@
+
+set_and_check(PARQUET-CPP_INCLUDE_DIR "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@")
+set_and_check(PARQUET-CPP_LIB_DIR "@PACKAGE_CMAKE_INSTALL_LIBDIR@")
+
+set(_TMP_SUFFIX ${CMAKE_FIND_LIBRARY_SUFFIXES})
+FIND_LIBRARY(PARQUET_LIBRARY NAMES parquet PATHS ${PARQUET-CPP_LIB_DIR})
+set(PARQUET-CPP_LIBRARIES ${PARQUET_LIBRARY})
+
+set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
+FIND_LIBRARY(PARQUET_STATIC_LIBRARY NAMES parquet PATHS ${PARQUET-CPP_LIB_DIR})
+set(PARQUET-CPP_STATIC_LIBRARIES ${PARQUET_STATIC_LIBRARY})
+set(CMAKE_FIND_LIBRARY_SUFFIXES ${_TMP_SUFFIX})