Bug #8435

Can't build tcl/tk extensions after updating Debian/Ubuntu package

Added by Romulo Ceccon 11 months ago. Updated 10 months ago.

[ruby-core:55121]
Status:Third Party's Issue
Priority:Normal
Assignee:Hidetoshi Nagai
Category:ext
Target version:2.1.0
ruby -v:ruby 2.1.0dev (2013-05-21 trunk 40883) [x86_64-linux] Backport:1.9.3: UNKNOWN, 2.0.0: UNKNOWN

Description

I've recently upgraded my Ubuntu system to 13.04 and tcl8.5-dev and tk8.5-dev were updated as well (to versions 8.5.13-1ubuntu and 8.5.11-2ubuntu4 respectively).

Now I can't build Tcl/Tk Ruby extensions anymore. I was able to reproduce the problem with
ruby 2.0.0p195 (2013-05-14 revision 40734) [x8664-linux] and
ruby 2.1.0dev (2013-05-21 trunk 40883) [x86
64-linux].

Looking at source:/ext/tk/extconf.rb@39974#L376 I see that extconf tries to parse tclConfig.sh and tkConfig.sh, which worked nice previously when those files were ln'ed to the actual configuration files. However, after the update they look like this on my platform:

$ cat /usr/lib/tclConfig.sh 
#!/bin/sh
. /usr/lib/`dpkg-architecture -qDEB_HOST_MULTIARCH`/tclConfig.sh
$ cat /usr/lib/tkConfig.sh 
#!/bin/sh
. /usr/lib/`dpkg-architecture -qDEB_HOST_MULTIARCH`/tkConfig.sh

So the setup fails:

...
Search tclConfig.sh and tkConfig.sh.....................
WARNING: found "/usr/lib/tclConfig.sh", but cannot find valid Tcl library for the tclConfig.sh. So, ignore it.

WARNING: found "/usr/lib/tkConfig.sh", but cannot find valid Tk library for the tkConfig.sh. So, ignore it.
..........
Fail to find [tclConfig.sh, tkConfig.sh]
...

Full 'ruby extconf.rb' output and mkmf.log are attached.

mkmf.log (245 KB) Romulo Ceccon, 05/22/2013 10:28 PM

extconf.out (6 KB) Romulo Ceccon, 05/22/2013 10:28 PM

History

#1 Updated by Romulo Ceccon 11 months ago

Workaround is to specify actual location of tcl/tk files:

./configure --with-tclConfig-file=/usr/lib/x86_64-linux-gnu/tclConfig.sh --with-tkConfig-file=/usr/lib/x86_64-linux-gnu/tkConfig.sh

It looks like the change in the *.sh scripts intend to improve support for DEBHOSTMULTIARCH. I don't know how prevalent the problem will be for other platforms, or what the policy is for Ruby regarding that kind of workaround.

#2 Updated by Zachary Scott 11 months ago

Seems like third party issue

#3 Updated by Hiroshi SHIBATA 11 months ago

  • Category set to ext
  • Assignee set to Hidetoshi Nagai
  • Target version set to 2.1.0

#4 Updated by Romulo Ceccon 11 months ago

A possible fix:

--- a/ext/tk/extconf.rb 2013-01-10 05:47:20.000000000 -0200
+++ b/ext/tk/extconf.rb 2013-05-25 21:32:54.230020034 -0300
@@ -117,6 +117,11 @@
/64|universal/ =~ RUBY_PLATFORM
end

+def multiarchsupported?
+ dpkg
arch = which dpkg-architecture.strip
+ #{dpkg_arch} -qDEB_HOST_MULTIARCH.strip unless dpkgarch.empty?
+end
+
def check
tcltkversion(version)
return [nil, nil] unless version.kind
of? String

@@ -466,7 +471,14 @@

 config_dir << RbConfig::CONFIG['libdir']
  • ((maybe_64bit?)? ['lib64', 'lib']: ['lib']).each{|dir|
  • if arch = multiarch_supported?
  • lib_dirs = ["lib/#{arch}", 'lib']
  • elsif maybe_64bit?
  • lib_dirs = ['lib64', 'lib']
  • else
  • lib_dirs = ['lib']
  • end
  • libdirs.each{|dir| configdir.concat [ File.join(RbConfig::CONFIG['exec_prefix'], dir), File.join(RbConfig::CONFIG['prefix'], dir),

#5 Updated by Nobuyoshi Nakada 11 months ago

romuloceccon (Romulo Ceccon) wrote:

+def multiarchsupported?
+ dpkg
arch = which dpkg-architecture.strip
+ #{dpkg_arch} -qDEB_HOST_MULTIARCH.strip unless dpkg_arch.empty?
+end

`` returns a string, that is true value.

Possibly,
/\S/ =~ dpkg-architecture -qDEB_HOST_MULTIARCH rescue false
?

#6 Updated by Romulo Ceccon 11 months ago

The idea is that the method would also return the architecture as a string, but return false if dpkg-architecture is not available or is of an older version (DEBHOSTMULTIARCH unsupported). So a more comprehensive approach could be:

def multiarch_supported?
  cmd = `which dpkg-architecture 2>/dev/null`
  return unless $?.success?
  arch = `#{cmd.strip} -qDEB_HOST_MULTIARCH`
  arch.strip if $?.success?
end

#7 Updated by Hidetoshi Nagai 10 months ago

  • Status changed from Open to Third Party's Issue

It depends on Ubuntu packages. The patch may be able to avoid the "current" problem,
but it cannot guarantee that it is available in the next version of Ubuntu.
If the policy of Ubuntu is changed, extconf.rb must check the Tcl/Tk package version of Ubuntu.
I think that it is not a good choice.
Although it may be troble, please use configure options.

Also available in: Atom PDF