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;

Reply via email to