This is an automated email from the ASF dual-hosted git repository.
paleolimbot pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-nanoarrow.git
The following commit(s) were added to refs/heads/main by this push:
new 317fbab [C] Add namespacing option (#38)
317fbab is described below
commit 317fbab6a3ff1801e620c18e5531a4af891460ed
Author: Dewey Dunnington <[email protected]>
AuthorDate: Fri Sep 2 12:44:52 2022 -0300
[C] Add namespacing option (#38)
* allow namespacing
* test namespace
* with comma
* add test for non-prefixed symbols
* fix non-prefixed symbols except one to make sure the check fails
* undefine macro helpers
* fix indent on check
* don't undef helpers
* portable nm usage
* maybe actually print out symbols
* maybe fix bash symbol checker
* make sure we actually fail when there's a non-namespaced symbol
* fix what is maybe the last unnamespaced symbol
* message, not code
* dump symbols regardless of pass/fail
* quality of life improvements for action
* make it easier to define the NANOARROW_NAMEPSACE in the bundled build
* don't commit files to anything except the root repo
---
.github/workflows/build-and-test.yaml | 35 ++++++++++++++-
CMakeLists.txt | 11 ++++-
src/nanoarrow/array.c | 12 +++---
src/nanoarrow/build_id.h.in | 2 +
src/nanoarrow/nanoarrow.h | 80 +++++++++++++++++++++++++++++++++++
src/nanoarrow/schema.c | 4 +-
6 files changed, 131 insertions(+), 13 deletions(-)
diff --git a/.github/workflows/build-and-test.yaml
b/.github/workflows/build-and-test.yaml
index f9f502f..37dbb07 100644
--- a/.github/workflows/build-and-test.yaml
+++ b/.github/workflows/build-and-test.yaml
@@ -20,8 +20,12 @@ on:
branches: [main, master]
pull_request:
branches: [main, master]
+ paths:
+ - 'CMakeLists.txt'
+ - '.github/workflows/**'
+ - 'src/nanoarrow/**'
-name: Build and Test
+name: Build and Test C Library
jobs:
build-and-test:
@@ -35,6 +39,7 @@ jobs:
matrix:
config:
- {label: default-build}
+ - {label: namespaced-build}
- {label: bundled-build}
steps:
@@ -112,6 +117,16 @@ jobs:
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug
-DGTest_DIR=`pwd`/../dist/lib/cmake/GTest
-DArrow_DIR=`pwd`/../dist/lib/cmake/arrow
-DArrowTesting_DIR=`pwd`/../dist/lib/cmake/arrow -DNANOARROW_CODE_COVERAGE=ON
-DNANOARROW_BUILD_TESTS=ON
cmake --build .
+
+ - name: Build nanoarrow (namespaced)
+ if: matrix.config.label == 'namespaced-build'
+ run: |
+ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`/dist/lib
+ sudo ldconfig
+ mkdir build
+ cd build
+ cmake .. -DCMAKE_BUILD_TYPE=Debug
-DGTest_DIR=`pwd`/../dist/lib/cmake/GTest
-DArrow_DIR=`pwd`/../dist/lib/cmake/arrow
-DArrowTesting_DIR=`pwd`/../dist/lib/cmake/arrow -DNANOARROW_CODE_COVERAGE=ON
-DNANOARROW_BUILD_TESTS=ON -DNANOARROW_NAMESPACE=SomeUserNamespace
+ cmake --build .
- name: Build nanoarrow (bundled)
if: matrix.config.label == 'bundled-build'
@@ -122,6 +137,22 @@ jobs:
cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug
-DGTest_DIR=`pwd`/../dist/lib/cmake/GTest
-DArrow_DIR=`pwd`/../dist/lib/cmake/arrow
-DArrowTesting_DIR=`pwd`/../dist/lib/cmake/arrow -DNANOARROW_CODE_COVERAGE=ON
-DNANOARROW_BUILD_TESTS=ON -DNANOARROW_BUNDLE=ON
cmake --build .
+
+ - name: Check for non-namespaced symbols in namespaced build
+ if: matrix.config.label == 'namespaced-build'
+ run: |
+ # Dump all symbols
+ nm --extern-only build/libnanoarrow.a
+
+ # Check for non-namespaced ones
+ ARROW_SYMBOLS=`nm --extern-only build/libnanoarrow.a | grep "T
Arrow" || true`
+ if [ -z "$ARROW_SYMBOLS" ]; then
+ exit 0
+ fi
+
+ echo "Found the following non-namespaced extern symbols:"
+ echo $ARROW_SYMBOLS
+ exit 1
- name: Run tests
run: |
@@ -228,7 +259,7 @@ jobs:
path: nanoarrow-latest.zip
- name: Commit bundle to dist/
- if: success() && github.ref == 'refs/heads/main'
+ if: success() && github.repository == 'apache/arrow-nanoarrow' &&
github.ref == 'refs/heads/main'
run: |
cp nanoarrow-latest/nanoarrow.h dist/nanoarrow.h
cp nanoarrow-latest/nanoarrow.c dist/nanoarrow.c
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3ae6239..492cb5d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -23,11 +23,18 @@ project(NanoArrow)
option(NANOARROW_BUILD_TESTS "Build tests" OFF)
option(NANOARROW_BUNDLE "Create bundled nanoarrow.h and nanoarrow.c" OFF)
option(NANOARROW_BUILD_ID "A string identifying this build" OFF)
+option(NANOARROW_NAMESPACE "A prefix for exported symbols" OFF)
if (NOT NANOARROW_BUILD_ID)
string(RANDOM LENGTH 10 NANOARROW_BUILD_ID)
endif()
+if (NANOARROW_NAMESPACE)
+ set(NANOARROW_NAMESPACE_DEFINE "#define NANOARROW_NAMESPACE
${NANOARROW_NAMESPACE}")
+else()
+ set(NANOARROW_NAMESPACE_DEFINE "// #define NANOARROW_NAMESPACE
YourNamespaceHere")
+endif()
+
option(NANOARROW_CODE_COVERAGE "Enable coverage reporting" OFF)
add_library(coverage_config INTERFACE)
@@ -38,9 +45,9 @@ if(NANOARROW_BUNDLE)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/amalgamation)
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/amalgamation/nanoarrow)
set(NANOARROW_H_TEMP
${CMAKE_BINARY_DIR}/amalgamation/nanoarrow/nanoarrow.h)
- file(READ src/nanoarrow/nanoarrow_types.h SRC_FILE_CONTENTS)
- file(WRITE ${NANOARROW_H_TEMP} "${SRC_FILE_CONTENTS}")
file(READ ${CMAKE_BINARY_DIR}/generated/build_id.h SRC_FILE_CONTENTS)
+ file(WRITE ${NANOARROW_H_TEMP} "${SRC_FILE_CONTENTS}")
+ file(READ src/nanoarrow/nanoarrow_types.h SRC_FILE_CONTENTS)
file(APPEND ${NANOARROW_H_TEMP} "${SRC_FILE_CONTENTS}")
file(READ src/nanoarrow/nanoarrow.h SRC_FILE_CONTENTS)
file(APPEND ${NANOARROW_H_TEMP} "${SRC_FILE_CONTENTS}")
diff --git a/src/nanoarrow/array.c b/src/nanoarrow/array.c
index 0e71d7e..a84d6cc 100644
--- a/src/nanoarrow/array.c
+++ b/src/nanoarrow/array.c
@@ -64,8 +64,8 @@ static void ArrowArrayRelease(struct ArrowArray* array) {
array->release = NULL;
}
-ArrowErrorCode ArrowArraySetStorageType(struct ArrowArray* array,
- enum ArrowType storage_type) {
+static ArrowErrorCode ArrowArraySetStorageType(struct ArrowArray* array,
+ enum ArrowType storage_type) {
switch (storage_type) {
case NANOARROW_TYPE_UNINITIALIZED:
case NANOARROW_TYPE_NA:
@@ -361,8 +361,8 @@ static void ArrowArrayFlushInternalPointers(struct
ArrowArray* array) {
}
static ArrowErrorCode ArrowArrayCheckInternalBufferSizes(
- struct ArrowArray* array, struct ArrowArrayView* array_view,
- char set_length, struct ArrowError* error) {
+ struct ArrowArray* array, struct ArrowArrayView* array_view, char
set_length,
+ struct ArrowError* error) {
if (set_length) {
ArrowArrayViewSetLength(array_view, array->offset + array->length);
}
@@ -425,7 +425,6 @@ ArrowErrorCode ArrowArrayFinishBuilding(struct ArrowArray*
array,
return result;
}
-
void ArrowArrayViewInit(struct ArrowArrayView* array_view, enum ArrowType
storage_type) {
memset(array_view, 0, sizeof(struct ArrowArrayView));
array_view->storage_type = storage_type;
@@ -621,8 +620,7 @@ ArrowErrorCode ArrowArrayViewSetArray(struct
ArrowArrayView* array_view,
break;
case NANOARROW_TYPE_LIST:
if (array->n_children != 1) {
- ArrowErrorSet(error,
- "Expected 1 child of list array but found %d child
arrays",
+ ArrowErrorSet(error, "Expected 1 child of list array but found %d
child arrays",
(int)array->n_children);
return EINVAL;
}
diff --git a/src/nanoarrow/build_id.h.in b/src/nanoarrow/build_id.h.in
index 5d8c658..536cf60 100644
--- a/src/nanoarrow/build_id.h.in
+++ b/src/nanoarrow/build_id.h.in
@@ -18,6 +18,8 @@
#ifndef NANOARROW_BUILD_ID_H_INCLUDED
#define NANOARROW_BUILD_ID_H_INCLUDED
+@NANOARROW_NAMESPACE_DEFINE@
+
#define NANOARROW_BUILD_ID "@NANOARROW_BUILD_ID@"
#endif
diff --git a/src/nanoarrow/nanoarrow.h b/src/nanoarrow/nanoarrow.h
index 2167203..159b936 100644
--- a/src/nanoarrow/nanoarrow.h
+++ b/src/nanoarrow/nanoarrow.h
@@ -24,6 +24,86 @@
#include "nanoarrow_types.h"
+// If using CMake, optionally pass -DNANOARROW_NAMESPACE=MyNamespace which
will set this
+// define in build_id.h. If not, you can optionally #define NANOARROW_NAMESPACE
+// MyNamespace here.
+
+// This section remaps the non-prefixed symbols to the prefixed symbols so that
+// code written against this build can be used independent of the value of
+// NANOARROW_NAMESPACE.
+#ifdef NANOARROW_NAMESPACE
+#define NANOARROW_CAT(A, B) A##B
+#define NANOARROW_SYMBOL(A, B) NANOARROW_CAT(A, B)
+
+#define ArrowNanoarrowBuildId NANOARROW_SYMBOL(NANOARROW_NAMESPACE,
ArrowNanoarrowBuildId)
+#define ArrowErrorMessage NANOARROW_SYMBOL(NANOARROW_NAMESPACE,
ArrowErrorMessage)
+#define ArrowMalloc NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowMalloc)
+#define ArrowRealloc NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowRealloc)
+#define ArrowFree NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowFree)
+#define ArrowBufferAllocatorDefault \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowBufferAllocatorDefault)
+#define ArrowBufferDeallocator \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowBufferDeallocator)
+#define ArrowErrorSet NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowErrorSet)
+#define ArrowLayoutInit NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowLayoutInit)
+#define ArrowSchemaInit NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowSchemaInit)
+#define ArrowSchemaInitFixedSize \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowSchemaInitFixedSize)
+#define ArrowSchemaInitDecimal \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowSchemaInitDecimal)
+#define ArrowSchemaInitDateTime \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowSchemaInitDateTime)
+#define ArrowSchemaDeepCopy NANOARROW_SYMBOL(NANOARROW_NAMESPACE,
ArrowSchemaDeepCopy)
+#define ArrowSchemaSetFormat NANOARROW_SYMBOL(NANOARROW_NAMESPACE,
ArrowSchemaSetFormat)
+#define ArrowSchemaSetName NANOARROW_SYMBOL(NANOARROW_NAMESPACE,
ArrowSchemaSetName)
+#define ArrowSchemaSetMetadata \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowSchemaSetMetadata)
+#define ArrowSchemaAllocateChildren \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowSchemaAllocateChildren)
+#define ArrowSchemaAllocateDictionary \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowSchemaAllocateDictionary)
+#define ArrowMetadataReaderInit \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowMetadataReaderInit)
+#define ArrowMetadataReaderRead \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowMetadataReaderRead)
+#define ArrowMetadataSizeOf NANOARROW_SYMBOL(NANOARROW_NAMESPACE,
ArrowMetadataSizeOf)
+#define ArrowMetadataHasKey NANOARROW_SYMBOL(NANOARROW_NAMESPACE,
ArrowMetadataHasKey)
+#define ArrowMetadataGetValue NANOARROW_SYMBOL(NANOARROW_NAMESPACE,
ArrowMetadataGetValue)
+#define ArrowMetadataBuilderInit \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowMetadataBuilderInit)
+#define ArrowMetadataBuilderAppend \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowMetadataBuilderAppend)
+#define ArrowMetadataBuilderSet \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowMetadataBuilderSet)
+#define ArrowMetadataBuilderRemove \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowMetadataBuilderRemove)
+#define ArrowSchemaViewInit NANOARROW_SYMBOL(NANOARROW_NAMESPACE,
ArrowSchemaViewInit)
+#define ArrowArrayInit NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowArrayInit)
+#define ArrowArrayInitFromSchema \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowArrayInitFromSchema)
+#define ArrowArrayAllocateChildren \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowArrayAllocateChildren)
+#define ArrowArrayAllocateDictionary \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowArrayAllocateDictionary)
+#define ArrowArraySetValidityBitmap \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowArraySetValidityBitmap)
+#define ArrowArraySetBuffer NANOARROW_SYMBOL(NANOARROW_NAMESPACE,
ArrowArraySetBuffer)
+#define ArrowArrayReserve NANOARROW_SYMBOL(NANOARROW_NAMESPACE,
ArrowArrayReserve)
+#define ArrowArrayFinishBuilding \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowArrayFinishBuilding)
+#define ArrowArrayViewInit NANOARROW_SYMBOL(NANOARROW_NAMESPACE,
ArrowArrayViewInit)
+#define ArrowArrayViewInitFromSchema \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowArrayViewInitFromSchema)
+#define ArrowArrayViewAllocateChildren \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowArrayViewAllocateChildren)
+#define ArrowArrayViewSetLength \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowArrayViewSetLength)
+#define ArrowArrayViewSetArray \
+ NANOARROW_SYMBOL(NANOARROW_NAMESPACE, ArrowArrayViewSetArray)
+#define ArrowArrayViewReset NANOARROW_SYMBOL(NANOARROW_NAMESPACE,
ArrowArrayViewReset)
+
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif
diff --git a/src/nanoarrow/schema.c b/src/nanoarrow/schema.c
index 4a839a3..b498079 100644
--- a/src/nanoarrow/schema.c
+++ b/src/nanoarrow/schema.c
@@ -22,7 +22,7 @@
#include "nanoarrow.h"
-void ArrowSchemaRelease(struct ArrowSchema* schema) {
+static void ArrowSchemaRelease(struct ArrowSchema* schema) {
if (schema->format != NULL) ArrowFree((void*)schema->format);
if (schema->name != NULL) ArrowFree((void*)schema->name);
if (schema->metadata != NULL) ArrowFree((void*)schema->metadata);
@@ -63,7 +63,7 @@ void ArrowSchemaRelease(struct ArrowSchema* schema) {
schema->release = NULL;
}
-const char* ArrowSchemaFormatTemplate(enum ArrowType data_type) {
+static const char* ArrowSchemaFormatTemplate(enum ArrowType data_type) {
switch (data_type) {
case NANOARROW_TYPE_UNINITIALIZED:
return NULL;