diff --git a/.github/workflows/Java-alpine.yml b/.github/workflows/Java-alpine.yml new file mode 100644 index 000000000..39533f8f5 --- /dev/null +++ b/.github/workflows/Java-alpine.yml @@ -0,0 +1,59 @@ +name: DuckDB-JDBC Alpine Compilation + +on: + workflow_dispatch: + push: + branches: [ main ] + pull_request: + +jobs: + java-alpine-amd64: + name: Java Linux (Alpine x86_64) + runs-on: ubuntu-latest + container: + image: alpine:latest + env: + GEN: ninja + DUCKDB_PLATFORM: linux_amd64 + + steps: + - name: Prepare Alpine Container + shell: sh + + run: | + # Update package lists and install essential build tools + apk update + apk add --no-cache build-base gcc g++ libstdc++ cmake make ninja git pkgconfig boost-dev openjdk17 openjdk17-jdk + + rm -rf /var/cache/apk/* + + # Set Java environment variables + echo "JAVA_HOME=/usr/lib/jvm/java-17-openjdk" >> $GITHUB_ENV + echo "/usr/lib/jvm/java-17-openjdk/bin:${PATH}" >> $GITHUB_PATH + + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set Compiler Flags (Optional) + run: | + echo "CXXFLAGS=-Wno-stringop-overflow -Wno-return-local-addr -DICU_DISABLE_WARNINGS" >> $GITHUB_ENV + echo "CFLAGS=-Wno-stringop-overflow" >> $GITHUB_ENV + + - name: Build DuckDB JDBC + run: | + # Add any specific build commands for DuckDB-JDBC + # This might need adjustment based on your specific build process + echo $CFLAGS + echo $CXXFLAGS + make release + + - name: Package JDBC Artifact + run: | + # Copy or rename the JDBC jar as needed + cp build/release/duckdb_jdbc.jar duckdb_jdbc-linux-alpine-x86_64.jar + + - uses: actions/upload-artifact@v4 + with: + name: java-alpine-amd64 + path: build/release/duckdb_jdbc.jar \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index b418ee9d7..ce9b0167e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,7 +38,6 @@ else() set(CMAKE_C_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") endif() - set(OS_NAME "unknown") set(OS_ARCH "amd64") @@ -65,12 +64,46 @@ if(OVERRIDE_JDBC_OS_ARCH) set(OS_ARCH ${OVERRIDE_JDBC_OS_ARCH}) endif() + +# Function to check if the current system is Alpine Linux +function(is_alpine_linux RESULT) + if(UNIX AND NOT APPLE) + # Read the contents of /etc/os-release if it exists + if(EXISTS "/etc/os-release") + file(READ "/etc/os-release" OS_RELEASE_CONTENTS) + + # Check if the contents contain "Alpine Linux" + string(FIND "${OS_RELEASE_CONTENTS}" "Alpine Linux" ALPINE_FOUND) + + if(ALPINE_FOUND GREATER -1) + set(${RESULT} TRUE PARENT_SCOPE) + else() + set(${RESULT} FALSE PARENT_SCOPE) + endif() + else() + set(${RESULT} FALSE PARENT_SCOPE) + endif() + else() + set(${RESULT} FALSE PARENT_SCOPE) + endif() +endfunction() + +# Option to force static libcpp +option(STATIC_LIBCPP "Statically link C++ standard library" OFF) + +# Automatically detect and set STATIC_LIBCPP for Alpine +is_alpine_linux(IS_ALPINE) +if(IS_ALPINE) + set(STATIC_LIBCPP ON CACHE BOOL "Automatically enabled static linking for Alpine" FORCE) + message(STATUS "Detected Alpine Linux - Enabling static C++ library linking") +endif() + + add_jar(duckdb_jdbc ${JAVA_SRC_FILES} META-INF/services/java.sql.Driver GENERATE_NATIVE_HEADERS duckdb-native) add_jar(duckdb_jdbc_tests ${JAVA_TEST_FILES} INCLUDE_JARS duckdb_jdbc) - set(DUCKDB_SYSTEM_LIBS ${CMAKE_DL_LIBS}) if(MSVC) @@ -82,6 +115,11 @@ target_compile_options(duckdb_java PRIVATE -fexceptions) target_link_libraries(duckdb_java duckdb-native ) target_link_libraries(duckdb_java ${DUCKDB_SYSTEM_LIBS}) +if(STATIC_LIBCPP) + message("Statically linking C++ standard library") + target_link_libraries(duckdb_java -static-libstdc++ -static-libgcc) +endif() + string(JOIN "_" LIB_SUFFIX ".so" ${OS_NAME} ${OS_ARCH}) set_target_properties(duckdb_java PROPERTIES SUFFIX ${LIB_SUFFIX}) set_target_properties(duckdb_java PROPERTIES PREFIX "lib")