diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8edf150..6524011 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,10 +15,20 @@ jobs: include: - os: ubuntu-latest TARGET: linux - PLATFORM: x64 + PLATFORM: x86_64 + CMAKE_ARGS: -DCMAKE_SYSTEM_PROCESSOR=x86_64 + - os: ubuntu-latest + TARGET: linux + PLATFORM: arm64 + CMAKE_ARGS: -DCMAKE_SYSTEM_PROCESSOR=aarch64 - os: macos-latest TARGET: macos - PLATFORM: x64 + PLATFORM: x86_64 + CMAKE_ARGS: -DCMAKE_OSX_ARCHITECTURES=x86_64 + - os: macos-latest + TARGET: macos + PLATFORM: arm64 + CMAKE_ARGS: -DCMAKE_OSX_ARCHITECTURES=arm64 steps: - name: 'Check out repository' uses: actions/checkout@v3 @@ -58,14 +68,13 @@ jobs: mkdir -p build conan install . --output-folder=build --build=missing cd build - cmake .. -DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release - cat conan_toolchain.cmake + cmake .. ${{ matrix.CMAKE_ARGS }} -DCMAKE_BUILD_TYPE=Release cmake --build . - name: artifacts uses: actions/upload-artifact@v3 with: - name: libjudy.${{ matrix.TARGET }} + name: libjudy-${{ matrix.PLATFORM }}.${{ matrix.TARGET }} path: build/libjudy* retention-days: 1 @@ -155,18 +164,30 @@ jobs: make java-sources mkdir src/main/resources - - name: libjudy.so + - name: libjudy-x86_64.linux uses: actions/download-artifact@v3 with: - name: libjudy.linux + name: libjudy-x86_64.linux path: build/src/main/resources/lib - - name: libjudy.dylib + - name: libjudy-x86_64.macos uses: actions/download-artifact@v3 with: - name: libjudy.macos + name: libjudy-x86_64.macos path: build/src/main/resources/lib + - name: libjudy-arm64.linux + uses: actions/download-artifact@v3 + with: + name: libjudy-arm64.linux + path: build/src/main/resources/lib + + - name: libjudy-arm64.macos + uses: actions/download-artifact@v3 + with: + name: libjudy-arm64.macos + path: build/src/main/resources/lib + - name: Display structure of downloaded files run: ls -R working-directory: build/src/main/resources diff --git a/CMakeLists.txt b/CMakeLists.txt index 432a7ec..e70f00d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,8 @@ cmake_minimum_required(VERSION 3.24) -project(judy LANGUAGES C CXX VERSION 0.0.1 DESCRIPTION "Multithreaded CPP UDP server consumable through the C ABI consumption") - -set(CMAKE_OSX_ARCHITECTURES "x86_64") +project(judy LANGUAGES C CXX VERSION 0.0.1 DESCRIPTION "Multithreaded C++ UDP server consumable through the C ABI consumption") execute_process(COMMAND date +'%Y.%m.%d' OUTPUT_VARIABLE JAR_VERSION) -execute_process(COMMAND uname -m COMMAND tr -d '\n' OUTPUT_VARIABLE ARCHITECTURE) if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(STDLIB_INCLUDE /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include) @@ -13,6 +10,89 @@ else() set(STDLIB_INCLUDE /usr/local/include) endif() +if(CMAKE_SYSTEM_NAME MATCHES "Linux") + set(LINUX TRUE) +elseif(WIN32) +elseif(APPLE) +else() + message(FATAL_ERROR "Platform is not supported") +endif() + +if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm" OR CMAKE_SYSTEM_PROCESSOR MATCHES "aarch") + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(ARCH "aarch64") + else() + set(ARCH "arm") + endif() +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^mips.*") + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(ARCH "mips64el") + else() + set(ARCH "mipsel") + endif() +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc.*") + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(ARCH "ppc64le") + else() + message(FATAL_ERROR "Architecture is not supported") + endif() +else() + if(CMAKE_SIZEOF_VOID_P EQUAL 8) + set(ARCH "x86_64") + else() + set(ARCH "x86") + endif() +endif() + +if(CMAKE_OSX_ARCHITECTURES) + if(CMAKE_OSX_ARCHITECTURES MATCHES "arm64") + set(ARCH "aarch64") + elseif(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64") + set(ARCH "x86_64") + elseif(CMAKE_OSX_ARCHITECTURES MATCHES "i386") + set(ARCH "x86") + else() + message(FATAL_ERROR "Architecture ${CMAKE_OSX_ARCHITECTURES} is not " + "supported. Only one architecture (arm64, x86_64 " + "or i386) could be specified at build time.") + endif() +endif() +set(CMAKE_MACOSX_RPATH TRUE) + + +macro(set_cpp_flag FLAG) + if(${ARGC} GREATER 1) + set(CMAKE_CXX_FLAGS_${ARGV1} "${CMAKE_CXX_FLAGS_${ARGV1}} ${FLAG}") + else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAG}") + endif() +endmacro() +macro(set_linker_flag FLAG) + if(${ARGC} GREATER 1) + set(CMAKE_EXE_LINKER_FLAGS_${ARGV1} "${CMAKE_EXE_LINKER_FLAGS_${ARGV1}} ${FLAG}") + set(CMAKE_SHARED_LINKER_FLAGS_${ARGV1} "${CMAKE_EXE_LINKER_FLAGS_${ARGV1}} ${FLAG}") + else() + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FLAG}") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FLAG}") + endif() +endmacro() + +if(ARCH STREQUAL "x86") + set_cpp_flag("-m32") + set_cpp_flag("-msse2") + set_cpp_flag("-mfpmath=sse") + set_cpp_flag("-march=pentium4") + set_cpp_flag("-mtune=generic") +endif() +if(ARCH STREQUAL "x86_64") + set_cpp_flag("-m64") + set_cpp_flag("-fPIC") + set_cpp_flag("-march=x86-64") + set_cpp_flag("-mtune=generic") +endif() + + + add_definitions("-std=c++14") add_compile_options(-pthread) @@ -26,11 +106,11 @@ message(STATUS "Found boost includes at " ${Boost_INCLUDE_DIR}) AUX_SOURCE_DIRECTORY(src SOURCES) add_executable(${PROJECT_NAME}-main ${SOURCES} ${HEADERS}) -add_library(${PROJECT_NAME}-${ARCHITECTURE} SHARED ${SOURCES} ${HEADERS}) +add_library(${PROJECT_NAME}-${ARCH} SHARED ${SOURCES} ${HEADERS}) target_include_directories(${PROJECT_NAME}-main PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) -target_include_directories(${PROJECT_NAME}-${ARCHITECTURE} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) +target_include_directories(${PROJECT_NAME}-${ARCH} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) target_link_libraries(${PROJECT_NAME}-main ${Boost_LIBRARIES} ) -target_link_libraries(${PROJECT_NAME}-${ARCHITECTURE} PRIVATE Threads::Threads) +target_link_libraries(${PROJECT_NAME}-${ARCH} PRIVATE Threads::Threads) add_custom_target( java-sources