Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: Add amalgamated geoarrow.c/geoarrow.h distribution to CMakeLists.txt #87

Merged
merged 6 commits into from
Dec 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions .github/workflows/build-and-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ jobs:
build-and-test:

runs-on: ubuntu-latest
name: ${{ matrix.config.label }}

strategy:
fail-fast: false
matrix:
config:
- {label: default-build, cmake_args: "-DCMAKE_BUILD_TYPE=Debug -DGEOARROW_CODE_COVERAGE=ON"}
- {label: bundled-build, cmake_args: "-DGEOARROW_BUNDLE=ON -DGEOARROW_USE_FAST_FLOAT=OFF -DGEOARROW_USE_RYU=OFF"}

steps:
- name: Checkout repo
Expand All @@ -38,7 +46,7 @@ jobs:
run: |
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug -DGEOARROW_CODE_COVERAGE=ON -DGEOARROW_BUILD_TESTS=ON
cmake .. -DGEOARROW_BUILD_TESTS=ON ${{ matrix.config.cmake_args }}
cmake --build .

- name: Test
Expand All @@ -47,10 +55,12 @@ jobs:
GEOARROW_TESTING_DIR=$GITHUB_WORKSPACE/testing ctest -T test --output-on-failure .

- name: Install lcov
if: matrix.config.label == 'default-build'
run: |
sudo apt-get install lcov

- name: Calculate coverage
if: matrix.config.label == 'default-build'
run: |
cd build
lcov --capture --directory . \
Expand All @@ -65,18 +75,19 @@ jobs:
lcov --list coverage.info

- name: Upload coverage
if: success()
if: success() && matrix.config.label == 'default-build'
uses: codecov/codecov-action@v2
with:
files: build/coverage.info

- name: Test with memcheck
if: matrix.config.label == 'default-build'
run: |
cd build
ctest -T memcheck .

- name: Upload memcheck results
if: failure()
if: failure() && matrix.config.label == 'default-build'
uses: actions/upload-artifact@main
with:
name: geoarrow-memcheck
Expand Down
186 changes: 132 additions & 54 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ option(GEOARROW_USE_RYU "Use ryu for numeric value printing" ON)
option(GEOARROW_NAMESPACE "A prefix for exported symbols" OFF)
option(GEOARROW_ARROW_STATIC "Use a statically-linked Arrow C++ build when linking tests"
OFF)
option(GEOARROW_BUNDLE "Use ON to just bundle the headers/sources" OFF)

if(GEOARROW_NAMESPACE)
set(GEOARROW_NAMESPACE_DEFINE "#define GEOARROW_NAMESPACE ${GEOARROW_NAMESPACE}")
Expand All @@ -41,6 +42,7 @@ if(GEOARROW_USE_FAST_FLOAT)
if(NOT DEFINED CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 11)
endif()

set(GEOARROW_DOUBLE_PARSE_SOURCE src/geoarrow/double_parse_fast_float.cc)
set(GEOARROW_USE_FAST_FLOAT_DEFINE "#define GEOARROW_USE_FAST_FLOAT 1")
else()
Expand All @@ -58,63 +60,139 @@ endif()

configure_file(src/geoarrow/geoarrow_config.h.in generated/geoarrow_config.h)

add_library(geoarrow
src/geoarrow/schema.c
src/geoarrow/schema_view.c
src/geoarrow/metadata.c
src/geoarrow/kernel.c
src/geoarrow/builder.c
src/geoarrow/array_view.c
src/geoarrow/util.c
src/geoarrow/visitor.c
src/geoarrow/wkb_reader.c
src/geoarrow/wkb_writer.c
src/geoarrow/wkt_reader.c
src/geoarrow/wkt_writer.c
src/geoarrow/array_reader.c
src/geoarrow/array_writer.c
${GEOARROW_DOUBLE_PARSE_SOURCE}
${GEOARROW_DOUBLE_PRINT_SOURCE}
src/geoarrow/nanoarrow.c)

target_include_directories(geoarrow
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/geoarrow>
$<INSTALL_INTERFACE:include>)
target_include_directories(geoarrow
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/generated>
)
target_compile_definitions(geoarrow PUBLIC "$<$<CONFIG:Debug>:NANOARROW_DEBUG>"
"$<$<CONFIG:Debug>:GEOARROW_DEBUG>")

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_compile_options(geoarrow
PRIVATE -Wall
-Werror
-Wextra
-Wno-type-limits
-Wno-unused-parameter
-Wpedantic
-Wunused-result)
elseif(CMAKE_C_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_C_COMPILER_ID STREQUAL
"Clang")
target_compile_options(geoarrow
PRIVATE -Wall
-Werror
-Wextra
-Wdocumentation
-Wno-unused-parameter
-Wshorten-64-to-32)
set(GEOARROW_SOURCES
src/geoarrow/schema.c
src/geoarrow/schema_view.c
src/geoarrow/metadata.c
src/geoarrow/kernel.c
src/geoarrow/builder.c
src/geoarrow/array_view.c
src/geoarrow/util.c
src/geoarrow/visitor.c
src/geoarrow/wkb_reader.c
src/geoarrow/wkb_writer.c
src/geoarrow/wkt_reader.c
src/geoarrow/wkt_writer.c
src/geoarrow/array_reader.c
src/geoarrow/array_writer.c
src/geoarrow/nanoarrow.c)

