Skip to content

Commit 91ec371

Browse files
committed
Change ruby wrappers into a separate CMake project
1 parent f79472e commit 91ec371

File tree

3 files changed

+303
-5
lines changed

3 files changed

+303
-5
lines changed

CMakeLists.txt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
1+
cmake_minimum_required(VERSION 2.8)
12
project(ruby_wrapper)
23

3-
add_subdirectory(ext/symengine)
4-
#Copies LICENSE from root directory to gem directory
5-
file(COPY ${symengine_SOURCE_DIR}/LICENSE DESTINATION ${ruby_wrapper_BINARY_DIR})
4+
find_package(SymEngine REQUIRED CONFIG
5+
PATHS ${SYMENGINE_DIR}
6+
PATH_SUFFIXES lib/CMake/symengine CMake/)
7+
set(CMAKE_BUILD_TYPE ${SYMENGINE_BUILD_TYPE})
8+
set(CMAKE_CXX_FLAGS_RELEASE ${SYMENGINE_CXX_FLAGS_RELEASE})
9+
set(CMAKE_CXX_FLAGS_DEBUG ${SYMENGINE_CXX_FLAGS_DEBUG})
10+
include_directories(${SYMENGINE_INCLUDE_DIRS})
11+
12+
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
13+
find_package(Ruby REQUIRED)
14+
15+
message("Copying source of ruby wrappers into: ${CMAKE_CURRENT_BINARY_DIR}")
16+
file(COPY ${ruby_wrapper_SOURCE_DIR}/ DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
17+
18+
add_subdirectory(ext/symengine)

cmake/FindRuby.cmake

Lines changed: 286 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,286 @@
1+
#.rst:
2+
# FindRuby
3+
# --------
4+
#
5+
# Find Ruby
6+
#
7+
# This module finds if Ruby is installed and determines where the
8+
# include files and libraries are. Ruby 1.8, 1.9, 2.0 and 2.1 are
9+
# supported.
10+
#
11+
# The minimum required version of Ruby can be specified using the
12+
# standard syntax, e.g. find_package(Ruby 1.8)
13+
#
14+
# It also determines what the name of the library is. This code sets
15+
# the following variables:
16+
#
17+
# ``RUBY_EXECUTABLE``
18+
# full path to the ruby binary
19+
# ``RUBY_INCLUDE_DIRS``
20+
# include dirs to be used when using the ruby library
21+
# ``RUBY_LIBRARY``
22+
# full path to the ruby library
23+
# ``RUBY_VERSION``
24+
# the version of ruby which was found, e.g. "1.8.7"
25+
# ``RUBY_FOUND``
26+
# set to true if ruby ws found successfully
27+
#
28+
# Also:
29+
#
30+
# ``RUBY_INCLUDE_PATH``
31+
# same as RUBY_INCLUDE_DIRS, only provided for compatibility reasons, don't use it
32+
33+
#=============================================================================
34+
# Copyright 2004-2009 Kitware, Inc.
35+
# Copyright 2008-2009 Alexander Neundorf <neundorf@kde.org>
36+
#
37+
# Distributed under the OSI-approved BSD License (the "License");
38+
# see accompanying file Copyright.txt for details.
39+
#
40+
# This software is distributed WITHOUT ANY WARRANTY; without even the
41+
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
42+
# See the License for more information.
43+
#=============================================================================
44+
# (To distribute this file outside of CMake, substitute the full
45+
# License text for the above reference.)
46+
47+
# RUBY_ARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"archdir"@:>@)'`
48+
# RUBY_SITEARCHDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitearchdir"@:>@)'`
49+
# RUBY_SITEDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"sitelibdir"@:>@)'`
50+
# RUBY_LIBDIR=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"libdir"@:>@)'`
51+
# RUBY_LIBRUBYARG=`$RUBY -r rbconfig -e 'printf("%s",Config::CONFIG@<:@"LIBRUBYARG_SHARED"@:>@)'`
52+
53+
# uncomment the following line to get debug output for this file
54+
# set(_RUBY_DEBUG_OUTPUT TRUE)
55+
56+
# Determine the list of possible names of the ruby executable depending
57+
# on which version of ruby is required
58+
set(_RUBY_POSSIBLE_EXECUTABLE_NAMES ruby)
59+
60+
# if 1.9 is required, don't look for ruby18 and ruby1.8, default to version 1.8
61+
if(DEFINED Ruby_FIND_VERSION_MAJOR AND DEFINED Ruby_FIND_VERSION_MINOR)
62+
set(Ruby_FIND_VERSION_SHORT_NODOT "${Ruby_FIND_VERSION_MAJOR}${RUBY_FIND_VERSION_MINOR}")
63+
# we can't construct that if only major version is given
64+
set(_RUBY_POSSIBLE_EXECUTABLE_NAMES
65+
ruby${Ruby_FIND_VERSION_MAJOR}.${Ruby_FIND_VERSION_MINOR}
66+
ruby${Ruby_FIND_VERSION_MAJOR}${Ruby_FIND_VERSION_MINOR}
67+
${_RUBY_POSSIBLE_EXECUTABLE_NAMES})
68+
else()
69+
set(Ruby_FIND_VERSION_SHORT_NODOT "18")
70+
endif()
71+
72+
if(NOT Ruby_FIND_VERSION_EXACT)
73+
list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby2.1 ruby21)
74+
list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby2.0 ruby20)
75+
list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby1.9 ruby19)
76+
77+
# if we want a version below 1.9, also look for ruby 1.8
78+
if("${Ruby_FIND_VERSION_SHORT_NODOT}" VERSION_LESS "19")
79+
list(APPEND _RUBY_POSSIBLE_EXECUTABLE_NAMES ruby1.8 ruby18)
80+
endif()
81+
82+
list(REMOVE_DUPLICATES _RUBY_POSSIBLE_EXECUTABLE_NAMES)
83+
endif()
84+
85+
find_program(RUBY_EXECUTABLE NAMES ${_RUBY_POSSIBLE_EXECUTABLE_NAMES})
86+
87+
if(RUBY_EXECUTABLE AND NOT RUBY_VERSION_MAJOR)
88+
function(_RUBY_CONFIG_VAR RBVAR OUTVAR)
89+
execute_process(COMMAND ${RUBY_EXECUTABLE} -r rbconfig -e "print RbConfig::CONFIG['${RBVAR}']"
90+
RESULT_VARIABLE _RUBY_SUCCESS
91+
OUTPUT_VARIABLE _RUBY_OUTPUT
92+
ERROR_QUIET)
93+
if(_RUBY_SUCCESS OR _RUBY_OUTPUT STREQUAL "")
94+
execute_process(COMMAND ${RUBY_EXECUTABLE} -r rbconfig -e "print Config::CONFIG['${RBVAR}']"
95+
RESULT_VARIABLE _RUBY_SUCCESS
96+
OUTPUT_VARIABLE _RUBY_OUTPUT
97+
ERROR_QUIET)
98+
endif()
99+
set(${OUTVAR} "${_RUBY_OUTPUT}" PARENT_SCOPE)
100+
endfunction()
101+
102+
103+
# query the ruby version
104+
_RUBY_CONFIG_VAR("MAJOR" RUBY_VERSION_MAJOR)
105+
_RUBY_CONFIG_VAR("MINOR" RUBY_VERSION_MINOR)
106+
_RUBY_CONFIG_VAR("TEENY" RUBY_VERSION_PATCH)
107+
108+
# query the different directories
109+
_RUBY_CONFIG_VAR("archdir" RUBY_ARCH_DIR)
110+
_RUBY_CONFIG_VAR("arch" RUBY_ARCH)
111+
_RUBY_CONFIG_VAR("rubyhdrdir" RUBY_HDR_DIR)
112+
_RUBY_CONFIG_VAR("rubyarchhdrdir" RUBY_ARCHHDR_DIR)
113+
_RUBY_CONFIG_VAR("libdir" RUBY_POSSIBLE_LIB_DIR)
114+
_RUBY_CONFIG_VAR("rubylibdir" RUBY_RUBY_LIB_DIR)
115+
116+
# site_ruby
117+
_RUBY_CONFIG_VAR("sitearchdir" RUBY_SITEARCH_DIR)
118+
_RUBY_CONFIG_VAR("sitelibdir" RUBY_SITELIB_DIR)
119+
120+
# vendor_ruby available ?
121+
execute_process(COMMAND ${RUBY_EXECUTABLE} -r vendor-specific -e "print 'true'"
122+
OUTPUT_VARIABLE RUBY_HAS_VENDOR_RUBY ERROR_QUIET)
123+
124+
if(RUBY_HAS_VENDOR_RUBY)
125+
_RUBY_CONFIG_VAR("vendorlibdir" RUBY_VENDORLIB_DIR)
126+
_RUBY_CONFIG_VAR("vendorarchdir" RUBY_VENDORARCH_DIR)
127+
endif()
128+
129+
# save the results in the cache so we don't have to run ruby the next time again
130+
set(RUBY_VERSION_MAJOR ${RUBY_VERSION_MAJOR} CACHE PATH "The Ruby major version" FORCE)
131+
set(RUBY_VERSION_MINOR ${RUBY_VERSION_MINOR} CACHE PATH "The Ruby minor version" FORCE)
132+
set(RUBY_VERSION_PATCH ${RUBY_VERSION_PATCH} CACHE PATH "The Ruby patch version" FORCE)
133+
set(RUBY_ARCH_DIR ${RUBY_ARCH_DIR} CACHE PATH "The Ruby arch dir" FORCE)
134+
set(RUBY_HDR_DIR ${RUBY_HDR_DIR} CACHE PATH "The Ruby header dir (1.9+)" FORCE)
135+
set(RUBY_ARCHHDR_DIR ${RUBY_ARCHHDR_DIR} CACHE PATH "The Ruby arch header dir (2.0+)" FORCE)
136+
set(RUBY_POSSIBLE_LIB_DIR ${RUBY_POSSIBLE_LIB_DIR} CACHE PATH "The Ruby lib dir" FORCE)
137+
set(RUBY_RUBY_LIB_DIR ${RUBY_RUBY_LIB_DIR} CACHE PATH "The Ruby ruby-lib dir" FORCE)
138+
set(RUBY_SITEARCH_DIR ${RUBY_SITEARCH_DIR} CACHE PATH "The Ruby site arch dir" FORCE)
139+
set(RUBY_SITELIB_DIR ${RUBY_SITELIB_DIR} CACHE PATH "The Ruby site lib dir" FORCE)
140+
set(RUBY_HAS_VENDOR_RUBY ${RUBY_HAS_VENDOR_RUBY} CACHE BOOL "Vendor Ruby is available" FORCE)
141+
set(RUBY_VENDORARCH_DIR ${RUBY_VENDORARCH_DIR} CACHE PATH "The Ruby vendor arch dir" FORCE)
142+
set(RUBY_VENDORLIB_DIR ${RUBY_VENDORLIB_DIR} CACHE PATH "The Ruby vendor lib dir" FORCE)
143+
144+
mark_as_advanced(
145+
RUBY_ARCH_DIR
146+
RUBY_ARCH
147+
RUBY_HDR_DIR
148+
RUBY_ARCHHDR_DIR
149+
RUBY_POSSIBLE_LIB_DIR
150+
RUBY_RUBY_LIB_DIR
151+
RUBY_SITEARCH_DIR
152+
RUBY_SITELIB_DIR
153+
RUBY_HAS_VENDOR_RUBY
154+
RUBY_VENDORARCH_DIR
155+
RUBY_VENDORLIB_DIR
156+
RUBY_VERSION_MAJOR
157+
RUBY_VERSION_MINOR
158+
RUBY_VERSION_PATCH
159+
)
160+
endif()
161+
162+
# In case RUBY_EXECUTABLE could not be executed (e.g. cross compiling)
163+
# try to detect which version we found. This is not too good.
164+
if(RUBY_EXECUTABLE AND NOT RUBY_VERSION_MAJOR)
165+
# by default assume 1.8.0
166+
set(RUBY_VERSION_MAJOR 1)
167+
set(RUBY_VERSION_MINOR 8)
168+
set(RUBY_VERSION_PATCH 0)
169+
# check whether we found 1.9.x
170+
if(${RUBY_EXECUTABLE} MATCHES "ruby1.?9")
171+
set(RUBY_VERSION_MAJOR 1)
172+
set(RUBY_VERSION_MINOR 9)
173+
endif()
174+
# check whether we found 2.0.x
175+
if(${RUBY_EXECUTABLE} MATCHES "ruby2.?0")
176+
set(RUBY_VERSION_MAJOR 2)
177+
set(RUBY_VERSION_MINOR 0)
178+
endif()
179+
# check whether we found 2.1.x
180+
if(${RUBY_EXECUTABLE} MATCHES "ruby2.?1")
181+
set(RUBY_VERSION_MAJOR 2)
182+
set(RUBY_VERSION_MINOR 1)
183+
endif()
184+
endif()
185+
186+
if(RUBY_VERSION_MAJOR)
187+
set(RUBY_VERSION "${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}.${RUBY_VERSION_PATCH}")
188+
set(_RUBY_VERSION_SHORT "${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}")
189+
set(_RUBY_VERSION_SHORT_NODOT "${RUBY_VERSION_MAJOR}${RUBY_VERSION_MINOR}")
190+
set(_RUBY_NODOT_VERSION "${RUBY_VERSION_MAJOR}${RUBY_VERSION_MINOR}${RUBY_VERSION_PATCH}")
191+
endif()
192+
193+
find_path(RUBY_INCLUDE_DIR
194+
NAMES ruby.h
195+
HINTS
196+
${RUBY_HDR_DIR}
197+
${RUBY_ARCH_DIR}
198+
/usr/lib/ruby/${_RUBY_VERSION_SHORT}/i586-linux-gnu/ )
199+
200+
set(RUBY_INCLUDE_DIRS ${RUBY_INCLUDE_DIR} )
201+
202+
# if ruby > 1.8 is required or if ruby > 1.8 was found, search for the config.h dir
203+
if( "${Ruby_FIND_VERSION_SHORT_NODOT}" GREATER 18 OR "${_RUBY_VERSION_SHORT_NODOT}" GREATER 18 OR RUBY_HDR_DIR)
204+
find_path(RUBY_CONFIG_INCLUDE_DIR
205+
NAMES ruby/config.h config.h
206+
HINTS
207+
${RUBY_HDR_DIR}/${RUBY_ARCH}
208+
${RUBY_ARCH_DIR}
209+
${RUBY_ARCHHDR_DIR}
210+
)
211+
212+
set(RUBY_INCLUDE_DIRS ${RUBY_INCLUDE_DIRS} ${RUBY_CONFIG_INCLUDE_DIR} )
213+
endif()
214+
215+
216+
# Determine the list of possible names for the ruby library
217+
set(_RUBY_POSSIBLE_LIB_NAMES ruby ruby-static ruby${_RUBY_VERSION_SHORT} ruby${_RUBY_VERSION_SHORT_NODOT} ruby-${_RUBY_VERSION_SHORT} ruby-${RUBY_VERSION})
218+
219+
if(WIN32)
220+
set( _RUBY_MSVC_RUNTIME "" )
221+
if( MSVC60 )
222+
set( _RUBY_MSVC_RUNTIME "60" )
223+
endif()
224+
if( MSVC70 )
225+
set( _RUBY_MSVC_RUNTIME "70" )
226+
endif()
227+
if( MSVC71 )
228+
set( _RUBY_MSVC_RUNTIME "71" )
229+
endif()
230+
if( MSVC80 )
231+
set( _RUBY_MSVC_RUNTIME "80" )
232+
endif()
233+
if( MSVC90 )
234+
set( _RUBY_MSVC_RUNTIME "90" )
235+
endif()
236+
237+
set(_RUBY_ARCH_PREFIX "")
238+
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
239+
set(_RUBY_ARCH_PREFIX "x64-")
240+
endif()
241+
242+
list(APPEND _RUBY_POSSIBLE_LIB_NAMES
243+
"${_RUBY_ARCH_PREFIX}msvcr${_RUBY_MSVC_RUNTIME}-ruby${_RUBY_NODOT_VERSION}"
244+
"${_RUBY_ARCH_PREFIX}msvcr${_RUBY_MSVC_RUNTIME}-ruby${_RUBY_NODOT_VERSION}-static"
245+
"${_RUBY_ARCH_PREFIX}msvcrt-ruby${_RUBY_NODOT_VERSION}"
246+
"${_RUBY_ARCH_PREFIX}msvcrt-ruby${_RUBY_NODOT_VERSION}-static" )
247+
endif()
248+
249+
find_library(RUBY_LIBRARY NAMES ${_RUBY_POSSIBLE_LIB_NAMES} HINTS ${RUBY_POSSIBLE_LIB_DIR} )
250+
251+
include(FindPackageHandleStandardArgs)
252+
set(_RUBY_REQUIRED_VARS RUBY_EXECUTABLE RUBY_INCLUDE_DIR RUBY_LIBRARY)
253+
if(_RUBY_VERSION_SHORT_NODOT GREATER 18)
254+
list(APPEND _RUBY_REQUIRED_VARS RUBY_CONFIG_INCLUDE_DIR)
255+
endif()
256+
257+
if(_RUBY_DEBUG_OUTPUT)
258+
message(STATUS "--------FindRuby.cmake debug------------")
259+
message(STATUS "_RUBY_POSSIBLE_EXECUTABLE_NAMES: ${_RUBY_POSSIBLE_EXECUTABLE_NAMES}")
260+
message(STATUS "_RUBY_POSSIBLE_LIB_NAMES: ${_RUBY_POSSIBLE_LIB_NAMES}")
261+
message(STATUS "RUBY_ARCH_DIR: ${RUBY_ARCH_DIR}")
262+
message(STATUS "RUBY_HDR_DIR: ${RUBY_HDR_DIR}")
263+
message(STATUS "RUBY_POSSIBLE_LIB_DIR: ${RUBY_POSSIBLE_LIB_DIR}")
264+
message(STATUS "Found RUBY_VERSION: \"${RUBY_VERSION}\" , short: \"${_RUBY_VERSION_SHORT}\", nodot: \"${_RUBY_VERSION_SHORT_NODOT}\"")
265+
message(STATUS "_RUBY_REQUIRED_VARS: ${_RUBY_REQUIRED_VARS}")
266+
message(STATUS "RUBY_EXECUTABLE: ${RUBY_EXECUTABLE}")
267+
message(STATUS "RUBY_LIBRARY: ${RUBY_LIBRARY}")
268+
message(STATUS "RUBY_INCLUDE_DIR: ${RUBY_INCLUDE_DIR}")
269+
message(STATUS "RUBY_CONFIG_INCLUDE_DIR: ${RUBY_CONFIG_INCLUDE_DIR}")
270+
message(STATUS "--------------------")
271+
endif()
272+
273+
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Ruby REQUIRED_VARS ${_RUBY_REQUIRED_VARS}
274+
VERSION_VAR RUBY_VERSION )
275+
276+
mark_as_advanced(
277+
RUBY_EXECUTABLE
278+
RUBY_LIBRARY
279+
RUBY_INCLUDE_DIR
280+
RUBY_CONFIG_INCLUDE_DIR
281+
)
282+
283+
# Set some variables for compatibility with previous version of this file
284+
set(RUBY_POSSIBLE_LIB_PATH ${RUBY_POSSIBLE_LIB_DIR})
285+
set(RUBY_RUBY_LIB_PATH ${RUBY_RUBY_LIB_DIR})
286+
set(RUBY_INCLUDE_PATH ${RUBY_INCLUDE_DIRS})

ext/symengine/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,10 @@ set(RUBY_WRAPPER_SRC
77
symengine.c
88
)
99

10-
include_directories(BEFORE ${symengine_SOURCE_DIR} ${symengine_BINARY_DIR})
1110
include_directories(BEFORE ${RUBY_INCLUDE_DIRS})
1211

1312
add_library(symengine_ruby SHARED ${RUBY_WRAPPER_SRC})
14-
target_link_libraries(symengine_ruby symengine ${RUBY_LIBRARIES})
13+
target_link_libraries(symengine_ruby ${SYMENGINE_LIBRARIES} ${RUBY_LIBRARIES})
1514
set_target_properties(symengine_ruby PROPERTIES
1615
PREFIX ""
1716
OUTPUT_NAME "symengine"

0 commit comments

Comments
 (0)