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/.gitignore b/.gitignore index a8c20d0..7fe96cd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ -# Own created files +# This is a skeleton created by zproject. +# You can add hand-written code here. +save.xml src/.cache src/filemq.lst src/fmq_selftest @@ -6,7 +8,7 @@ src/fmq_sha.lst src/mymusic src/testit src/track - + # Object files *.o *.so @@ -36,6 +38,11 @@ src/filemq_selftest *.app core +# Distcheck workspace and archives +/filemq-*/ +/filemq-*.tar.gz +/filemq-*.zip + # Man pages doc/*.1 doc/*.3 @@ -55,6 +62,7 @@ config.log config.status config/ configure +configure.lineno libtool src/platform.h src/platform.h.in @@ -68,9 +76,32 @@ CMakeCache.txt CMakeFiles/ CTestTestfile.cmake cmake_install.cmake +compile_commands.json +DartConfiguration.tcl install_manifest.txt Testing/ +# Repositories downloaded by CI integration scripts +tmp-deps/ + +# Travis build area +tmp/ + +# Valgrind files +callgrind* +vgcore* + +# Vagrant files +.vagrant + +# CLion / PyCharm +.idea + +# GYP files +project.Makefile +*.target.mk +out/ + # Android build results builds/android/prefix @@ -80,9 +111,30 @@ src/app/gen/ src/app/obj/ src/app/local.properties -# Android -dependencies +# Android - dependencies src/app/jni/output +# Python build directory +build/ + +# MSVC build directories +obj/ +bin/ +*.tlog + +# Qt +*pro.user +moc_* +build-* +bindings/qt/selftest/selftest + # Temporary files *.swp +*.bak +.test* + +# Netbeans directory +nbproject/ + +# editor backups *~ 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/.travis.yml b/.travis.yml index 14090bf..f6b4297 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,152 @@ # Travis CI script -language: c +# This is a skeleton created by zproject. +# You can add hand-written code here. +language: +- c + +cache: +- ccache + +os: +- linux + + +# The default distro for env:/matrix:/* and unspecified-dist matrix:/* tests; +# for the latter see also addons/apt/sources with the package repos in use. +# See https://docs.travis-ci.com/user/reference/overview/ for up-to-date +# allowed values of "dist" supported by the Travis CI service. +dist: +- xenial + +#services: +#- docker + +# Set CI_TIME=true to enable build-step profiling in Travis +# Set CI_TRACE=true to enable shell script tracing in Travis +# 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 env: -- BUILD_TYPE=default -- BUILD_TYPE=qt-android + global: + - 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 + # 1) Create the GH token + # 2) Uncomment the "secure" line and paste the generated hashed + # string, which include the token's name, as parameter + #- secure: + matrix: + - BUILD_TYPE=default + - BUILD_TYPE=default-Werror + - BUILD_TYPE=cmake +# - BUILD_TYPE=android +# - BUILD_TYPE=check-py + +# Prerequisite packages provided by OS distro and used "as is" +pkg_deps_prereqs_distro: &pkg_deps_prereqs_distro + +# Prerequisite packages that may be built from source or used from +# prebuilt packages of that source (usually not from an OS distro) +pkg_deps_prereqs_source: &pkg_deps_prereqs_source + - libzmq3-dev + - libczmq-dev + +pkg_deps_prereqs: &pkg_deps_prereqs + - *pkg_deps_prereqs_source + - *pkg_deps_prereqs_distro + +pkg_deps_doctools: &pkg_deps_doctools + - asciidoc + - xmlto + +pkg_deps_devtools: &pkg_deps_devtools + - git + +# NOTE: Unlike earlier zproject versions, the pkg_src* objects below do not +# start with a dash, due to peculiarities of YAML alias dereferencing in Travis + +# dist==trusty means ubuntu14 +pkg_src_zeromq_ubuntu14: &pkg_src_zeromq_ubuntu14 + sourceline: 'deb http://download.opensuse.org/repositories/network:/messaging:/zeromq:/git-draft/xUbuntu_14.04/ ./' + key_url: 'http://download.opensuse.org/repositories/network:/messaging:/zeromq:/git-draft/xUbuntu_14.04/Release.key' + +# dist==xenial means ubuntu16 +pkg_src_zeromq_ubuntu16: &pkg_src_zeromq_ubuntu16 + sourceline: 'deb http://download.opensuse.org/repositories/network:/messaging:/zeromq:/git-draft/xUbuntu_16.04/ ./' + key_url: 'http://download.opensuse.org/repositories/network:/messaging:/zeromq:/git-draft/xUbuntu_16.04/Release.key' + +pkg_deps_common: &pkg_deps_common +- *pkg_deps_devtools +- *pkg_deps_prereqs + +# Also note that as of early 2017, either dist==trusty or services==docker +# is needed for some C++11 support; docker envs are usually faster to start up +# A newer dist==xenial completes the C++11 support with gcc-5+ +addons: + apt: + packages: + - *pkg_deps_common + +matrix: + include: + - env: BUILD_TYPE=default-with-docs + os: linux + addons: + apt: + packages: + - *pkg_deps_common + - *pkg_deps_doctools + - env: BUILD_TYPE=valgrind + os: linux + addons: + apt: + packages: + - valgrind + - *pkg_deps_common + - env: BUILD_TYPE=default ADDRESS_SANITIZER=enabled + os: linux + addons: + apt: + packages: + - *pkg_deps_common + - env: BUILD_TYPE=cmake DO_CLANG_FORMAT_CHECK=1 CLANG_FORMAT=clang-format-5.0 +# 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: +# - env: BUILD_TYPE=clang-format-check CLANG_FORMAT=clang-format-5.0 + os: linux + dist: xenial + addons: + apt: + sources: + - llvm-toolchain-xenial-5.0 + packages: + - clang-5.0 + - clang-format-5.0 +#autotools# - *pkg_deps_prereqs + +before_install: +- if [ "$TRAVIS_OS_NAME" == "osx" -a "$BUILD_TYPE" == "android" ] ; then brew install binutils ; fi +- if [ "$TRAVIS_OS_NAME" == "osx" -a "$BUILD_TYPE" == "valgrind" ] ; then brew install valgrind ; fi +- if [ -n "${MATRIX_EVAL}" ] ; then eval ${MATRIX_EVAL} ; fi -# Build and check this project according to the BUILD_TYPE +# Hand off to generated script for each BUILD_TYPE script: ./ci_build.sh +before_deploy: . ./ci_deploy.sh +deploy: + provider: releases + api_key: + # To encrypt your access token run: `travis encrypt -r user/repo` + secure: + file_glob: true + file: ${FILEMQ_DEPLOYMENT} + skip_cleanup: true + on: + branch: master + tags: true + condition: $TRAVIS_OS_NAME =~ (linux) && $BUILD_TYPE =~ (default) 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 = <