set(GEOARROW_PUBLIC_HEADERS
${CMAKE_CURRENT_BINARY_DIR}/generated/geoarrow_config.h src/geoarrow/geoarrow_type.h
src/geoarrow/geoarrow.h src/geoarrow/geoarrow_type_inline.h)

if(GEOARROW_BUNDLE)
# Bundle sources + headers, and if building tests, add a target the tests can link against
file(REMOVE_RECURSE ${CMAKE_BINARY_DIR}/amalgamation)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/amalgamation)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/amalgamation/geoarrow)

set(GEOARROW_H_TEMP ${CMAKE_BINARY_DIR}/amalgamation/geoarrow/geoarrow.h)
file(WRITE ${GEOARROW_H_TEMP} "")

foreach(SRC_FILE ${GEOARROW_PUBLIC_HEADERS})
file(READ ${SRC_FILE} SRC_FILE_CONTENTS)
file(APPEND ${GEOARROW_H_TEMP} "${SRC_FILE_CONTENTS}")
endforeach()

set(GEOARROW_C_TEMP ${CMAKE_BINARY_DIR}/amalgamation/geoarrow/geoarrow.c)

# Special-case nanoarrow.h, because it will contain a lot of unused static inline functions
# This could maybe be fixed in nanoarrow with a define for static inline "exports"
file(WRITE ${GEOARROW_C_TEMP} "#pragma GCC diagnostic push\n")
file(APPEND ${GEOARROW_C_TEMP} "#pragma GCC diagnostic ignored \"-Wunused-function\"\n")

file(READ src/geoarrow/nanoarrow.h SRC_FILE_CONTENTS)
file(APPEND ${GEOARROW_C_TEMP} "${SRC_FILE_CONTENTS}")

file(APPEND ${GEOARROW_C_TEMP} "#pragma GCC diagnostic push")

foreach(SRC_FILE ${GEOARROW_SOURCES} src/geoarrow/double_print.c
src/geoarrow/double_parse_std.c)
file(READ ${SRC_FILE} SRC_FILE_CONTENTS)
file(APPEND ${GEOARROW_C_TEMP} "${SRC_FILE_CONTENTS}")
endforeach()

# Update includes for concatenated sources
foreach(SRC_FILE ${GEOARROW_H_TEMP} ${GEOARROW_C_TEMP})
file(READ ${SRC_FILE} SRC_FILE_CONTENTS)
string(REGEX REPLACE "#include \"[a-z_.]+\"" "" SRC_FILE_CONTENTS
"${SRC_FILE_CONTENTS}")
file(WRITE ${SRC_FILE} "${SRC_FILE_CONTENTS}")
endforeach()

# Make sure geoarrow.h is included from geoarrow.c
file(READ ${GEOARROW_C_TEMP} SRC_FILE_CONTENTS)
file(WRITE ${GEOARROW_C_TEMP} "#include \"geoarrow.h\"\n")
file(APPEND ${GEOARROW_C_TEMP} "${SRC_FILE_CONTENTS}")

# Copy geoarrow.hpp
file(COPY_FILE src/geoarrow/geoarrow.hpp
${CMAKE_BINARY_DIR}/amalgamation/geoarrow/geoarrow.hpp)
file(COPY_FILE src/geoarrow/geoarrow_arrow.hpp
${CMAKE_BINARY_DIR}/amalgamation/geoarrow/geoarrow_arrow.hpp)

# "install" means copy the bundled sources to the specified dir. Just
# geoarrow.c and geoarrow.h for now.
install(FILES ${GEOARROW_H_TEMP} ${GEOARROW_C_TEMP} DESTINATION ".")

# If building tests, add the geoarrow target so we can test against it
if(GEOARROW_BUILD_TESTS)
add_library(geoarrow ${GEOARROW_C_TEMP})

target_include_directories(geoarrow
PUBLIC $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/amalgamation/geoarrow>
$<INSTALL_INTERFACE:include>)
target_compile_definitions(geoarrow PUBLIC "$<$<CONFIG:Debug>:NANOARROW_DEBUG>"
"$<$<CONFIG:Debug>:GEOARROW_DEBUG>")
endif()
else()
# Normal CMake build
add_library(geoarrow ${GEOARROW_SOURCES} ${GEOARROW_DOUBLE_PARSE_SOURCE}
${GEOARROW_DOUBLE_PRINT_SOURCE})

target_include_directories(geoarrow
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/geoarrow>
$<INSTALL_INTERFACE:include>)
target_include_directories(geoarrow
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/generated>
)
target_compile_definitions(geoarrow PUBLIC "$<$<CONFIG:Debug>:NANOARROW_DEBUG>"
"$<$<CONFIG:Debug>:GEOARROW_DEBUG>")

install(DIRECTORY src/
DESTINATION include
FILES_MATCHING
PATTERN "*.h")
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/generated/geoarrow_config.h
DESTINATION include/geoarrow)
endif()

