From cc8adfe0f63ee26ba3d25d6487bd9a7d702435a6 Mon Sep 17 00:00:00 2001 From: Brian Hare Date: Fri, 5 Apr 2024 11:27:55 -0400 Subject: [PATCH 1/3] Problem: Out-of-date zproject Solution: Update zproject --- .clang-format | 56 ++ .editorconfig | 19 + .gitattributes | 4 + .github/workflows/CI.yaml | 93 +++ .obs/workflows.yml | 28 + CMakeLists.txt | 521 ++++++++++---- Dockerfile | 31 + Findczmq.cmake | 25 +- Findlibzmq.cmake | 80 ++- Jenkinsfile | 581 +++++++++++++++ Makefile.am | 39 +- Vagrantfile | 58 ++ autogen.sh | 9 +- .../org/zeromq/tools/ZmqNativeLoader.java | 137 ++++ bindings/nodejs/.gitignore | 11 + bindings/nodejs/.prebuildrc | 2 + bindings/nodejs/README.md | 44 ++ bindings/nodejs/binding.cc | 28 + bindings/nodejs/binding.gyp | 52 ++ bindings/nodejs/binding.h | 31 + bindings/nodejs/build.sh | 91 +++ bindings/nodejs/index.js | 19 + bindings/nodejs/package.json | 26 + bindings/ruby/lib/filemq/ffi.rb | 23 +- bindings/ruby/lib/filemq/ffi/version.rb | 4 +- bindings/ruby/spec/ffi_spec.rb | 4 +- builds/android/README.md | 129 ++++ builds/android/android_build_helper.sh | 564 +++++++++++---- builds/android/build.sh | 180 +++-- builds/android/ci_build.sh | 67 +- builds/check_zproject/ci_build.sh | 57 ++ builds/check_zproto/ci_build.sh | 26 + builds/cmake/Config.cmake.in | 4 + builds/cmake/Modules/ClangFormat.cmake | 62 ++ builds/cmake/ci_build.sh | 200 ++++++ builds/cmake/clang-format-check.sh.in | 30 + builds/cygwin/Makefile.cygwin | 13 +- builds/gyp/.gitignore | 7 + builds/gyp/README.md | 34 + builds/gyp/platform.h | 46 ++ builds/gyp/project.gyp | 115 +++ builds/ios/README.md | 24 + builds/ios/build.sh | 70 ++ builds/ios/ci_build.sh | 16 + builds/mingw32/Makefile.mingw32 | 9 +- builds/msvc/.gitignore | 1 + builds/msvc/configure.bat | 81 +++ builds/msvc/nuget/package.bat | 14 + builds/msvc/nuget/package.nuspec | 91 +++ builds/msvc/nuget/package.targets | 128 ++++ builds/msvc/nuget/package.xml | 29 + builds/msvc/platform.h | 21 +- builds/msvc/properties/Common.props | 42 +- builds/msvc/properties/DLL.props | 32 +- builds/msvc/properties/Debug.props | 58 +- builds/msvc/properties/DebugDEXE.props | 42 +- builds/msvc/properties/DebugDLL.props | 40 +- builds/msvc/properties/DebugLEXE.props | 40 +- builds/msvc/properties/DebugLIB.props | 42 +- builds/msvc/properties/DebugLTCG.props | 40 +- builds/msvc/properties/DebugSEXE.props | 42 +- builds/msvc/properties/EXE.props | 34 +- builds/msvc/properties/LIB.props | 32 +- builds/msvc/properties/LTCG.props | 26 +- builds/msvc/properties/Link.props | 42 +- builds/msvc/properties/Messages.props | 30 +- builds/msvc/properties/Output.props | 60 +- builds/msvc/properties/Release.props | 82 +-- builds/msvc/properties/ReleaseDEXE.props | 40 +- builds/msvc/properties/ReleaseDLL.props | 38 +- builds/msvc/properties/ReleaseLEXE.props | 40 +- builds/msvc/properties/ReleaseLIB.props | 38 +- builds/msvc/properties/ReleaseLTCG.props | 38 +- builds/msvc/properties/ReleaseSEXE.props | 40 +- builds/msvc/properties/Win32.props | 40 +- builds/msvc/properties/x64.props | 46 +- builds/msvc/resource.h | 28 +- builds/msvc/resource.rc | 188 ++--- builds/msvc/vs2008/filemq/filemq.sln | 130 ++-- builds/msvc/vs2008/filemq/filemq.vcproj | 660 +++++++++--------- builds/msvc/vs2010/build.bat | 181 +++-- builds/msvc/vs2010/filemq.import.props | 122 ++-- builds/msvc/vs2010/filemq.sln | 206 +++--- .../vs2010/filemq_client/filemq_client.props | 128 ++-- .../filemq_client/filemq_client.vcxproj | 292 ++++---- .../filemq_selftest/filemq_selftest.props | 128 ++-- .../filemq_selftest/filemq_selftest.vcxproj | 292 ++++---- .../vs2010/filemq_server/filemq_server.props | 128 ++-- .../filemq_server/filemq_server.vcxproj | 292 ++++---- .../vs2010/libfilemq/libfilemq.import.xml | 58 +- builds/msvc/vs2010/libfilemq/libfilemq.props | 143 ++-- .../msvc/vs2010/libfilemq/libfilemq.vcxproj | 223 +++--- .../libfilemq/libfilemq.vcxproj.filters | 163 ++--- builds/msvc/vs2012/build.bat | 181 +++-- builds/msvc/vs2012/filemq.import.props | 122 ++-- builds/msvc/vs2012/filemq.sln | 206 +++--- .../vs2012/filemq_client/filemq_client.props | 128 ++-- .../filemq_client/filemq_client.vcxproj | 292 ++++---- .../filemq_selftest/filemq_selftest.props | 128 ++-- .../filemq_selftest/filemq_selftest.vcxproj | 292 ++++---- .../vs2012/filemq_server/filemq_server.props | 128 ++-- .../filemq_server/filemq_server.vcxproj | 292 ++++---- .../vs2012/libfilemq/libfilemq.import.xml | 58 +- builds/msvc/vs2012/libfilemq/libfilemq.props | 143 ++-- .../msvc/vs2012/libfilemq/libfilemq.vcxproj | 223 +++--- .../libfilemq/libfilemq.vcxproj.filters | 163 ++--- builds/msvc/vs2013/build.bat | 181 +++-- builds/msvc/vs2013/filemq.import.props | 122 ++-- builds/msvc/vs2013/filemq.sln | 206 +++--- .../vs2013/filemq_client/filemq_client.props | 128 ++-- .../filemq_client/filemq_client.vcxproj | 292 ++++---- .../filemq_selftest/filemq_selftest.props | 128 ++-- .../filemq_selftest/filemq_selftest.vcxproj | 292 ++++---- .../vs2013/filemq_server/filemq_server.props | 128 ++-- .../filemq_server/filemq_server.vcxproj | 292 ++++---- .../vs2013/libfilemq/libfilemq.import.xml | 58 +- builds/msvc/vs2013/libfilemq/libfilemq.props | 143 ++-- .../msvc/vs2013/libfilemq/libfilemq.vcxproj | 223 +++--- .../libfilemq/libfilemq.vcxproj.filters | 163 ++--- builds/msvc/vs2015/build.bat | 181 +++-- builds/msvc/vs2015/filemq.import.props | 122 ++-- builds/msvc/vs2015/filemq.sln | 206 +++--- .../vs2015/filemq_client/filemq_client.props | 128 ++-- .../filemq_client/filemq_client.vcxproj | 292 ++++---- .../filemq_selftest/filemq_selftest.props | 128 ++-- .../filemq_selftest/filemq_selftest.vcxproj | 292 ++++---- .../vs2015/filemq_server/filemq_server.props | 128 ++-- .../filemq_server/filemq_server.vcxproj | 292 ++++---- .../vs2015/libfilemq/libfilemq.import.xml | 58 +- builds/msvc/vs2015/libfilemq/libfilemq.props | 143 ++-- .../msvc/vs2015/libfilemq/libfilemq.vcxproj | 223 +++--- .../libfilemq/libfilemq.vcxproj.filters | 163 ++--- builds/msvc/vs2017/build.bat | 115 +++ builds/msvc/vs2017/filemq.import.props | 59 ++ builds/msvc/vs2017/filemq.sln | 127 ++++ .../vs2017/filemq_client/filemq_client.props | 65 ++ .../filemq_client/filemq_client.vcxproj | 146 ++++ .../filemq_selftest/filemq_selftest.props | 65 ++ .../filemq_selftest/filemq_selftest.vcxproj | 146 ++++ .../vs2017/filemq_server/filemq_server.props | 65 ++ .../filemq_server/filemq_server.vcxproj | 146 ++++ .../vs2017/libfilemq/libfilemq.import.xml | 29 + builds/msvc/vs2017/libfilemq/libfilemq.props | 71 ++ .../msvc/vs2017/libfilemq/libfilemq.vcxproj | 113 +++ .../libfilemq/libfilemq.vcxproj.filters | 83 +++ builds/msvc/vs2019/build.bat | 115 +++ builds/msvc/vs2019/filemq.import.props | 59 ++ builds/msvc/vs2019/filemq.sln | 127 ++++ .../vs2019/filemq_client/filemq_client.props | 65 ++ .../filemq_client/filemq_client.vcxproj | 146 ++++ .../filemq_selftest/filemq_selftest.props | 65 ++ .../filemq_selftest/filemq_selftest.vcxproj | 146 ++++ .../vs2019/filemq_server/filemq_server.props | 65 ++ .../filemq_server/filemq_server.vcxproj | 146 ++++ .../vs2019/libfilemq/libfilemq.import.xml | 29 + builds/msvc/vs2019/libfilemq/libfilemq.props | 71 ++ .../msvc/vs2019/libfilemq/libfilemq.vcxproj | 113 +++ .../libfilemq/libfilemq.vcxproj.filters | 83 +++ builds/rpi/.gitignore | 9 + builds/rpi/README.md | 62 ++ builds/rpi/build.sh | 186 +++++ builds/rpi/build_image.sh | 32 + builds/rpi/prepare_img.sh | 111 +++ ci_build.sh | 451 +++++++++++- ci_deploy.sh | 29 + configure.ac | 564 ++++++++++----- doc/.gitignore | 31 + doc/Makefile.am | 105 ++- doc/asciidoc.conf | 2 +- doc/filemq.adoc | 51 ++ doc/mkman | 125 +++- include/Makefile.am | 20 + include/filemq_library.h | 72 +- packaging/debian/changelog | 5 + packaging/debian/compat | 2 +- packaging/debian/control | 74 +- packaging/debian/copyright | 13 + packaging/debian/filemq.dsc | 30 +- packaging/debian/filemq.install | 5 +- packaging/debian/filemq.manpages | 2 + packaging/debian/format | 1 + packaging/debian/libfilemq-dev.install | 3 + packaging/debian/libfilemq-dev.manpages | 2 + packaging/debian/libfilemq0.install | 1 + packaging/debian/rules | 92 ++- packaging/obs/_service | 85 +++ packaging/redhat/filemq.spec | 153 +++- src/.gitignore | 20 +- src/Makemodule.am | 475 +++++++++++-- src/filemq_classes.h | 38 +- src/filemq_private_selftest.c | 38 + src/filemq_selftest.c | 93 ++- src/libfilemq.pc.in | 8 +- src/selftest-ro/.gitkeep | 0 194 files changed, 14588 insertions(+), 6330 deletions(-) create mode 100644 .clang-format create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/workflows/CI.yaml create mode 100644 .obs/workflows.yml create mode 100644 Dockerfile create mode 100644 Jenkinsfile create mode 100644 Vagrantfile create mode 100644 bindings/jni/filemq-jni/src/main/java/org/zeromq/tools/ZmqNativeLoader.java create mode 100644 bindings/nodejs/.gitignore create mode 100644 bindings/nodejs/.prebuildrc create mode 100644 bindings/nodejs/README.md create mode 100644 bindings/nodejs/binding.cc create mode 100644 bindings/nodejs/binding.gyp create mode 100644 bindings/nodejs/binding.h create mode 100644 bindings/nodejs/build.sh create mode 100644 bindings/nodejs/index.js create mode 100644 bindings/nodejs/package.json create mode 100644 builds/android/README.md create mode 100644 builds/check_zproject/ci_build.sh create mode 100644 builds/check_zproto/ci_build.sh create mode 100644 builds/cmake/Config.cmake.in create mode 100644 builds/cmake/Modules/ClangFormat.cmake create mode 100644 builds/cmake/ci_build.sh create mode 100644 builds/cmake/clang-format-check.sh.in create mode 100644 builds/gyp/.gitignore create mode 100644 builds/gyp/README.md create mode 100644 builds/gyp/platform.h create mode 100644 builds/gyp/project.gyp create mode 100644 builds/ios/README.md create mode 100644 builds/ios/build.sh create mode 100644 builds/ios/ci_build.sh create mode 100644 builds/msvc/configure.bat create mode 100644 builds/msvc/nuget/package.bat create mode 100644 builds/msvc/nuget/package.nuspec create mode 100644 builds/msvc/nuget/package.targets create mode 100644 builds/msvc/nuget/package.xml create mode 100644 builds/msvc/vs2017/build.bat create mode 100644 builds/msvc/vs2017/filemq.import.props create mode 100644 builds/msvc/vs2017/filemq.sln create mode 100644 builds/msvc/vs2017/filemq_client/filemq_client.props create mode 100644 builds/msvc/vs2017/filemq_client/filemq_client.vcxproj create mode 100644 builds/msvc/vs2017/filemq_selftest/filemq_selftest.props create mode 100644 builds/msvc/vs2017/filemq_selftest/filemq_selftest.vcxproj create mode 100644 builds/msvc/vs2017/filemq_server/filemq_server.props create mode 100644 builds/msvc/vs2017/filemq_server/filemq_server.vcxproj create mode 100644 builds/msvc/vs2017/libfilemq/libfilemq.import.xml create mode 100644 builds/msvc/vs2017/libfilemq/libfilemq.props create mode 100644 builds/msvc/vs2017/libfilemq/libfilemq.vcxproj create mode 100644 builds/msvc/vs2017/libfilemq/libfilemq.vcxproj.filters create mode 100644 builds/msvc/vs2019/build.bat create mode 100644 builds/msvc/vs2019/filemq.import.props create mode 100644 builds/msvc/vs2019/filemq.sln create mode 100644 builds/msvc/vs2019/filemq_client/filemq_client.props create mode 100644 builds/msvc/vs2019/filemq_client/filemq_client.vcxproj create mode 100644 builds/msvc/vs2019/filemq_selftest/filemq_selftest.props create mode 100644 builds/msvc/vs2019/filemq_selftest/filemq_selftest.vcxproj create mode 100644 builds/msvc/vs2019/filemq_server/filemq_server.props create mode 100644 builds/msvc/vs2019/filemq_server/filemq_server.vcxproj create mode 100644 builds/msvc/vs2019/libfilemq/libfilemq.import.xml create mode 100644 builds/msvc/vs2019/libfilemq/libfilemq.props create mode 100644 builds/msvc/vs2019/libfilemq/libfilemq.vcxproj create mode 100644 builds/msvc/vs2019/libfilemq/libfilemq.vcxproj.filters create mode 100644 builds/rpi/.gitignore create mode 100644 builds/rpi/README.md create mode 100644 builds/rpi/build.sh create mode 100644 builds/rpi/build_image.sh create mode 100644 builds/rpi/prepare_img.sh create mode 100644 ci_deploy.sh create mode 100644 doc/.gitignore create mode 100644 doc/filemq.adoc create mode 100644 include/Makefile.am create mode 100644 packaging/debian/changelog create mode 100644 packaging/debian/copyright create mode 100644 packaging/debian/filemq.manpages create mode 100644 packaging/debian/format create mode 100644 packaging/debian/libfilemq-dev.install create mode 100644 packaging/debian/libfilemq-dev.manpages create mode 100644 packaging/debian/libfilemq0.install create mode 100644 packaging/obs/_service create mode 100644 src/filemq_private_selftest.c create mode 100644 src/selftest-ro/.gitkeep diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..95ab481 --- /dev/null +++ b/.clang-format @@ -0,0 +1,56 @@ +# This is a skeleton created by zproject. +# You can add hand-written code here. + +BasedOnStyle: LLVM +IndentWidth: 4 +UseTab: Never +BreakBeforeBraces: Custom +BraceWrapping: + AfterClass: true + AfterControlStatement: false + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: true + AfterStruct: true + AfterUnion: true + BeforeCatch: true + BeforeElse: false + IndentBraces: false + +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AllowShortIfStatementsOnASingleLine: false +IndentCaseLabels: true +BinPackArguments: true +BinPackParameters: false +AlignTrailingComments: true +AllowShortBlocksOnASingleLine: false +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortFunctionsOnASingleLine: InlineOnly +AlwaysBreakTemplateDeclarations: false +ColumnLimit: 80 +MaxEmptyLinesToKeep: 2 +KeepEmptyLinesAtTheStartOfBlocks: false +ContinuationIndentWidth: 2 +PointerAlignment: Right +ReflowComments: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: Always +SpaceInEmptyParentheses: false +SpacesInAngles: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: Cpp11 + +SortIncludes: false + +FixNamespaceComments: false +BreakBeforeBinaryOperators: NonAssignment +SpaceAfterTemplateKeyword: true +AlignAfterOpenBracket: Align +AlignOperands: true +BreakConstructorInitializers: AfterColon +ConstructorInitializerAllOnOneLineOrOnePerLine: true +SpaceAfterCStyleCast: true +BreakBeforeTernaryOperators: true diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8f728f7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +# This is a skeleton created by zproject. +# You can add hand-written code here. +# See http://editorconfig.org/ and https://github.com/editorconfig/ for +# details about the format and links to plugins for IDEs and editors which +# do not yet support this configuration out of the box - but easily can. + +# This is a top-level setting for project sources under this directory +root = true + +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true +charset = utf-8 + +[*.am] +indent_style = tab diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..ef0e563 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +# This is a skeleton created by zproject. +# You can add hand-written code here. +# disables auto CRLF conversion for all files; create the file correctly and it will be allright +* -text diff --git a/.github/workflows/CI.yaml b/.github/workflows/CI.yaml new file mode 100644 index 0000000..7ab236d --- /dev/null +++ b/.github/workflows/CI.yaml @@ -0,0 +1,93 @@ +# Github Actions CI script +# This is a skeleton created by zproject. +# You can add hand-written code here. + +name: CI +on: + push: + pull_request: + + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-20.04 + BUILD_TYPE: default + DRAFT: enabled + CLANG_FORMAT: clang-format-11 + PACKAGES: automake autoconf clang-format-11 git libzmq3-dev libczmq-dev asciidoc xmlto + - os: ubuntu-20.04 + BUILD_TYPE: default + DRAFT: disabled + CLANG_FORMAT: clang-format-11 + PACKAGES: automake autoconf clang-format-11 git libzmq3-dev libczmq-dev + - os: ubuntu-20.04 + BUILD_TYPE: valgrind + DRAFT: enabled + PACKAGES: automake autoconf valgrind git libzmq3-dev libczmq-dev + - os: ubuntu-20.04 + BUILD_TYPE: cmake + DRAFT: enabled + PACKAGES: cmake git libzmq3-dev libczmq-dev + - os: macos-latest + BUILD_TYPE: default + PACKAGES: automake autoconf zeromq + DRAFT: enabled + - os: macos-latest + BUILD_TYPE: default + DRAFT: disabled + PACKAGES: automake autoconf zeromq +# For non-cmake users, there is an autotools solution with a bit more overhead +# to have dependencies ready and pass configure script before making this check). +# Note that the autotools variant will also require dependencies preinstalled to +# pass its configure script: + - os: ubuntu-20.04 + BUILD_TYPE: cmake + DO_CLANG_FORMAT_CHECK: 1 + CLANG_FORMAT: clang-format-11 + PACKAGES: cmake clang-format-11 git libzmq3-dev libczmq-dev + env: +# Set CI_TIME: true to enable build-step profiling +# Set CI_TRACE: true to enable shell script tracing +# Set CI_CONFIG_QUIET: true to enable "configure --quiet" (only report stderr) +# Set CI_REQUIRE_GOOD_GITIGNORE: false to NOT fail if "git status -s" is not clean +# Set CI_REQUIRE_GOOD_CLANG_FORMAT: true to fail if "clang-format" check is not clean + CI_TIME: false + CI_TRACE: false + CI_CONFIG_QUIET: true + CI_REQUIRE_GOOD_GITIGNORE: false + CI_REQUIRE_GOOD_CLANG_FORMAT: false + CI_TEST_DISTCHECK: true + platform: ${{ matrix.platform }} + configuration: ${{ matrix.configuration }} + ENABLE_DRAFTS: ${{ matrix.ENABLE_DRAFTS }} + BUILD_TYPE: ${{ matrix.BUILD_TYPE }} + DRAFT: ${{ matrix.DRAFT }} + DO_CLANG_FORMAT_CHECK: ${{ matrix.DO_CLANG_FORMAT_CHECK }} + CLANG_FORMAT: ${{ matrix.CLANG_FORMAT }} + CI_SELFTEST: ${{ matrix.CI_SELFTEST }} + steps: + - name: Add debian packages + if: matrix.os == 'ubuntu-20.04' + uses: myci-actions/add-deb-repo@10 + with: + repo-name: obs + repo: deb http://download.opensuse.org/repositories/network:/messaging:/zeromq:/git-stable/xUbuntu_20.04/ ./ + keys-asc: https://download.opensuse.org/repositories/network:/messaging:/zeromq:/git-stable/xUbuntu_20.04/Release.key + install: ${{ matrix.PACKAGES }} + - name: Add brew packages + if: matrix.os == 'macos-latest' + shell: bash + run: brew install ${{ matrix.PACKAGES }} + - uses: actions/checkout@v2 + with: + path: filemq + - name: build + if: matrix.os == 'ubuntu-20.04' || matrix.os == 'macos-latest' + shell: bash + working-directory: filemq + run: ./ci_build.sh diff --git a/.obs/workflows.yml b/.obs/workflows.yml new file mode 100644 index 0000000..7152076 --- /dev/null +++ b/.obs/workflows.yml @@ -0,0 +1,28 @@ +pull_request: + steps: + - branch_package: + source_project: network:messaging:zeromq:git-draft + source_package: filemq + target_project: network:messaging:zeromq:ci + filters: + event: pull_request +merge: + steps: + - trigger_services: + project: network:messaging:zeromq:git-stable + package: filemq + filters: + event: push + branches: + only: + - master +release: + steps: + - trigger_services: + project: network:messaging:zeromq:release-stable + package: filemq + - trigger_services: + project: network:messaging:zeromq:release-draft + package: filemq + filters: + event: tag_push diff --git a/CMakeLists.txt b/CMakeLists.txt index 12e19b6..45d211d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,60 +1,38 @@ ################################################################################ # THIS FILE IS 100% GENERATED BY ZPROJECT; DO NOT EDIT EXCEPT EXPERIMENTALLY # -# Please refer to the README for information about making permanent changes. # +# Read the zproject/README.md for information about making permanent changes. # ################################################################################ ######################################################################## # Project setup ######################################################################## -cmake_minimum_required(VERSION 2.8) +cmake_minimum_required(VERSION 2.8.12) project(filemq) enable_language(C) enable_testing() set(SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") +set(CMAKE_EXPORT_COMPILE_COMMANDS 1) +# Select flags +if(MSVC) + SET(CMAKE_C_FLAGS_RELEASE "/O2") +else() + SET(CMAKE_C_FLAGS_RELEASE "-O3") +endif() -######################################################################## -# determine version -######################################################################## -foreach(which MAJOR MINOR PATCH) - file( - STRINGS - "${SOURCE_DIR}/include/filemq_library.h" - FILEMQ_VERSION_STRING REGEX - "#define FILEMQ_VERSION_${which}" - ) - string( - REGEX MATCH - "#define FILEMQ_VERSION_${which} ([0-9_]+)" - FILEMQ_REGEX_MATCH - "${FILEMQ_VERSION_STRING}" - ) - if (NOT FILEMQ_REGEX_MATCH) - message( - FATAL_ERROR - "failed to parse FILEMQ_VERSION_${which} from filemq.h" - ) - endif() - set(FILEMQ_${which}_VERSION ${CMAKE_MATCH_1}) -endforeach(which) +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/builds/cmake/Modules) -set( - FILEMQ_VERSION - ${FILEMQ_MAJOR_VERSION}.${FILEMQ_MINOR_VERSION}.${FILEMQ_PATCH_VERSION} -) +# Will be used to add flags to pkg-config useful when apps want to statically link +set(pkg_config_libs_private "") +set(pkg_config_names_private "") ######################################################################## # options ######################################################################## -if (EXISTS ".git") - OPTION (WITH_DRAFTS "Build and install draft classes and methods" ON) -else () - OPTION (WITH_DRAFTS "Build and install draft classes and methods" OFF) -endif () - -IF (WITH_DRAFTS) - ADD_DEFINITIONS (-DWITH_DRAFTS) -ENDIF (WITH_DRAFTS) +OPTION (ENABLE_DRAFTS "Build and install draft classes and methods" ON) +IF (ENABLE_DRAFTS) + ADD_DEFINITIONS (-DFILEMQ_BUILD_DRAFT_API) +ENDIF (ENABLE_DRAFTS) ######################################################################## # platform.h @@ -73,7 +51,9 @@ if (NOT HAVE_NET_IF_H) CHECK_INCLUDE_FILE("net/if.h" HAVE_NET_IF_H) endif() -file(WRITE "${SOURCE_DIR}/src/platform.h.in" " +file(REMOVE "${SOURCE_DIR}/src/platform.h") + +file(WRITE "${PROJECT_BINARY_DIR}/platform.h.in" " #cmakedefine HAVE_LINUX_WIRELESS_H #cmakedefine HAVE_NET_IF_H #cmakedefine HAVE_NET_IF_MEDIA_H @@ -81,20 +61,29 @@ file(WRITE "${SOURCE_DIR}/src/platform.h.in" " #cmakedefine HAVE_FREEIFADDRS ") -configure_file("${SOURCE_DIR}/src/platform.h.in" "${SOURCE_DIR}/src/platform.h") - -#The MSVC C compiler is too out of date, -#so the sources have to be compiled as c++ -if (MSVC) - enable_language(CXX) - file(GLOB sources "${SOURCE_DIR}/src/*.c") - set_source_files_properties( - ${sources} - PROPERTIES LANGUAGE CXX - ) +configure_file("${PROJECT_BINARY_DIR}/platform.h.in" "${PROJECT_BINARY_DIR}/platform.h") + +if (WIN32) + #The MSVC C compiler is too out of date, + #so the sources have to be compiled as c++ + if (MSVC AND NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) + enable_language(CXX) + file(GLOB sources "${SOURCE_DIR}/src/*.c") + set_source_files_properties( + ${sources} + PROPERTIES LANGUAGE CXX + ) + endif() set(MORE_LIBRARIES ws2_32 Rpcrt4 Iphlpapi) endif() +# specific case of windows UWP +if( "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore" AND "${CMAKE_SYSTEM_VERSION}" STREQUAL "10.0") + ADD_DEFINITIONS(-DZMQ_HAVE_WINDOWS_UWP) + ADD_DEFINITIONS(-D_WIN32_WINNT=_WIN32_WINNT_WIN10) +endif() + + # required libraries for mingw if (MINGW) set(MORE_LIBRARIES -lws2_32 -lrpcrt4 -liphlpapi) @@ -102,44 +91,60 @@ endif() # required libraries for cygwin if (CYGWIN) - set(MORE_LIBRARIES -luuid) + set(MORE_LIBRARIES) endif() list(APPEND CMAKE_MODULE_PATH "${SOURCE_DIR}") set(OPTIONAL_LIBRARIES) - -######################################################################## -# LIBSODIUM dependency -######################################################################## -find_package(libsodium) -IF (LIBSODIUM_FOUND) - include_directories(${LIBSODIUM_INCLUDE_DIRS}) - list(APPEND MORE_LIBRARIES ${LIBSODIUM_LIBRARIES}) - add_definitions(-DHAVE_LIBSODIUM) - list(APPEND OPTIONAL_LIBRARIES ${LIBSODIUM_LIBRARIES}) -ENDIF (LIBSODIUM_FOUND) +set(OPTIONAL_LIBRARIES_STATIC) ######################################################################## # LIBZMQ dependency ######################################################################## -find_package(libzmq REQUIRED) -IF (LIBZMQ_FOUND) - include_directories(${LIBZMQ_INCLUDE_DIRS}) - list(APPEND MORE_LIBRARIES ${LIBZMQ_LIBRARIES}) -ELSE (LIBZMQ_FOUND) +IF (NOT libzmq_FOUND) + find_package(libzmq REQUIRED) +ENDIF(NOT libzmq_FOUND) +IF (libzmq_FOUND) + include_directories(${libzmq_INCLUDE_DIRS}) + list(APPEND MORE_LIBRARIES ${libzmq_LIBRARIES}) + IF (PC_LIBZMQ_FOUND) + set(pkg_config_names_private "${pkg_config_names_private} libzmq") + list(APPEND OPTIONAL_LIBRARIES_STATIC ${PC_LIBZMQ_STATIC_LDFLAGS}) + ELSE (PC_LIBZMQ_FOUND) + set(pkg_config_libs_private "${pkg_config_libs_private} -lzmq") + ENDIF (PC_LIBZMQ_FOUND) +ELSE (libzmq_FOUND) message( FATAL_ERROR "libzmq not found." ) -ENDIF (LIBZMQ_FOUND) +ENDIF (libzmq_FOUND) ######################################################################## # CZMQ dependency ######################################################################## -find_package(czmq REQUIRED) -IF (CZMQ_FOUND) - include_directories(${CZMQ_INCLUDE_DIRS}) - list(APPEND MORE_LIBRARIES ${CZMQ_LIBRARIES}) -ELSE (CZMQ_FOUND) +IF (NOT czmq_FOUND) + find_package(czmq REQUIRED) +ENDIF(NOT czmq_FOUND) +IF (czmq_FOUND) + include_directories(${czmq_INCLUDE_DIRS}) + list(APPEND MORE_LIBRARIES ${czmq_LIBRARIES}) + IF (PC_CZMQ_FOUND) + set(pkg_config_names_private "${pkg_config_names_private} libczmq") + list(APPEND OPTIONAL_LIBRARIES_STATIC ${PC_CZMQ_STATIC_LDFLAGS}) + ELSE (PC_CZMQ_FOUND) + set(pkg_config_libs_private "${pkg_config_libs_private} -lczmq") + ENDIF (PC_CZMQ_FOUND) +ELSE (czmq_FOUND) message( FATAL_ERROR "czmq not found." ) -ENDIF (CZMQ_FOUND) +ENDIF (czmq_FOUND) + +######################################################################## +# version +######################################################################## +set(FILEMQ_VERSION_MAJOR 2) +set(FILEMQ_VERSION_MINOR 0) +set(FILEMQ_VERSION_PATCH 0) +set(FILEMQ_VERSION "${FILEMQ_VERSION_MAJOR}.${FILEMQ_VERSION_MINOR}.${FILEMQ_VERSION_PATCH}") +message(STATUS "Detected FILEMQ Version - ${FILEMQ_VERSION}") + ######################################################################## # includes @@ -149,13 +154,13 @@ set (filemq_headers include/filemq.h ) -IF (WITH_DRAFTS) -list(APPEND filemq_headers - include/fmq_msg.h - include/fmq_server.h - include/fmq_client.h -) -ENDIF (WITH_DRAFTS) +IF (ENABLE_DRAFTS) + list(APPEND filemq_headers + include/fmq_msg.h + include/fmq_server.h + include/fmq_client.h + ) +ENDIF (ENABLE_DRAFTS) source_group ("Header Files" FILES ${filemq_headers}) install(FILES ${filemq_headers} DESTINATION include) @@ -163,52 +168,139 @@ install(FILES ${filemq_headers} DESTINATION include) ######################################################################## # library ######################################################################## -include_directories("${SOURCE_DIR}/src" "${SOURCE_DIR}/include") + + +include_directories("${SOURCE_DIR}/src" "${SOURCE_DIR}/include" "${PROJECT_BINARY_DIR}") set (filemq_sources ) -IF (WITH_DRAFTS) -list(APPEND filemq_sources - src/fmq_msg.c - src/fmq_server.c - src/fmq_client.c -) -ENDIF (WITH_DRAFTS) +IF (ENABLE_DRAFTS) + list (APPEND filemq_sources + src/fmq_msg.c + src/fmq_server.c + src/fmq_client.c + ) +ENDIF (ENABLE_DRAFTS) + +IF (ENABLE_DRAFTS) + list (APPEND filemq_sources + src/filemq_private_selftest.c + ) +ENDIF (ENABLE_DRAFTS) source_group("Source Files" FILES ${filemq_sources}) -if (NOT DEFINED BUILD_SHARED_LIBS) - SET(BUILD_SHARED_LIBS ON) + + +option(FILEMQ_BUILD_SHARED "Whether or not to build the shared object" ON) +option(FILEMQ_BUILD_STATIC "Whether or not to build the static archive" ON) + +if (NOT FILEMQ_BUILD_SHARED AND NOT FILEMQ_BUILD_STATIC) + message(FATAL_ERROR "Neither static nor shared library build enabled") endif() -add_library(filemq ${filemq_sources}) -set_target_properties(filemq - PROPERTIES DEFINE_SYMBOL "LIBFILEMQ_EXPORTS" -) -set_target_properties(filemq - PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${SOURCE_DIR}/src" -) -target_link_libraries(filemq - ${ZEROMQ_LIBRARIES} ${MORE_LIBRARIES} -) -install(TARGETS filemq +IF (NOT MSVC) + # avoid building everything twice for shared + static + # only on *nix, as Windows needs different preprocessor defines in static builds + add_library (filemq_objects OBJECT ${filemq_sources}) + set_property(TARGET filemq_objects PROPERTY POSITION_INDEPENDENT_CODE ON) +ENDIF (NOT MSVC) + +# shared +if (FILEMQ_BUILD_SHARED) + IF (APPLE) + add_library(filemq SHARED ${filemq_sources}) + ELSE (APPLE) + IF (MSVC) + add_library(filemq SHARED ${filemq_sources}) + ELSE (MSVC) + add_library(filemq SHARED $) + ENDIF (MSVC) + ENDIF(APPLE) + + set_target_properties (filemq PROPERTIES + PUBLIC_HEADER "${public_headers}" + DEFINE_SYMBOL "FILEMQ_EXPORTS" + SOVERSION "0" + VERSION "${FILEMQ_VERSION}" + COMPILE_DEFINITIONS "DLL_EXPORT" + OUTPUT_NAME "filemq" + PREFIX "lib" + ) + + target_link_libraries(filemq + PUBLIC ${MORE_LIBRARIES} + ) + + install(TARGETS filemq + EXPORT filemq-targets LIBRARY DESTINATION "lib${LIB_SUFFIX}" # .so file ARCHIVE DESTINATION "lib${LIB_SUFFIX}" # .lib file - RUNTIME DESTINATION bin # .dll file -) + RUNTIME DESTINATION bin # .dll file + ) + + target_include_directories(filemq + PUBLIC + $ + $ + ) +endif() + +# static +if (FILEMQ_BUILD_STATIC) + IF (APPLE) + add_library(filemq-static STATIC ${filemq_sources}) + ELSE (APPLE) + IF (MSVC) + add_library(filemq-static STATIC ${filemq_sources}) + ELSE (MSVC) + add_library(filemq-static STATIC $) + ENDIF (MSVC) + ENDIF (APPLE) + + set_target_properties(filemq-static PROPERTIES + PUBLIC_HEADER "${public_headers}" + COMPILE_DEFINITIONS "FILEMQ_STATIC" + OUTPUT_NAME "filemq" + PREFIX "lib" + ) + + target_link_libraries(filemq-static + PUBLIC ${MORE_LIBRARIES} + ) + + install(TARGETS filemq-static + EXPORT filemq-targets + LIBRARY DESTINATION "lib${LIB_SUFFIX}" # .so file + ARCHIVE DESTINATION "lib${LIB_SUFFIX}" # .lib file + RUNTIME DESTINATION bin # .dll file + ) + + target_include_directories(filemq-static + PUBLIC + $ + $ + ) + target_compile_definitions(filemq-static + PUBLIC FILEMQ_STATIC + ) + +endif() + + ######################################################################## # pkgconfig ######################################################################## -set(VERSION "${FILEMQ_VERSION}") -set(prefix "${CMAKE_INSTALL_PREFIX}") -set(exec_prefix "\${prefix}") -set(libdir "\${prefix}/lib${LIB_SUFFIX}") -set(includedir "\${prefix}/include") -IF (WITH_DRAFTS) -set(pkg_config_defines "-DWITH_DRAFTS=1") -ELSE (WITH_DRAFTS) -set(pkg_config_defines "") -ENDIF (WITH_DRAFTS) +set (VERSION "2.0.0") +set (prefix "${CMAKE_INSTALL_PREFIX}") +set (exec_prefix "\${prefix}") +set (libdir "\${prefix}/lib${LIB_SUFFIX}") +set (includedir "\${prefix}/include") +IF (ENABLE_DRAFTS) + set (pkg_config_defines "-DFILEMQ_BUILD_DRAFT_API=1") +ELSE (ENABLE_DRAFTS) + set (pkg_config_defines "") +ENDIF (ENABLE_DRAFTS) configure_file( "${SOURCE_DIR}/src/libfilemq.pc.in" "${SOURCE_DIR}/src/libfilemq.pc" @@ -219,6 +311,34 @@ install( DESTINATION "lib${LIB_SUFFIX}/pkgconfig" ) +######################################################################## +# installer +######################################################################## +include(CMakePackageConfigHelpers) +if (WIN32) + set(CMAKECONFIG_INSTALL_DIR "CMake" CACHE STRING "install path for filemqConfig.cmake") +else() + # GNUInstallDirs "DATADIR" wrong here; CMake search path wants "share". + set(CMAKECONFIG_INSTALL_DIR "share/cmake/filemq" CACHE STRING "install path for filemqConfig.cmake") +endif() + +if (NOT CMAKE_VERSION VERSION_LESS 3.0) + export(EXPORT filemq-targets + FILE "${CMAKE_CURRENT_BINARY_DIR}/filemqTargets.cmake") +endif() +configure_package_config_file(builds/cmake/Config.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/filemqConfig.cmake" + INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR}) +write_basic_package_version_file(${CMAKE_CURRENT_BINARY_DIR}/filemqConfigVersion.cmake + VERSION ${FILEMQ_VERSION} + COMPATIBILITY AnyNewerVersion) +install(EXPORT filemq-targets + FILE filemqTargets.cmake + DESTINATION ${CMAKECONFIG_INSTALL_DIR}) +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/filemqConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/filemqConfigVersion.cmake + DESTINATION ${CMAKECONFIG_INSTALL_DIR}) + ######################################################################## # executables ######################################################################## @@ -226,6 +346,7 @@ add_executable( filemq_server "${SOURCE_DIR}/src/filemq_server.c" ) +if (TARGET filemq) target_link_libraries( filemq_server filemq @@ -233,14 +354,25 @@ target_link_libraries( ${CZMQ_LIBRARIES} ${OPTIONAL_LIBRARIES} ) -set_target_properties( +endif() +if (NOT TARGET filemq AND TARGET filemq-static) +target_link_libraries( filemq_server - PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${SOURCE_DIR}/src" + filemq-static + ${LIBZMQ_LIBRARIES} + ${CZMQ_LIBRARIES} + ${OPTIONAL_LIBRARIES} + ${OPTIONAL_LIBRARIES_STATIC} +) +endif() +install(TARGETS filemq_server + RUNTIME DESTINATION bin ) add_executable( filemq_client "${SOURCE_DIR}/src/filemq_client.c" ) +if (TARGET filemq) target_link_libraries( filemq_client filemq @@ -248,14 +380,25 @@ target_link_libraries( ${CZMQ_LIBRARIES} ${OPTIONAL_LIBRARIES} ) -set_target_properties( +endif() +if (NOT TARGET filemq AND TARGET filemq-static) +target_link_libraries( filemq_client - PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${SOURCE_DIR}/src" + filemq-static + ${LIBZMQ_LIBRARIES} + ${CZMQ_LIBRARIES} + ${OPTIONAL_LIBRARIES} + ${OPTIONAL_LIBRARIES_STATIC} +) +endif() +install(TARGETS filemq_client + RUNTIME DESTINATION bin ) add_executable( filemq_selftest "${SOURCE_DIR}/src/filemq_selftest.c" ) +if (TARGET filemq) target_link_libraries( filemq_selftest filemq @@ -263,47 +406,167 @@ target_link_libraries( ${CZMQ_LIBRARIES} ${OPTIONAL_LIBRARIES} ) -set_target_properties( +endif() +if (NOT TARGET filemq AND TARGET filemq-static) +target_link_libraries( filemq_selftest - PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${SOURCE_DIR}/src" + filemq-static + ${LIBZMQ_LIBRARIES} + ${CZMQ_LIBRARIES} + ${OPTIONAL_LIBRARIES} + ${OPTIONAL_LIBRARIES_STATIC} ) +endif() ######################################################################## # tests ######################################################################## -set(CLASSTEST_TIMEOUT 5 CACHE STRING "Timeout of the selftest of a class") -set(TOTAL_TIMEOUT 20 CACHE STRING "Timout of the total testsuite") +set(CLASSTEST_TIMEOUT 60 CACHE STRING "Timeout of the selftest of a class") +set(TOTAL_TIMEOUT 600 CACHE STRING "Timout of the total testsuite") + +if(UNIX) + find_program(MEMORYCHECK_COMMAND valgrind) + set(MEMORYCHECK_COMMAND_OPTIONS "--leak-check=full --show-reachable=yes + --error-exitcode=1 + --suppressions=src/.valgrind.supp") +endif() set(TEST_CLASSES ) -IF (WITH_DRAFTS) -list(APPEND TEST_CLASSES +IF (ENABLE_DRAFTS) + list (APPEND TEST_CLASSES fmq_msg fmq_server fmq_client + ) +ENDIF (ENABLE_DRAFTS) + + +if (NOT TARGET copy-selftest-ro) + add_custom_target( + copy-selftest-ro ALL + COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR}/src/selftest-ro ${PROJECT_BINARY_DIR}/src/selftest-ro + ) +endif() + +if (NOT TARGET make-selftest-rw) + add_custom_target( + make-selftest-rw ALL + COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_BINARY_DIR}/src/selftest-rw + ) +endif() + + +set_directory_properties( + PROPERTIES + ADDITIONAL_MAKE_CLEAN_FILES "${PROJECT_BINARY_DIR}/src/selftest-ro;${PROJECT_BINARY_DIR}/src/selftest-rw" ) -ENDIF (WITH_DRAFTS) foreach(TEST_CLASS ${TEST_CLASSES}) add_test( NAME ${TEST_CLASS} COMMAND filemq_selftest --continue --verbose --test ${TEST_CLASS} ) + IF (WIN32 AND CMAKE_PREFIX_PATH) + file(TO_NATIVE_PATH "${CMAKE_PREFIX_PATH}" CMAKE_PREFIX_PATH_WIN) + set_tests_properties( + ${TEST_CLASS} + PROPERTIES ENVIRONMENT "PATH=%PATH%\;${CMAKE_PREFIX_PATH_WIN}\\bin" + ) + ENDIF (WIN32 AND CMAKE_PREFIX_PATH) set_tests_properties( ${TEST_CLASS} PROPERTIES TIMEOUT ${CLASSTEST_TIMEOUT} ) + set_tests_properties( + ${TEST_CLASS} + PROPERTIES DEPENDS "copy-selftest-ro;make-selftest-rw" + ) endforeach(TEST_CLASS) +include(CTest) + +######################################################################## +# cleanup +######################################################################## +if (NOT TARGET distclean) + add_custom_target (distclean @echo Cleaning for source distribution) +endif() + +set(cmake_generated ${PROJECT_BINARY_DIR}/CMakeCache.txt + ${PROJECT_BINARY_DIR}/cmake_install.cmake + ${PROJECT_BINARY_DIR}/Makefile + ${PROJECT_BINARY_DIR}/CMakeFiles + ${PROJECT_BINARY_DIR}/CTestTestfile.cmake + ${PROJECT_BINARY_DIR}/DartConfiguration.tcl + ${PROJECT_BINARY_DIR}/Testing + ${PROJECT_BINARY_DIR}/compile_commands.json + ${PROJECT_BINARY_DIR}/platform.h + ${PROJECT_BINARY_DIR}/src/libfilemq.pc + ${PROJECT_BINARY_DIR}/src/libfilemq.so + ${PROJECT_BINARY_DIR}/src/filemq_selftest + ${PROJECT_BINARY_DIR}/src/filemq_server + ${PROJECT_BINARY_DIR}/src/filemq_client + ${PROJECT_BINARY_DIR}/src/filemq_selftest +) + +add_custom_command( + DEPENDS clean + COMMENT "distribution clean" + COMMAND rm + ARGS -rf CMakeTmp ${cmake_generated} + TARGET distclean +) + +include(ClangFormat OPTIONAL) ######################################################################## # summary ######################################################################## -message(STATUS "version: ${FILEMQ_VERSION}") -message(STATUS "install: ${CMAKE_INSTALL_PREFIX}") +message ("") +message (STATUS "******************* Configuration Summary *******************") +message (STATUS "General:") +message (STATUS " Version : ${VERSION}") +message (STATUS " System : ${CMAKE_SYSTEM_NAME}") +message (STATUS " C compiler : ${CMAKE_C_COMPILER}") +message (STATUS " Debug C flags : ${CMAKE_C_FLAGS_DEBUG} ${CMAKE_C_FLAGS}") +message (STATUS " Release C flags : ${CMAKE_C_FLAGS_RELEASE} ${CMAKE_C_FLAGS}") +message (STATUS " Build type : ${CMAKE_BUILD_TYPE}") +message (STATUS " Static build : ${FILEMQ_BUILD_STATIC}") +message (STATUS " Shared build : ${FILEMQ_BUILD_SHARED}") +IF (ENABLE_DRAFTS) +message (STATUS " Draft API : Yes") +ELSE (ENABLE_DRAFTS) +message (STATUS " Draft API : No") +ENDIF (ENABLE_DRAFTS) +message (STATUS "") +message (STATUS "Dependencies:") +include(FeatureSummary) +feature_summary (WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) +message (STATUS "") +message (STATUS "Install:") +message (STATUS " Install prefix :" "${CMAKE_INSTALL_PREFIX}") +message (STATUS "") +message (STATUS "************************* Options ***************************") +message (STATUS "Options:") +message (STATUS " Use the Draft API (default = yes):") +message (STATUS " -DENABLE-DRAFTS=[yes|no]") +message (STATUS "") +message (STATUS "*************************************************************") +message (STATUS "Configuration complete! Now procced with:") +message (STATUS " 'make' compile the project") +message (STATUS " 'make test' run the project's selftest") +message (STATUS " 'make install' install the project to ${CMAKE_INSTALL_PREFIX}") +message (STATUS "") +message (STATUS "Further options are:") +message (STATUS " 'ctest -V run test with verbose logging") +message (STATUS " 'ctest -R ' run a specific test") +message (STATUS " 'ctest -T memcheck' run the project's selftest with") +message (STATUS " valgrind to check for memory leaks") +message (STATUS "") ################################################################################ # THIS FILE IS 100% GENERATED BY ZPROJECT; DO NOT EDIT EXCEPT EXPERIMENTALLY # -# Please refer to the README for information about making permanent changes. # +# Read the zproject/README.md for information about making permanent changes. # ################################################################################ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..eb0b933 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,31 @@ +FROM ubuntu:latest +MAINTAINER filemq Developers + +RUN DEBIAN_FRONTEND=noninteractive apt-get update -y -q +RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -q --force-yes build-essential git-core libtool autotools-dev autoconf automake pkg-config unzip libkrb5-dev cmake +RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -q --force-yes \ + libzmq3-dev + +RUN useradd -d /home/zmq -m -s /bin/bash zmq +RUN echo "zmq ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers + +WORKDIR /tmp +RUN git clone --quiet https://github.com/zeromq/czmq.git czmq +WORKDIR /tmp/czmq +RUN ./autogen.sh 2> /dev/null +RUN ./configure --quiet --without-docs +RUN make +RUN make install +RUN ldconfig + +WORKDIR /tmp +RUN git clone --quiet https://github.com/zeromq/filemq filemq +WORKDIR /tmp/filemq +RUN ./autogen.sh 2> /dev/null +RUN ./configure --quiet --without-docs +RUN make +RUN make install +RUN ldconfig + + +USER zmq diff --git a/Findczmq.cmake b/Findczmq.cmake index 82bcbe2..7051873 100644 --- a/Findczmq.cmake +++ b/Findczmq.cmake @@ -1,15 +1,14 @@ ################################################################################ # THIS FILE IS 100% GENERATED BY ZPROJECT; DO NOT EDIT EXCEPT EXPERIMENTALLY # -# Please refer to the README for information about making permanent changes. # +# Read the zproject/README.md for information about making permanent changes. # ################################################################################ if (NOT MSVC) - include(FindPkgConfig) + find_package(PkgConfig) pkg_check_modules(PC_CZMQ "libczmq") - if (NOT PC_CZMQ_FOUND) - pkg_check_modules(PC_CZMQ "libczmq") - endif (NOT PC_CZMQ_FOUND) if (PC_CZMQ_FOUND) + # add CFLAGS from pkg-config file, e.g. draft api. + add_definitions(${PC_CZMQ_CFLAGS} ${PC_CZMQ_CFLAGS_OTHER}) # some libraries install the headers is a subdirectory of the include dir # returned by pkg-config, so use a wildcard match to improve chances of finding # headers and SOs. @@ -19,29 +18,29 @@ if (NOT MSVC) endif (NOT MSVC) find_path ( - CZMQ_INCLUDE_DIRS + ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS NAMES czmq.h HINTS ${PC_CZMQ_INCLUDE_HINTS} ) find_library ( - CZMQ_LIBRARIES - NAMES czmq + ${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES + NAMES libczmq czmq HINTS ${PC_CZMQ_LIBRARY_HINTS} ) include(FindPackageHandleStandardArgs) find_package_handle_standard_args( - CZMQ - REQUIRED_VARS CZMQ_LIBRARIES CZMQ_INCLUDE_DIRS + ${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS ${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ) mark_as_advanced( - CZMQ_FOUND - CZMQ_LIBRARIES CZMQ_INCLUDE_DIRS + ${CMAKE_FIND_PACKAGE_NAME}_FOUND + ${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ) ################################################################################ # THIS FILE IS 100% GENERATED BY ZPROJECT; DO NOT EDIT EXCEPT EXPERIMENTALLY # -# Please refer to the README for information about making permanent changes. # +# Read the zproject/README.md for information about making permanent changes. # ################################################################################ diff --git a/Findlibzmq.cmake b/Findlibzmq.cmake index 7073c73..4283136 100644 --- a/Findlibzmq.cmake +++ b/Findlibzmq.cmake @@ -1,15 +1,14 @@ ################################################################################ # THIS FILE IS 100% GENERATED BY ZPROJECT; DO NOT EDIT EXCEPT EXPERIMENTALLY # -# Please refer to the README for information about making permanent changes. # +# Read the zproject/README.md for information about making permanent changes. # ################################################################################ if (NOT MSVC) - include(FindPkgConfig) + find_package(PkgConfig) pkg_check_modules(PC_LIBZMQ "libzmq") - if (NOT PC_LIBZMQ_FOUND) - pkg_check_modules(PC_LIBZMQ "libzmq") - endif (NOT PC_LIBZMQ_FOUND) if (PC_LIBZMQ_FOUND) + # add CFLAGS from pkg-config file, e.g. draft api. + add_definitions(${PC_LIBZMQ_CFLAGS} ${PC_LIBZMQ_CFLAGS_OTHER}) # some libraries install the headers is a subdirectory of the include dir # returned by pkg-config, so use a wildcard match to improve chances of finding # headers and SOs. @@ -19,29 +18,78 @@ if (NOT MSVC) endif (NOT MSVC) find_path ( - LIBZMQ_INCLUDE_DIRS + ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS NAMES zmq.h HINTS ${PC_LIBZMQ_INCLUDE_HINTS} ) -find_library ( - LIBZMQ_LIBRARIES - NAMES zmq - HINTS ${PC_LIBZMQ_LIBRARY_HINTS} -) +if (MSVC) + # libzmq dll/lib built with MSVC is named using the Boost convention. + # https://github.com/zeromq/czmq/issues/577 + # https://github.com/zeromq/czmq/issues/1972 + if (MSVC_IDE) + set(MSVC_TOOLSET "-${CMAKE_VS_PLATFORM_TOOLSET}") + else () + set(MSVC_TOOLSET "") + endif () + + # Retrieve ZeroMQ version number from zmq.h + file(STRINGS "${${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS}/zmq.h" zmq_version_defines + REGEX "#define ZMQ_VERSION_(MAJOR|MINOR|PATCH)") + foreach(ver ${zmq_version_defines}) + if(ver MATCHES "#define ZMQ_VERSION_(MAJOR|MINOR|PATCH) +([^ ]+)$") + set(ZMQ_VERSION_${CMAKE_MATCH_1} "${CMAKE_MATCH_2}" CACHE INTERNAL "") + endif() + endforeach() + + set(_zmq_version ${ZMQ_VERSION_MAJOR}_${ZMQ_VERSION_MINOR}_${ZMQ_VERSION_PATCH}) + + set(_zmq_debug_names + "libzmq${MSVC_TOOLSET}-mt-gd-${_zmq_version}" # Debug, BUILD_SHARED + "libzmq${MSVC_TOOLSET}-mt-sgd-${_zmq_version}" # Debug, BUILD_STATIC + "libzmq-mt-gd-${_zmq_version}" # Debug, BUILD_SHARED + "libzmq-mt-sgd-${_zmq_version}" # Debug, BUILD_STATIC + ) + + set(_zmq_release_names + "libzmq${MSVC_TOOLSET}-mt-${_zmq_version}" # Release|RelWithDebInfo|MinSizeRel, BUILD_SHARED + "libzmq${MSVC_TOOLSET}-mt-s-${_zmq_version}" # Release|RelWithDebInfo|MinSizeRel, BUILD_STATIC + "libzmq-mt-${_zmq_version}" # Release|RelWithDebInfo|MinSizeRel, BUILD_SHARED + "libzmq-mt-s-${_zmq_version}" # Release|RelWithDebInfo|MinSizeRel, BUILD_STATIC + ) + + find_library (${CMAKE_FIND_PACKAGE_NAME}_LIBRARY_DEBUG + NAMES ${_zmq_debug_names} + ) + + find_library (${CMAKE_FIND_PACKAGE_NAME}_LIBRARY_RELEASE + NAMES ${_zmq_release_names} + ) + + include(SelectLibraryConfigurations) + select_library_configurations(${CMAKE_FIND_PACKAGE_NAME}) +endif () + +if (NOT ${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES) + find_library ( + ${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES + NAMES libzmq zmq + HINTS ${PC_LIBZMQ_LIBRARY_HINTS} + ) +endif () include(FindPackageHandleStandardArgs) find_package_handle_standard_args( - LIBZMQ - REQUIRED_VARS LIBZMQ_LIBRARIES LIBZMQ_INCLUDE_DIRS + ${CMAKE_FIND_PACKAGE_NAME} + REQUIRED_VARS ${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ) mark_as_advanced( - LIBZMQ_FOUND - LIBZMQ_LIBRARIES LIBZMQ_INCLUDE_DIRS + ${CMAKE_FIND_PACKAGE_NAME}_FOUND + ${CMAKE_FIND_PACKAGE_NAME}_LIBRARIES ${CMAKE_FIND_PACKAGE_NAME}_INCLUDE_DIRS ) ################################################################################ # THIS FILE IS 100% GENERATED BY ZPROJECT; DO NOT EDIT EXCEPT EXPERIMENTALLY # -# Please refer to the README for information about making permanent changes. # +# Read the zproject/README.md for information about making permanent changes. # ################################################################################ diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..a60be26 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,581 @@ +/* + filemq - A FileMQ server and client + + Copyright (c) the Contributors as noted in the AUTHORS file. + This file is part of FileMQ, a C implemenation of the protocol: + https://github.com/danriegsecker/filemq2. + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + + NOTE : This Jenkins pipeline script only handles the self-testing of your + project. If you also want the successful codebase published or deployed, + you can define a helper job - see the reference implementation skeleton at + https://github.com/zeromq/zproject/blob/master/Jenkinsfile-deploy.example + +*/ + +pipeline { + agent any + parameters { + // Use DEFAULT_DEPLOY_BRANCH_PATTERN and DEFAULT_DEPLOY_JOB_NAME if + // defined in this jenkins setup -- in Jenkins Management Web-GUI + // see Configure System / Global properties / Environment variables + // Default (if unset) is empty => no deployment attempt after good test + // See zproject Jenkinsfile-deploy.example for an example deploy job. + // TODO: Try to marry MultiBranchPipeline support with pre-set defaults + // directly in MultiBranchPipeline plugin, or mechanism like Credentials, + // or a config file uploaded to master for all jobs or this job, see + // https://jenkins.io/doc/pipeline/examples/#configfile-provider-plugin + string ( + defaultValue: '${DEFAULT_DEPLOY_BRANCH_PATTERN}', + description: 'Regular expression of branch names for which a deploy action would be attempted after a successful build and test; leave empty to not deploy. Reasonable value is ^(master|release/.*|feature/*)$', + name : 'DEPLOY_BRANCH_PATTERN') + string ( + defaultValue: '${DEFAULT_DEPLOY_JOB_NAME}', + description: 'Name of your job that handles deployments and should accept arguments: DEPLOY_GIT_URL DEPLOY_GIT_BRANCH DEPLOY_GIT_COMMIT -- and it is up to that job what to do with this knowledge (e.g. git archive + push to packaging); leave empty to not deploy', + name : 'DEPLOY_JOB_NAME') + booleanParam ( + defaultValue: true, + description: 'If the deployment is done, should THIS job wait for it to complete and include its success or failure as the build result (true), or should it schedule the job and exit quickly to free up the executor (false)', + name: 'DEPLOY_REPORT_RESULT') + booleanParam ( + defaultValue: false, + description: 'Attempt stable build without DRAFT API in this run?', + name: 'DO_BUILD_WITHOUT_DRAFT_API') + booleanParam ( + defaultValue: true, + description: 'Attempt build with DRAFT API in this run?', + name: 'DO_BUILD_WITH_DRAFT_API') + choice ( + choices: 'auto\nyes\nno', + description: 'Enable pedantic compiler options for common builds (auto turns into yes for GCC builds)?', + name: 'ENABLE_WERROR') + booleanParam ( + defaultValue: false, + description: 'Attempt a build with docs in this run? (Note: corresponding tools are required in the build environment)', + name: 'DO_BUILD_DOCS') + booleanParam ( + defaultValue: false, + description: 'Publish as an archive a "dist" tarball from a build with docs in this run? (Note: corresponding tools are required in the build environment; enabling this enforces DO_BUILD_DOCS too)', + name: 'DO_DIST_DOCS') + booleanParam ( + defaultValue: true, + description: 'Attempt "make check" in this run?', + name: 'DO_TEST_CHECK') + booleanParam ( + defaultValue: true, + description: 'Attempt "make memcheck" in this run?', + name: 'DO_TEST_MEMCHECK') + booleanParam ( + defaultValue: true, + description: 'Attempt "make distcheck" in this run?', + name: 'DO_TEST_DISTCHECK') + booleanParam ( + defaultValue: true, + description: 'Attempt a "make install" check in this run?', + name: 'DO_TEST_INSTALL') + string ( + defaultValue: "`pwd`/tmp/_inst", + description: 'If attempting a "make install" check in this run, what DESTDIR to specify? (absolute path, defaults to "BUILD_DIR/tmp/_inst")', + name: 'USE_TEST_INSTALL_DESTDIR') + booleanParam ( + defaultValue: true, + description: 'Attempt "cppcheck" analysis before this run? (Note: corresponding tools are required in the build environment)', + name: 'DO_CPPCHECK') + booleanParam ( + defaultValue: true, + description: 'Require that there are no files not discovered changed/untracked via .gitignore after builds and tests?', + name: 'CI_REQUIRE_GOOD_GITIGNORE') + booleanParam ( + defaultValue: true, + description: 'Attempt "clang-format" (v5+) analysis before this run? (Note: corresponding tools are required in the build environment)', + name: 'DO_CHECK_CLANG_FORMAT') + booleanParam ( + defaultValue: false, + description: 'Require that if clang-format is executed, then it must show no differences in codebase?', + name: 'CI_REQUIRE_GOOD_CLANG_FORMAT') + string ( + defaultValue: "", + description: 'The clang-format program (v5+) to use for this build, e.g. clang-format-5.0; an empty value means configure-time guesswork', + name: 'CLANG_FORMAT') + string ( + defaultValue: "30", + description: 'When running tests, use this timeout (in minutes; be sure to leave enough for double-job of a distcheck too)', + name: 'USE_TEST_TIMEOUT') + booleanParam ( + defaultValue: false, + description: 'Try to collect CCACHE logs in the build workspace during this run, to analyze the build behavior?', + name: 'USE_CCACHE_LOGGING') + booleanParam ( + defaultValue: true, + description: 'When using temporary subdirs in build/test workspaces, wipe them right after each successful build stage?', + name: 'DO_CLEANUP_AFTER_BUILD') + booleanParam ( + defaultValue: true, + description: 'When using temporary subdirs in build/test workspaces, wipe them after the whole job is done successfully?', + name: 'DO_CLEANUP_AFTER_JOB') + booleanParam ( + defaultValue: false, + description: 'When using temporary subdirs in build/test workspaces, wipe them after the whole job is done unsuccessfully (failed)? Note this would not allow postmortems on CI server, but would conserve its disk space.', + name: 'DO_CLEANUP_AFTER_FAILED_JOB') + } + triggers { + pollSCM 'H/5 * * * *' + } +// Note: your Jenkins setup may benefit from similar setup on side of agents: +// PATH="/usr/lib64/ccache:/usr/lib/ccache:/usr/bin:/bin:${PATH}" + stages { + stage ('pre-clean') { + steps { + dir("tmp") { + sh 'if [ -s Makefile ]; then make -k distclean || true ; fi' + sh 'chmod -R u+w .' + deleteDir() + } + sh 'rm -f ccache.log cppcheck.xml' + } + } + stage ('prepare') { + steps { + sh './autogen.sh' + stash (name: 'prepped', includes: '**/*', excludes: '**/cppcheck.xml') + } + } + stage ('compile') { + parallel { + stage ('build with DRAFT') { + when { expression { return ( params.DO_BUILD_WITH_DRAFT_API ) } } + steps { + dir("tmp/build-withDRAFT") { + deleteDir() + unstash 'prepped' + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then rm -f ccache.log ; CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; ./configure --enable-drafts=yes --enable-Werror="${params.ENABLE_WERROR}" --with-docs=no""" + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; make -k -j4 || make""" + sh """ echo "Are GitIgnores good after make with drafts?"; make CI_REQUIRE_GOOD_GITIGNORE="${params.CI_REQUIRE_GOOD_GITIGNORE}" check-gitignore """ + stash (name: 'built-draft', includes: '**/*', excludes: '**/cppcheck.xml') + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + stage ('build without DRAFT') { + when { expression { return ( params.DO_BUILD_WITHOUT_DRAFT_API ) } } + steps { + dir("tmp/build-withoutDRAFT") { + deleteDir() + unstash 'prepped' + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then rm -f ccache.log ; CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; ./configure --enable-drafts=no --enable-Werror="${params.ENABLE_WERROR}" --with-docs=no""" + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; make -k -j4 || make""" + sh """ echo "Are GitIgnores good after make without drafts?"; make CI_REQUIRE_GOOD_GITIGNORE="${params.CI_REQUIRE_GOOD_GITIGNORE}" check-gitignore """ + stash (name: 'built-nondraft', includes: '**/*', excludes: '**/cppcheck.xml') + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + stage ('build with DOCS') { + when { expression { return ( params.DO_BUILD_DOCS || params.DO_DIST_DOCS ) } } + steps { + dir("tmp/build-DOCS") { + deleteDir() + unstash 'prepped' + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then rm -f ccache.log ; CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; ./configure --enable-drafts=yes --with-docs=yes --enable-Werror=no""" + script { + if ( params.DO_DIST_DOCS ) { + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; make dist-gzip || exit ; DISTFILE="`ls -1tc *.tar.gz | head -1`" && [ -n "\$DISTFILE" ] && [ -s "\$DISTFILE" ] || exit ; mv -f "\$DISTFILE" __dist.tar.gz""" + archiveArtifacts artifacts: '__dist.tar.gz' + sh "rm -f __dist.tar.gz" + } + } + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; make -k -j4 || make""" + sh """ echo "Are GitIgnores good after make with docs?"; make CI_REQUIRE_GOOD_GITIGNORE="${params.CI_REQUIRE_GOOD_GITIGNORE}" check-gitignore """ + stash (name: 'built-docs', includes: '**/*', excludes: '**/cppcheck.xml') + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + } + } + stage ('check') { + parallel { + stage ('cppcheck') { + when { expression { return ( params.DO_CPPCHECK ) } } + steps { + dir("tmp/test-cppcheck") { + deleteDir() + script { + // We need a configured source codebase to run + // "make", any variant will do. Save some time + // by using a build tree (if exists), but can + // fall back to running the configure script + // explicitly. + if ( params.DO_BUILD_WITH_DRAFT_API ) { + unstash 'built-draft' + } else if ( params.DO_BUILD_WITHOUT_DRAFT_API ) { + unstash 'built-nondraft' + } else if ( params.DO_BUILD_DOCS || params.DO_DIST_DOCS ) { + unstash 'built-docs' + } else { + unstash 'prepped' + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then rm -f ccache.log ; CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; ./configure --enable-drafts=no --enable-Werror="${params.ENABLE_WERROR}" --with-docs=no""" + } + } + sh 'rm -f cppcheck.xml' + // This make target should produce a cppcheck.xml if tool is available + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; make cppcheck""" + archiveArtifacts artifacts: '**/cppcheck.xml', allowEmptyArchive: true + sh 'rm -f cppcheck.xml' + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + stage ('clang-format-check') { + when { expression { return ( params.DO_CHECK_CLANG_FORMAT ) } } + steps { + dir("tmp/test-clang-format-check") { + deleteDir() + script { + // We need a configured source codebase to run + // "make", any variant will do. Save some time + // by using a build tree (if exists), but can + // fall back to running the configure script + // explicitly. + if ( params.DO_BUILD_WITH_DRAFT_API ) { + unstash 'built-draft' + } else if ( params.DO_BUILD_WITHOUT_DRAFT_API ) { + unstash 'built-nondraft' + } else if ( params.DO_BUILD_DOCS || params.DO_DIST_DOCS ) { + unstash 'built-docs' + } else { + unstash 'prepped' + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then rm -f ccache.log ; CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; ./configure --enable-drafts=no --enable-Werror="${params.ENABLE_WERROR}" --with-docs=no""" + } + } + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; make clang-format-check-CI""" + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + stage ('check with DRAFT') { + when { expression { return ( params.DO_BUILD_WITH_DRAFT_API && params.DO_TEST_CHECK ) } } + steps { + dir("tmp/test-check-withDRAFT") { + script { + def RETRY_NUMBER = 0 + deleteDir() + unstash 'built-draft' + timeout (time: "${params.USE_TEST_TIMEOUT}".toInteger(), unit: 'MINUTES') { + try { + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; LD_LIBRARY_PATH="`pwd`/src/.libs:\$LD_LIBRARY_PATH"; export LD_LIBRARY_PATH; make LD_LIBRARY_PATH="\$LD_LIBRARY_PATH" check""" + } + catch (Exception e) { + currentBuild.result = 'UNSTABLE' // Jenkins should not let the verdict "improve" + sh """D="`pwd`"; B="`basename "\$D"`" ; [ "${RETRY_NUMBER}" -gt 0 ] && T="_try-${RETRY_NUMBER}" || T="" ; tar czf "test-suite_${BUILD_TAG}_\${B}\${T}.tar.gz" `find . -name '*.trs'` `find . -name '*.log'`""" + archiveArtifacts artifacts: "**/test-suite*.tar.gz", allowEmptyArchive: true + throw e + } + } + } + sh """ echo "Are GitIgnores good after make check with drafts?"; make CI_REQUIRE_GOOD_GITIGNORE="${params.CI_REQUIRE_GOOD_GITIGNORE}" check-gitignore """ + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + stage ('check without DRAFT') { + when { expression { return ( params.DO_BUILD_WITHOUT_DRAFT_API && params.DO_TEST_CHECK ) } } + steps { + dir("tmp/test-check-withoutDRAFT") { + script { + def RETRY_NUMBER = 0 + deleteDir() + unstash 'built-nondraft' + timeout (time: "${params.USE_TEST_TIMEOUT}".toInteger(), unit: 'MINUTES') { + try { + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; LD_LIBRARY_PATH="`pwd`/src/.libs:\$LD_LIBRARY_PATH"; export LD_LIBRARY_PATH; make LD_LIBRARY_PATH="\$LD_LIBRARY_PATH" check""" + } + catch (Exception e) { + currentBuild.result = 'UNSTABLE' // Jenkins should not let the verdict "improve" + sh """D="`pwd`"; B="`basename "\$D"`" ; [ "${RETRY_NUMBER}" -gt 0 ] && T="_try-${RETRY_NUMBER}" || T="" ; tar czf "test-suite_${BUILD_TAG}_\${B}\${T}.tar.gz" `find . -name '*.trs'` `find . -name '*.log'`""" + archiveArtifacts artifacts: "**/test-suite*.tar.gz", allowEmptyArchive: true + throw e + } + } + } + sh """ echo "Are GitIgnores good after make check without drafts?"; make CI_REQUIRE_GOOD_GITIGNORE="${params.CI_REQUIRE_GOOD_GITIGNORE}" check-gitignore """ + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + stage ('memcheck with DRAFT') { + when { expression { return ( params.DO_BUILD_WITH_DRAFT_API && params.DO_TEST_MEMCHECK ) } } + steps { + dir("tmp/test-memcheck-withDRAFT") { + script { + def RETRY_NUMBER = 0 + deleteDir() + unstash 'built-draft' + timeout (time: "${params.USE_TEST_TIMEOUT}".toInteger(), unit: 'MINUTES') { + try { + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; LD_LIBRARY_PATH="`pwd`/src/.libs:\$LD_LIBRARY_PATH"; export LD_LIBRARY_PATH; make LD_LIBRARY_PATH="\$LD_LIBRARY_PATH" memcheck && exit 0 ; echo "Re-running failed (\$?) memcheck with greater verbosity" >&2 ; make LD_LIBRARY_PATH="\$LD_LIBRARY_PATH" VERBOSE=1 memcheck-verbose""" + } + catch (Exception e) { + currentBuild.result = 'UNSTABLE' // Jenkins should not let the verdict "improve" + sh """D="`pwd`"; B="`basename "\$D"`" ; [ "${RETRY_NUMBER}" -gt 0 ] && T="_try-${RETRY_NUMBER}" || T="" ; tar czf "test-suite_${BUILD_TAG}_\${B}\${T}.tar.gz" `find . -name '*.trs'` `find . -name '*.log'`""" + archiveArtifacts artifacts: "**/test-suite*.tar.gz", allowEmptyArchive: true + throw e + } + } + } + sh """ echo "Are GitIgnores good after make memcheck with drafts?"; make CI_REQUIRE_GOOD_GITIGNORE="${params.CI_REQUIRE_GOOD_GITIGNORE}" check-gitignore """ + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + stage ('memcheck without DRAFT') { + when { expression { return ( params.DO_BUILD_WITHOUT_DRAFT_API && params.DO_TEST_MEMCHECK ) } } + steps { + dir("tmp/test-memcheck-withoutDRAFT") { + script { + def RETRY_NUMBER = 0 + deleteDir() + unstash 'built-nondraft' + timeout (time: "${params.USE_TEST_TIMEOUT}".toInteger(), unit: 'MINUTES') { + try { + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; LD_LIBRARY_PATH="`pwd`/src/.libs:\$LD_LIBRARY_PATH"; export LD_LIBRARY_PATH; make LD_LIBRARY_PATH="\$LD_LIBRARY_PATH" memcheck && exit 0 ; echo "Re-running failed (\$?) memcheck with greater verbosity" >&2 ; make LD_LIBRARY_PATH="\$LD_LIBRARY_PATH" VERBOSE=1 memcheck-verbose""" + } + catch (Exception e) { + currentBuild.result = 'UNSTABLE' // Jenkins should not let the verdict "improve" + sh """D="`pwd`"; B="`basename "\$D"`" ; [ "${RETRY_NUMBER}" -gt 0 ] && T="_try-${RETRY_NUMBER}" || T="" ; tar czf "test-suite_${BUILD_TAG}_\${B}\${T}.tar.gz" `find . -name '*.trs'` `find . -name '*.log'`""" + archiveArtifacts artifacts: "**/test-suite*.tar.gz", allowEmptyArchive: true + throw e + } + } + } + sh """ echo "Are GitIgnores good after make memcheck without drafts?"; make CI_REQUIRE_GOOD_GITIGNORE="${params.CI_REQUIRE_GOOD_GITIGNORE}" check-gitignore """ + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + stage ('distcheck with DRAFT') { + when { expression { return ( params.DO_BUILD_WITH_DRAFT_API && params.DO_TEST_DISTCHECK ) } } + steps { + dir("tmp/test-distcheck-withDRAFT") { + script { + def RETRY_NUMBER = 0 + deleteDir() + unstash 'built-draft' + timeout (time: "${params.USE_TEST_TIMEOUT}".toInteger(), unit: 'MINUTES') { + try { + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; LD_LIBRARY_PATH="`pwd`/src/.libs:\$LD_LIBRARY_PATH"; export LD_LIBRARY_PATH; DISTCHECK_CONFIGURE_FLAGS="--enable-drafts=yes --with-docs=no" ; export DISTCHECK_CONFIGURE_FLAGS; make DISTCHECK_CONFIGURE_FLAGS="\$DISTCHECK_CONFIGURE_FLAGS" LD_LIBRARY_PATH="\$LD_LIBRARY_PATH" distcheck""" + } + catch (Exception e) { + currentBuild.result = 'UNSTABLE' // Jenkins should not let the verdict "improve" + sh """D="`pwd`"; B="`basename "\$D"`" ; [ "${RETRY_NUMBER}" -gt 0 ] && T="_try-${RETRY_NUMBER}" || T="" ; tar czf "test-suite_${BUILD_TAG}_\${B}\${T}.tar.gz" `find . -name '*.trs'` `find . -name '*.log'`""" + archiveArtifacts artifacts: "**/test-suite*.tar.gz", allowEmptyArchive: true + throw e + } + } + } + sh """ echo "Are GitIgnores good after make distcheck with drafts?"; make CI_REQUIRE_GOOD_GITIGNORE="${params.CI_REQUIRE_GOOD_GITIGNORE}" check-gitignore """ + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + stage ('distcheck without DRAFT') { + when { expression { return ( params.DO_BUILD_WITHOUT_DRAFT_API && params.DO_TEST_DISTCHECK ) } } + steps { + dir("tmp/test-distcheck-withoutDRAFT") { + script { + def RETRY_NUMBER = 0 + deleteDir() + unstash 'built-nondraft' + timeout (time: "${params.USE_TEST_TIMEOUT}".toInteger(), unit: 'MINUTES') { + try { + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; LD_LIBRARY_PATH="`pwd`/src/.libs:\$LD_LIBRARY_PATH"; export LD_LIBRARY_PATH; DISTCHECK_CONFIGURE_FLAGS="--enable-drafts=no --with-docs=no" ; export DISTCHECK_CONFIGURE_FLAGS; make DISTCHECK_CONFIGURE_FLAGS="\$DISTCHECK_CONFIGURE_FLAGS" LD_LIBRARY_PATH="\$LD_LIBRARY_PATH" distcheck""" + } + catch (Exception e) { + currentBuild.result = 'UNSTABLE' // Jenkins should not let the verdict "improve" + sh """D="`pwd`"; B="`basename "\$D"`" ; [ "${RETRY_NUMBER}" -gt 0 ] && T="_try-${RETRY_NUMBER}" || T="" ; tar czf "test-suite_${BUILD_TAG}_\${B}\${T}.tar.gz" `find . -name '*.trs'` `find . -name '*.log'`""" + archiveArtifacts artifacts: "**/test-suite*.tar.gz", allowEmptyArchive: true + throw e + } + } + } + sh """ echo "Are GitIgnores good after make distcheck without drafts?"; make CI_REQUIRE_GOOD_GITIGNORE="${params.CI_REQUIRE_GOOD_GITIGNORE}" check-gitignore """ + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + stage ('install with DRAFT') { + when { expression { return ( params.DO_BUILD_WITH_DRAFT_API && params.DO_TEST_INSTALL ) } } + steps { + dir("tmp/test-install-withDRAFT") { + deleteDir() + unstash 'built-draft' + timeout (time: "${params.USE_TEST_TIMEOUT}".toInteger(), unit: 'MINUTES') { + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; LD_LIBRARY_PATH="`pwd`/src/.libs:\${LD_LIBRARY_PATH}"; export LD_LIBRARY_PATH; make LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}" DESTDIR="${params.USE_TEST_INSTALL_DESTDIR}/withDRAFT" install""" + } + sh """cd "${params.USE_TEST_INSTALL_DESTDIR}/withDRAFT" && find . -ls""" + sh """ echo "Are GitIgnores good after make install with drafts?"; make CI_REQUIRE_GOOD_GITIGNORE="${params.CI_REQUIRE_GOOD_GITIGNORE}" check-gitignore """ + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + stage ('install without DRAFT') { + when { expression { return ( params.DO_BUILD_WITHOUT_DRAFT_API && params.DO_TEST_INSTALL ) } } + steps { + dir("tmp/test-install-withoutDRAFT") { + deleteDir() + unstash 'built-nondraft' + timeout (time: "${params.USE_TEST_TIMEOUT}".toInteger(), unit: 'MINUTES') { + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; LD_LIBRARY_PATH="`pwd`/src/.libs:\${LD_LIBRARY_PATH}"; export LD_LIBRARY_PATH; make LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}" DESTDIR="${params.USE_TEST_INSTALL_DESTDIR}/withoutDRAFT" install""" + } + sh """cd "${params.USE_TEST_INSTALL_DESTDIR}/withoutDRAFT" && find . -ls""" + sh """ echo "Are GitIgnores good after make install without drafts?"; make CI_REQUIRE_GOOD_GITIGNORE="${params.CI_REQUIRE_GOOD_GITIGNORE}" check-gitignore """ + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + stage ('install with DOCS') { + when { expression { return ( params.DO_BUILD_DOCS && params.DO_TEST_INSTALL ) } } + steps { + dir("tmp/test-install-withDOCS") { + deleteDir() + unstash 'built-docs' + timeout (time: "${params.USE_TEST_TIMEOUT}".toInteger(), unit: 'MINUTES') { + sh """CCACHE_BASEDIR="`pwd`" ; export CCACHE_BASEDIR; if test "${params.USE_CCACHE_LOGGING}" = true ; then CCACHE_LOGFILE="`pwd`/ccache.log" ; export CCACHE_LOGFILE ; fi ; LD_LIBRARY_PATH="`pwd`/src/.libs:\${LD_LIBRARY_PATH}"; export LD_LIBRARY_PATH; make LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}" DESTDIR="${params.USE_TEST_INSTALL_DESTDIR}/withDOCS" install""" + } + sh """cd "${params.USE_TEST_INSTALL_DESTDIR}/withDOCS" && find . -ls""" + sh """ echo "Are GitIgnores good after make install with docs?"; make CI_REQUIRE_GOOD_GITIGNORE="${params.CI_REQUIRE_GOOD_GITIGNORE}" check-gitignore """ + script { + if ( params.DO_CLEANUP_AFTER_BUILD ) { + deleteDir() + } + } + } + } + } + } + } + stage ('deploy if appropriate') { + steps { + script { + def myDEPLOY_JOB_NAME = sh(returnStdout: true, script: """echo "${params["DEPLOY_JOB_NAME"]}" """).trim(); + def myDEPLOY_BRANCH_PATTERN = sh(returnStdout: true, script: """echo "${params["DEPLOY_BRANCH_PATTERN"]}" """).trim(); + def myDEPLOY_REPORT_RESULT = sh(returnStdout: true, script: """echo "${params["DEPLOY_REPORT_RESULT"]}" """).trim().toBoolean(); + echo "Original: DEPLOY_JOB_NAME : ${params["DEPLOY_JOB_NAME"]} DEPLOY_BRANCH_PATTERN : ${params["DEPLOY_BRANCH_PATTERN"]} DEPLOY_REPORT_RESULT : ${params["DEPLOY_REPORT_RESULT"]}" + echo "Used: myDEPLOY_JOB_NAME:${myDEPLOY_JOB_NAME} myDEPLOY_BRANCH_PATTERN:${myDEPLOY_BRANCH_PATTERN} myDEPLOY_REPORT_RESULT:${myDEPLOY_REPORT_RESULT}" + if ( (myDEPLOY_JOB_NAME != "") && (myDEPLOY_BRANCH_PATTERN != "") ) { + if ( env.BRANCH_NAME =~ myDEPLOY_BRANCH_PATTERN ) { + def GIT_URL = sh(returnStdout: true, script: """git remote -v | egrep '^origin' | awk '{print \$2}' | head -1""").trim() + def GIT_COMMIT = sh(returnStdout: true, script: 'git rev-parse --verify HEAD').trim() + def DIST_ARCHIVE = "" + def msg = "Would deploy ${GIT_URL} ${GIT_COMMIT} because tested branch '${env.BRANCH_NAME}' matches filter '${myDEPLOY_BRANCH_PATTERN}'" + if ( params.DO_DIST_DOCS ) { + DIST_ARCHIVE = env.BUILD_URL + "artifact/__dist.tar.gz" + msg += ", using dist archive '${DIST_ARCHIVE}' to speed up deployment" + } + echo msg + build job: "${myDEPLOY_JOB_NAME}", parameters: [ + string(name: 'DEPLOY_GIT_URL', value: "${GIT_URL}"), + string(name: 'DEPLOY_GIT_BRANCH', value: env.BRANCH_NAME), + string(name: 'DEPLOY_GIT_COMMIT', value: "${GIT_COMMIT}"), + string(name: 'DEPLOY_DIST_ARCHIVE', value: "${DIST_ARCHIVE}") + ], quietPeriod: 0, wait: myDEPLOY_REPORT_RESULT, propagate: myDEPLOY_REPORT_RESULT + } else { + echo "Not deploying because branch '${env.BRANCH_NAME}' did not match filter '${myDEPLOY_BRANCH_PATTERN}'" + } + } else { + echo "Not deploying because deploy-job parameters are not set" + } + } + } + } + } + post { + success { + script { + if (currentBuild.getPreviousBuild()?.result != 'SUCCESS') { + // Uncomment desired notification + + //slackSend (color: "#008800", message: "Build ${env.JOB_NAME} is back to normal.") + //emailext (to: "qa@example.com", subject: "Build ${env.JOB_NAME} is back to normal.", body: "Build ${env.JOB_NAME} is back to normal.") + } + if ( params.DO_CLEANUP_AFTER_JOB ) { + dir("tmp") { + deleteDir() + } + } + } + } + failure { + // Uncomment desired notification + // Section must not be empty, you can delete the sleep once you set notification + sleep 1 + //slackSend (color: "#AA0000", message: "Build ${env.BUILD_NUMBER} of ${env.JOB_NAME} ${currentBuild.result} (<${env.BUILD_URL}|Open>)") + //emailext (to: "qa@example.com", subject: "Build ${env.JOB_NAME} failed!", body: "Build ${env.BUILD_NUMBER} of ${env.JOB_NAME} ${currentBuild.result}\nSee ${env.BUILD_URL}") + + dir("tmp") { + script { + if ( params.DO_CLEANUP_AFTER_FAILED_JOB ) { + deleteDir() + } else { + sh """ echo "NOTE: BUILD AREA OF WORKSPACE `pwd` REMAINS FOR POST-MORTEMS ON `hostname` AND CONSUMES `du -hs . | awk '{print \$1}'` !" """ + } + } + } + } + } +} diff --git a/Makefile.am b/Makefile.am index 5829fbc..59d577e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,40 +1,57 @@ ################################################################################ # THIS FILE IS 100% GENERATED BY ZPROJECT; DO NOT EDIT EXCEPT EXPERIMENTALLY # -# Please refer to the README for information about making permanent changes. # +# Read the zproject/README.md for information about making permanent changes. # ################################################################################ ACLOCAL_AMFLAGS = -I config -AM_CFLAGS = \ - -Werror=format-security - AM_CPPFLAGS = \ - ${libsodium_CFLAGS} \ ${libzmq_CFLAGS} \ ${czmq_CFLAGS} \ -I$(srcdir)/include -project_libs = ${libsodium_LIBS} ${libzmq_LIBS} ${czmq_LIBS} +project_libs = ${libzmq_LIBS} ${czmq_LIBS} SUBDIRS = doc +SUBDIRS += include DIST_SUBDIRS = doc +DIST_SUBDIRS += include + lib_LTLIBRARIES = bin_PROGRAMS = noinst_PROGRAMS = check_PROGRAMS = noinst_LTLIBRARIES = TESTS = - -EXTRA_DIST = \ - src/filemq_classes.h \ +# Prepare variables that can be populated (appended) in generated Makefiles or +# manually maintained src/Makemodule-local.am +EXTRA_DIST = +CLEANFILES = +DISTCLEANFILES = + +if ENABLE_DIST_CMAKEFILES +EXTRA_DIST += \ + Findlibzmq.cmake \ + Findczmq.cmake \ + builds/cmake/Modules/ClangFormat.cmake \ + builds/cmake/clang-format-check.sh.in \ + builds/cmake/Config.cmake.in \ + CMakeLists.txt +endif + +EXTRA_DIST += \ + bindings \ LICENSE \ README.md \ - version.sh + src/filemq_classes.h +# NOTE: this "include" syntax is not a "make" but an "autotools" keyword, +# see https://www.gnu.org/software/automake/manual/html_node/Include.html include $(srcdir)/src/Makemodule.am +include $(srcdir)/src/Makemodule-local.am # Optional project-local hook ################################################################################ # THIS FILE IS 100% GENERATED BY ZPROJECT; DO NOT EDIT EXCEPT EXPERIMENTALLY # -# Please refer to the README for information about making permanent changes. # +# Read the zproject/README.md for information about making permanent changes. # ################################################################################ diff --git a/Vagrantfile b/Vagrantfile new file mode 100644 index 0000000..426457b --- /dev/null +++ b/Vagrantfile @@ -0,0 +1,58 @@ +#e -*- mode: ruby -*- +# vi: set ft=ruby : + +# This will setup a clean Ubuntu1404 LTS env + +$script = <