# # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # set(src "${CMAKE_CURRENT_SOURCE_DIR}") set(bin "${CMAKE_CURRENT_BINARY_DIR}") set(c_lib_dir "$") # Location of qpid-proton library ## Build the swig library list(APPEND SWIG_MODULE_cproton-ruby_EXTRA_DEPS ${CMAKE_SOURCE_DIR}/c/include/proton/cproton.i ${PROTON_HEADERS} ) set(CMAKE_SWIG_FLAGS "-DUINTPTR_SIZE=${CMAKE_SIZEOF_VOID_P}") # Put the generated source in a known place, we need to copy it for the gem. set(SWIG_OUTFILE_DIR "${CMAKE_CURRENT_BINARY_DIR}") include_directories(${PN_C_INCLUDE_DIR} ${RUBY_INCLUDE_PATH}) swig_add_library(cproton-ruby LANGUAGE ruby SOURCES cproton.i) swig_link_libraries(cproton-ruby ${BINDING_DEPS_FULL} ${RUBY_LIBRARY}) # Set version-dependent compile flags if (RUBY_VERSION VERSION_LESS 1.9.0) # Don't have blocking control API elseif(RUBY_VERSION VERSION_LESS 2.0.0) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DRUBY_USE_rb_thread_blocking_region") else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DRUBY_USE_rb_thread_call_without_gvl") endif() # Remove -fvisibility=hidden, it causes an obscure failure in release builds. string(REGEX REPLACE "-fvisibility=[a-z]*" "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") set_target_properties(cproton-ruby PROPERTIES PREFIX "" OUTPUT_NAME "cproton" LINK_FLAGS "${CATCH_UNDEFINED}" ) ## Make a gem file(GLOB_RECURSE RUBY_SRC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.rb *.rdoc) find_program(GEM_EXE gem DOC "Program to build and install ruby gem packages") mark_as_advanced(GEM_EXE) if (GEM_EXE) set(GEM_FILE "${bin}/gem/qpid_proton-${PN_VERSION}.gem") # Copy source and generated files to the build tree so we can build the gem in one place # # NOTE: the gem does not need the cproton-ruby library, but it does need # cprotonRUBY_wrap.c which is generated as a side effect. We have to depend on # cproton-ruby as there's no parallel-safe way to generate only the C file. configure_file(${src}/qpid_proton.gemspec.in ${bin}/gem/qpid_proton.gemspec) add_custom_command( OUTPUT ${GEM_FILE} COMMAND ${CMAKE_COMMAND} -E copy_directory ${src} ${bin}/gem COMMAND ${CMAKE_COMMAND} -E copy_directory ${src}/examples/ ${bin}/gem/examples COMMAND ${CMAKE_COMMAND} -E copy ${bin}/cprotonRUBY_wrap.c ${bin}/gem/ext/cproton/cproton.c COMMAND ${GEM_EXE} build qpid_proton.gemspec WORKING_DIRECTORY ${bin}/gem DEPENDS ${bin}/gem/qpid_proton.gemspec ${RUBY_SRC} ${src}/LICENSE.txt cproton-ruby ) add_custom_target(ruby-gem ALL DEPENDS ${GEM_FILE}) endif () ## CMake-based install if (CHECK_SYSINSTALL_RUBY) execute_process(COMMAND ${RUBY_EXECUTABLE} -r rbconfig -e "print RbConfig::CONFIG['vendorarchdir'] || ''" RESULT_VARIABLE RESULT_RUBY_ARCHLIB_DIR OUTPUT_VARIABLE OUTPUT_RUBY_ARCHLIB_DIR) if(OUTPUT_RUBY_ARCHLIB_DIR STREQUAL "") execute_process(COMMAND ${RUBY_EXECUTABLE} -r rbconfig -e "print RbConfig::CONFIG['archdir'] || ''" RESULT_VARIABLE RESULT_RUBY_ARCHLIB_DIR OUTPUT_VARIABLE OUTPUT_RUBY_ARCHLIB_DIR) endif() set(RUBY_ARCHLIB_DIR_DEFAULT "${OUTPUT_RUBY_ARCHLIB_DIR}") else (CHECK_SYSINSTALL_RUBY) set (RUBY_ARCHLIB_DIR_DEFAULT ${BINDINGS_DIR}/ruby) endif (CHECK_SYSINSTALL_RUBY) if (NOT RUBY_ARCHLIB_DIR) set (RUBY_ARCHLIB_DIR ${RUBY_ARCHLIB_DIR_DEFAULT}) endif() install(TARGETS cproton-ruby DESTINATION ${RUBY_ARCHLIB_DIR} COMPONENT Ruby) install(DIRECTORY lib/ DESTINATION ${RUBY_ARCHLIB_DIR} COMPONENT Ruby) install(DIRECTORY examples/ DESTINATION "${PROTON_SHARE}/examples/ruby" COMPONENT Ruby USE_SOURCE_PERMISSIONS) ## Tests to_native_path("${src}/lib;${src}/tests;${src}/spec;${bin};${c_lib_dir};$ENV{RUBYLIB}" RUBYLIB) to_native_path("${bin};${c_lib_dir};$ENV{PATH}" PATH) if (CMAKE_BUILD_TYPE MATCHES "Coverage") set(COVERAGE "COVERAGE=1") endif () execute_process(COMMAND ${RUBY_EXECUTABLE} -r minitest -e "" RESULT_VARIABLE result OUTPUT_QUIET ERROR_QUIET) if (result EQUAL 0) # Have minitest set(test_env "PATH=${PATH}" "RUBYLIB=${RUBYLIB}" "${COVERAGE}" "COVERAGE_DIR=${CMAKE_CURRENT_BINARY_DIR}/coverage" "SASLPASSWD=${CyrusSASL_Saslpasswd_EXECUTABLE}") macro(add_ruby_test script) get_filename_component(name ${script} NAME_WE) string(REPLACE "_" "-" name "ruby-${name}") pn_add_test( INTERPRETED NAME ${name} PREPEND_ENVIRONMENT ${test_env} COMMAND ${RUBY_EXECUTABLE} -r${CMAKE_CURRENT_SOURCE_DIR}/tests/collect_coverage.rb ${script} -v WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} # simplecov doesn't report on code not under $CWD ${ARGN}) endmacro() pn_add_test( INTERPRETED NAME ruby-example-test PREPEND_ENVIRONMENT ${test_env} COMMAND ${RUBY_EXECUTABLE} testme -v WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/examples) file(GLOB TESTS tests/test_*.rb) file(GLOB SPECS spec/*_spec.rb) foreach(t ${TESTS} ${SPECS}) add_ruby_test(${t}) endforeach() else() # No minitest message(STATUS "Ruby tests will not run, minitest is not installed") endif() ## Documentation find_program(YARD_EXE "yard") if (YARD_EXE) file(GLOB_RECURSE TEMPLATES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "doc/templates/**") add_custom_command( OUTPUT ${bin}/doc WORKING_DIRECTORY ${src} COMMAND ${YARD_EXE} -o ${bin}/doc -b ${bin}/.yardoc -p ${src}/doc/templates DEPENDS ${RUBY_SRC} ${TEMPLATES} .yardopts ) add_custom_target(docs-ruby DEPENDS ${bin}/doc) add_dependencies (docs docs-ruby) install(DIRECTORY "${bin}/doc/" DESTINATION "${PROTON_SHARE}/docs/api-ruby" COMPONENT documentation OPTIONAL) set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES doc) endif()