install(TARGETS geoarrow DESTINATION lib)
install(DIRECTORY src/
DESTINATION include
FILES_MATCHING
PATTERN "*.h")
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/generated/geoarrow_config.h
DESTINATION include/geoarrow)
if(TARGET geoarrow)
install(TARGETS geoarrow DESTINATION lib)

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_compile_options(geoarrow
PRIVATE -Wall
-Werror
-Wextra
-Wno-type-limits
-Wno-unused-parameter
-Wpedantic
-Wunused-result)
elseif(CMAKE_C_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_C_COMPILER_ID STREQUAL
"Clang")
target_compile_options(geoarrow
PRIVATE -Wall
-Werror
-Wextra
-Wdocumentation
-Wno-unused-parameter
-Wshorten-64-to-32)
endif()
endif()
endif()

if(GEOARROW_BUILD_TESTS)
set(MEMORYCHECK_COMMAND_OPTIONS
Expand Down
9 changes: 9 additions & 0 deletions ci/scripts/build-docs.sh
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,16 @@ case $# in
;;
esac

maybe_activate_venv() {
# Because CI uses the nanoarrow image where this is defined
if [ ! -z "${NANOARROW_PYTHON_VENV}" ]; then
source "${NANOARROW_PYTHON_VENV}/bin/activate"
fi
}

main() {
maybe_activate_venv

pushd "${TARGET_GEOARROW_DIR}"

# Clean the previous build
Expand Down
2 changes: 1 addition & 1 deletion src/geoarrow/array_reader_test.cc
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

#include <gtest/gtest.h>

#include "geoarrow.h"
#include <geoarrow.h>

#include "wkx_testing.hpp"

Expand Down
2 changes: 1 addition & 1 deletion src/geoarrow/array_view_test.cc
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

#include <gtest/gtest.h>

#include "geoarrow.h"
#include <geoarrow.h>
#include "nanoarrow.h"

#include "wkx_testing.hpp"
Expand Down
2 changes: 1 addition & 1 deletion src/geoarrow/array_writer_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

#include <gtest/gtest.h>

#include "geoarrow.h"
#include <geoarrow.h>

#include "wkx_testing.hpp"

Expand Down
2 changes: 1 addition & 1 deletion src/geoarrow/builder_test.cc
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

#include <gtest/gtest.h>

#include "geoarrow.h"
#include <geoarrow.h>
#include "nanoarrow.h"

#include "wkx_testing.hpp"
Expand Down
1 change: 0 additions & 1 deletion src/geoarrow/geoarrow_arrow.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
#include <arrow/extension_type.h>
#include <arrow/type.h>

#include "geoarrow.h"
#include "geoarrow.hpp"

namespace geoarrow {
Expand Down
2 changes: 1 addition & 1 deletion src/geoarrow/geoarrow_arrow_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
#include <arrow/c/bridge.h>
#include <gtest/gtest.h>

#include "geoarrow_arrow.hpp"
#include <geoarrow_arrow.hpp>

using namespace arrow;

Expand Down
2 changes: 1 addition & 1 deletion src/geoarrow/geoarrow_hpp_test.cc
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

#include <gtest/gtest.h>

#include "geoarrow.hpp"
#include <geoarrow.hpp>

TEST(GeoArrowHppTest, GeoArrowHppTestVectorTypeMakeType) {
auto type = geoarrow::VectorType::Make(GEOARROW_TYPE_MULTIPOINT);
Expand Down
2 changes: 1 addition & 1 deletion src/geoarrow/geoarrow_type_inline_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

#include <gtest/gtest.h>

#include "geoarrow.h"
#include <geoarrow.h>

#include "wkx_testing.hpp"

Expand Down
2 changes: 1 addition & 1 deletion src/geoarrow/kernel_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

#include <gtest/gtest.h>

#include "geoarrow.h"
#include <geoarrow.h>
#include "nanoarrow.h"

TEST(KernelTest, KernelTestVoid) {
Expand Down
2 changes: 1 addition & 1 deletion src/geoarrow/metadata_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

#include <gtest/gtest.h>

#include "geoarrow.h"
#include <geoarrow.h>
#include "nanoarrow.h"

TEST(MetadataTest, MetadataTestEmpty) {
Expand Down
4 changes: 4 additions & 0 deletions src/geoarrow/nanoarrow.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@
(NANOARROW_VERSION_MAJOR * 10000 + NANOARROW_VERSION_MINOR * 100 + \
NANOARROW_VERSION_PATCH)

// When testing we use nanoarrow.h, but geoarrow_config.h won't exist in bundled
// mode. In the tests we just have to make sure geoarrow.h is always included first.
#if !defined(GEOARROW_CONFIG_H_INCLUDED)
#include "geoarrow_config.h"
#endif

#endif
// Licensed to the Apache Software Foundation (ASF) under one
Expand Down
2 changes: 1 addition & 1 deletion src/geoarrow/schema_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#include <arrow/c/bridge.h>
#include <gtest/gtest.h>

#include "geoarrow.h"
#include <geoarrow.h>

using namespace arrow;

Expand Down
Loading
Loading