blob: 9dd7bc77967393c5946092cb87e3d614e61f02df [file] [log] [blame]
#
# 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 "$<TARGET_FILE_DIR:qpid-proton>") # 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()