diff --git a/Manifest.txt b/Manifest.txt index 9a6c6d520e7a9eae2a4ce2da16bb61477aeefca4..94d8f7db87ab73caf10f69ea0b31f76e7ef73b03 100644 --- a/Manifest.txt +++ b/Manifest.txt @@ -5,7 +5,6 @@ History.txt Manifest.txt README.rdoc Rakefile -Rakefile.cross TODO doap.rdf.erb examples/RAA.rb diff --git a/Rakefile b/Rakefile index 15005cd15b5237818f40e19a70978a6566cbf8f6..b9527f062d8707cf46436f57afeecae0b4f1e912 100755 --- a/Rakefile +++ b/Rakefile @@ -3,7 +3,6 @@ require 'hoe' require 'erb' require 'rake/extensiontask' require './lib/fox16/version.rb' -load 'Rakefile.cross' # Use forked process for chdir'ed environment, to allow parallel execution with drake module FileUtils @@ -19,8 +18,6 @@ end # Some constants we'll need PKG_VERSION = Fox.fxrubyversion -# TODO: Don't depend on cross compilation task -FXSCINTILLA_INSTALL_DIR = Pathname( CrossLibraries.first.static_libfxscintilla_builddir ).expand_path SWIG = (RUBY_PLATFORM =~ /mingw/) ? "swig.exe" : "swig" SWIGFLAGS = "-c++ -ruby -nodefaultdtor -nodefaultctor -w302 -features compactdefaultargs -I../fox-includes" @@ -92,28 +89,40 @@ task :test => [:compile] Rake::ExtensionTask.new("fox16_c", hoe.spec) do |ext| ext.cross_compile = true - ext.cross_platform = CrossLibraries.map &:ruby_platform - - ext.cross_config_options += CrossLibraries.map do |lib| - { - lib.ruby_platform => [ - "--with-fox-include=#{lib.static_installdir}/include/fox-1.6", - "--with-fxscintilla-include=#{lib.static_installdir}/include/fxscintilla", - "--with-installed-include=#{lib.static_installdir}/include", - "--with-installed-lib=#{lib.static_installdir}/lib", - "--enable-win32-static-build", - "--with-fxscintilla", - ] - } + ext.cross_platform = ['x86-mingw32', 'x64-mingw32'] + + ext.cross_config_options += [ + "--enable-win32-cross", + "--with-fxscintilla", + ] + + # Add dependent DLLs to the cross gems + ext.cross_compiling do |spec| + plat = spec.platform + dlls = Dir["tmp/#{plat}/#{ext.name}/*/*.dll"].map{|dll| File.basename(dll) }.uniq + spec.files += dlls.map{|dll| "lib/#{plat}/#{dll}" } + + directory "tmp/#{plat}/stage/lib/#{plat}/" + dlls.each do |dll| + ENV['RUBY_CC_VERSION'].to_s.split(':').last.tap do |ruby_version| + file "tmp/#{plat}/stage/lib/#{plat}/#{dll}" => ["tmp/#{plat}/stage/lib/#{plat}/", "tmp/#{plat}/#{ext.name}/#{ruby_version}/#{dll}"] do + cp "tmp/#{plat}/#{ext.name}/#{ruby_version}/#{dll}", "tmp/#{plat}/stage/lib/#{plat}" + sh "x86_64-w64-mingw32-strip", "tmp/#{plat}/stage/lib/#{plat}/#{dll}" + end + end + file "lib/#{plat}/#{dll}" => "tmp/#{plat}/stage/lib/#{plat}/#{dll}" + end end - end -CrossLibraries.each do |lib| - ENV['RUBY_CC_VERSION'].split(":").each do |ruby_version| - task "copy:fox16_c:#{lib.ruby_platform}:#{ruby_version}" do |t| - sh "#{lib.host_platform}-strip -S tmp/#{lib.ruby_platform}/stage/lib/#{ruby_version[0,3]}/fox16_c.so" - end +# To reduce the gem file size strip mingw32 dlls before packaging +ENV['RUBY_CC_VERSION'].to_s.split(':').each do |ruby_version| + task "tmp/x86-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/fox16_c.so" do |t| + sh "i686-w64-mingw32-strip -S tmp/x86-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/fox16_c.so" + end + + task "tmp/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/fox16_c.so" do |t| + sh "x86_64-w64-mingw32-strip -S tmp/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/fox16_c.so" end end @@ -215,9 +224,16 @@ namespace :fxruby do file "ext/fox16_c/extconf.rb" => ['ext/fox16_c/swigruby.h', 'ext/fox16_c/impl.cpp', 'ext/fox16_c/include/inlinestubs.h'] + SWIG_MODULES.map{|ifile, cppfile| File.join("ext/fox16_c", cppfile) } + directory "tmp/fxscintilla" + task "tmp/fxscintilla/fxscintilla-2.28.0/include/Scintilla.iface" => ["tmp/fxscintilla", "ports/archives/fxscintilla-2.28.0.tar.gz"] do + chdir "tmp/fxscintilla" do + sh "tar xzf ../../ports/archives/fxscintilla-2.28.0.tar.gz" + end + end + task :scintilla => 'lib/fox16/scintilla.rb' - file 'lib/fox16/scintilla.rb' => [FXSCINTILLA_INSTALL_DIR, 'scripts/iface.rb'] do - ruby "scripts/iface.rb -i #{FXSCINTILLA_INSTALL_DIR}/include/Scintilla.iface -o lib/fox16/scintilla.rb" + file 'lib/fox16/scintilla.rb' => ["tmp/fxscintilla/fxscintilla-2.28.0/include/Scintilla.iface", 'scripts/iface.rb'] do + ruby "scripts/iface.rb -i tmp/fxscintilla/fxscintilla-2.28.0/include/Scintilla.iface -o lib/fox16/scintilla.rb" end task :generate_kwargs_lib => 'lib/fox16/kwargs.rb' diff --git a/Rakefile.cross b/Rakefile.cross deleted file mode 100755 index 48cb263c840811e36a3d6dfcfe26da27489225bd..0000000000000000000000000000000000000000 --- a/Rakefile.cross +++ /dev/null @@ -1,421 +0,0 @@ -# -*- coding: utf-8 -*- -# -*- ruby -*- - -require 'rubygems' -require 'hoe' -require 'rake/extensiontask' -require 'rake/extensioncompiler' -require 'uri' -require 'rbconfig' -require 'pathname' - -ENV['RUBY_CC_VERSION'] ||= '1.8.7:1.9.3:2.0.0' - -NUM_CPUS = if File.exist?('/proc/cpuinfo') - File.read('/proc/cpuinfo').scan('processor').length -elsif RUBY_PLATFORM.include?( 'darwin' ) - `system_profiler SPHardwareDataType | grep 'Cores' | awk '{print $5}'`.chomp -else - 1 -end - -class CrossLibrary < OpenStruct - include Rake::DSL - - def initialize(ruby_platform) - super() - - self.ruby_platform = ruby_platform - - # Cross-compilation constants - self.compile_home = Pathname( "build" ).expand_path - self.static_sourcesdir = compile_home + 'sources' - self.static_builddir = compile_home + 'builds' + ruby_platform - self.static_installdir = compile_home + 'install' + ruby_platform - self.ruby_build = RbConfig::CONFIG["host"] - - # Use rake-compilers config.yml to determine the toolchain that was used - # to build Ruby for this platform. - self.host_platform = begin - config_file = YAML.load_file(File.expand_path("~/.rake-compiler/config.yml")) - _, rbfile = config_file.find{|key, fname| key.start_with?("rbconfig-#{ruby_platform}-") } - IO.read(rbfile).match(/CONFIG\["host"\] = "(.*)"/)[1] - rescue - nil - end - - # Fetch zlib tarball - self.libz_version = ENV['libz_version'] || '1.2.7' - self.libz_source_uri = URI( "http://downloads.sourceforge.net/project/libpng/zlib/#{libz_version}/zlib-#{libz_version}.tar.bz2" ) - self.libz_tarball = static_sourcesdir + File.basename( libz_source_uri.path ) - self.static_libz_builddir = static_builddir + libz_tarball.basename(".tar.bz2") - self.libz_makefile = static_libz_builddir + 'Makefile' - self.libz_a = static_libz_builddir + 'libz.a' - - # Fetch libpng tarball - self.libpng_version = ENV['libpng_version'] || '1.5.13' - self.libpng_source_uri = URI( "http://prdownloads.sourceforge.net/libpng/libpng-#{libpng_version}.tar.gz?download" ) - self.libpng_tarball = static_sourcesdir + File.basename( libpng_source_uri.path ) - self.static_libpng_builddir = static_builddir + libpng_tarball.basename(".tar.gz") - self.libpng_makefile = static_libpng_builddir + 'Makefile' - self.libpng_a = static_libpng_builddir + '.libs' + 'libpng15.a' - - - # Fetch libjpeg tarball - self.libjpeg_version = ENV['libjpeg_version'] || '8d' - self.libjpeg_source_uri = URI( "http://www.ijg.org/files/jpegsrc.v#{libjpeg_version}.tar.gz" ) - self.libjpeg_tarball = static_sourcesdir + File.basename( libjpeg_source_uri.path ) - self.static_libjpeg_builddir = static_builddir + "jpeg-#{libjpeg_version}" - self.libjpeg_makefile = static_libjpeg_builddir + 'Makefile' - self.libjpeg_a = static_libjpeg_builddir + '.libs' + 'libjpeg.a' - - - # Fetch libtiff tarball - self.libtiff_version = ENV['libtiff_version'] || '4.0.3' - self.libtiff_source_uri = URI( "http://download.osgeo.org/libtiff/tiff-#{libtiff_version}.tar.gz" ) - self.libtiff_tarball = static_sourcesdir + File.basename( libtiff_source_uri.path ) - self.static_libtiff_builddir = static_builddir + libtiff_tarball.basename(".tar.gz") - self.libtiff_makefile = static_libtiff_builddir + 'Makefile' - self.libtiff_a = static_libtiff_builddir + 'libtiff' + '.libs' + 'libtiff.a' - - - # Fetch libfox tarball - self.libfox_version = ENV['libfox_version'] || '1.6.49' - self.libfox_source_uri = URI( "http://ftp.fox-toolkit.org/pub/fox-#{libfox_version}.tar.gz" ) - self.libfox_tarball = static_sourcesdir + File.basename( libfox_source_uri.path ) - self.static_libfox_builddir = static_builddir + libfox_tarball.basename(".tar.gz") - self.libfox_makefile = static_libfox_builddir + 'Makefile' - self.libfox_a = static_libfox_builddir + 'src' + '.libs' + 'libFOX-1.6.a' - - # Fetch fxscintilla tarball - self.libfxscintilla_version = ENV['libfxscintilla_version'] || '2.28.0' - self.libfxscintilla_source_uri = URI( "http://download.savannah.gnu.org/releases/fxscintilla/fxscintilla-#{libfxscintilla_version}.tar.gz" ) - self.libfxscintilla_tarball = static_sourcesdir + File.basename( libfxscintilla_source_uri.path ) - self.static_libfxscintilla_builddir = static_builddir + libfxscintilla_tarball.basename(".tar.gz") - self.libfxscintilla_makefile = static_libfxscintilla_builddir + 'Makefile' - self.libfxscintilla_a = static_libfxscintilla_builddir + 'fox' + '.libs' + 'libfxscintilla.a' - - - - # clean intermediate files and folders - CLEAN.include( static_builddir.to_s ) - - ##################################################################### - ### C R O S S - C O M P I L A T I O N - T A S K S - ##################################################################### - - directory static_sourcesdir.to_s - - # - # Static libz build tasks - # - directory static_libz_builddir.to_s - - # libz source file should be stored there - file libz_tarball => static_sourcesdir do |t| - # download the source file using wget or curl - chdir File.dirname(t.name) do - sh "wget '#{libz_source_uri}' -O #{libz_tarball}" - end - end - - # Extract the libz builds - file static_libz_builddir => libz_tarball do |t| - sh 'tar', '-xjf', libz_tarball.to_s, '-C', static_libz_builddir.parent.to_s - rm libz_makefile - end - - self.libz_env = [ - "CC=#{host_platform}-gcc", - "AR=#{host_platform}-ar", - "RANLIB=#{host_platform}-ranlib", - ] - - # generate the makefile in a clean build location - file libz_makefile => [static_libz_builddir] do |t| - chdir( static_libz_builddir ) do - options = [ - "--prefix=#{static_installdir}", - ] - - configure_path = static_libz_builddir + 'configure' - sh "env #{[libz_env, configure_path.to_s, *options].join(" ")}" - end - end - - # generate the makefile in a clean build location - task libz_a => libz_makefile do |t| - chdir( static_libz_builddir ) do - sh "make -j#{NUM_CPUS} install 'LDSHAREDLIBC=-lmsvcrt'" - end - end - - # - # Static libpng build tasks - # - directory static_libpng_builddir.to_s - - # libpng source file should be stored there - file libpng_tarball => static_sourcesdir do |t| - # download the source file using wget or curl - chdir File.dirname(t.name) do - sh "wget '#{libpng_source_uri}' -O #{libpng_tarball}" - end - end - - # Extract the libpng builds - file static_libpng_builddir => libpng_tarball do |t| - sh 'tar', '-xzf', libpng_tarball.to_s, '-C', static_libpng_builddir.parent.to_s - end - - self.libpng_env = [ - # Use build directory instead of install, to avoid unnecessary rebuilds of libpng - "'CPPFLAGS=-I#{static_libz_builddir}'", - "'LDFLAGS=-L#{static_libz_builddir}'", - ] - # generate the makefile in a clean build location - file libpng_makefile => [static_libpng_builddir, libz_a] do |t| - chdir( static_libpng_builddir ) do - options = [ - "--target=#{host_platform}", - "--host=#{host_platform}", - "--build=#{ruby_build}", - "--prefix=#{static_installdir}", - "--disable-shared", - ] - - configure_path = static_libpng_builddir + 'configure' - sh "env #{[libpng_env, configure_path.to_s, *options].join(" ")}" - end - end - - # generate the makefile in a clean build location - task libpng_a => [libpng_makefile, libz_a] do |t| - chdir( static_libpng_builddir ) do - sh "make -j#{NUM_CPUS} install" - end - end - - # - # Static libjpeg build tasks - # - directory static_libjpeg_builddir.to_s - - # libjpeg source file should be stored there - file libjpeg_tarball => static_sourcesdir do |t| - # download the source file using wget or curl - chdir File.dirname(t.name) do - sh "wget '#{libjpeg_source_uri}' -O #{libjpeg_tarball}" - end - end - - # Extract the libjpeg builds - file static_libjpeg_builddir => libjpeg_tarball do |t| - sh 'tar', '-xzf', libjpeg_tarball.to_s, '-C', static_libjpeg_builddir.parent.to_s - end - - # generate the makefile in a clean build location - file libjpeg_makefile => static_libjpeg_builddir do |t| - chdir( static_libjpeg_builddir ) do - options = [ - "--target=#{host_platform}", - "--host=#{host_platform}", - "--build=#{ruby_build}", - "--prefix=#{static_installdir}", - "--disable-shared", - ] - - configure_path = static_libjpeg_builddir + 'configure' - cmd = [ configure_path.to_s, *options ] - sh *cmd - end - end - - # build libjpeg.a - task libjpeg_a => [libjpeg_makefile] do |t| - chdir( static_libjpeg_builddir ) do - sh "make -j#{NUM_CPUS} install" - end - end - - # - # Static libtiff build tasks - # - directory static_libtiff_builddir.to_s - - # libtiff source file should be stored there - file libtiff_tarball => static_sourcesdir do |t| - # download the source file using wget or curl - chdir File.dirname(t.name) do - sh "wget '#{libtiff_source_uri}' -O #{libtiff_tarball}" - end - end - - # Extract the libtiff builds - file static_libtiff_builddir => libtiff_tarball do |t| - sh 'tar', '-xzf', libtiff_tarball.to_s, '-C', static_libtiff_builddir.parent.to_s - end - - self.libtiff_env = [ - "'CPPFLAGS=-I#{static_installdir}/include'", - "'LDFLAGS=-L#{static_installdir}/lib'", - ] - - # generate the makefile in a clean build location - file libtiff_makefile => [static_libtiff_builddir, libjpeg_a, libz_a] do |t| - chdir( static_libtiff_builddir ) do - options = [ - "--target=#{host_platform}", - "--host=#{host_platform}", - "--build=#{ruby_build}", - "--prefix=#{static_installdir}", - "--disable-shared", - "--with-zlib-include-dir=#{static_libz_builddir}", - "--with-zlib-lib-dir=#{File.dirname(libz_a)}", - "--with-jpeg-include-dir=#{static_libjpeg_builddir}", - "--with-jpeg-lib-dir=#{File.dirname(libjpeg_a)}", - ] - - configure_path = static_libtiff_builddir + 'configure' - sh "env #{[libtiff_env, configure_path.to_s, *options].join(" ")}" - end - end - - # build libtiff.a - task libtiff_a => [libtiff_makefile] do |t| - chdir( static_libtiff_builddir ) do - sh "make -j#{NUM_CPUS} install" - end - end - - - # - # Static libfox build tasks - # - directory static_libfox_builddir.to_s - - # libfox source file should be stored there - file libfox_tarball => static_sourcesdir do |t| - # download the source file using wget or curl - chdir File.dirname(t.name) do - sh "wget '#{libfox_source_uri}' -O #{libfox_tarball}" - end - end - - # Extract the libfox builds - file static_libfox_builddir => libfox_tarball do |t| - sh 'tar', '-xzf', libfox_tarball.to_s, '-C', static_libfox_builddir.parent.to_s - end - - self.libfox_env = [ - "'CPPFLAGS=-I#{static_installdir}/include'", - "'LDFLAGS=-L#{static_installdir}/lib'", - ] - - # generate the makefile in a clean build location - file libfox_makefile => [static_libfox_builddir, libjpeg_a, libz_a] do |t| - chdir( static_libfox_builddir ) do - options = [ - "--target=#{host_platform}", - "--host=#{host_platform}", - "--build=#{ruby_build}", - "--prefix=#{static_installdir}", - "--disable-shared", - "--without-xft", - "--without-x", - ] - - configure_path = static_libfox_builddir + 'configure' - sh "env #{[libfox_env, configure_path.to_s, *options].join(" ")}" - end - end - - # build libfox.a - task libfox_a => [libfox_makefile] do |t| - chdir( static_libfox_builddir ) do - sh "make -j#{NUM_CPUS} #{fox_env.join(" ")} install" - end - end - - - # - # Static libfxscintilla build tasks - # - directory static_libfxscintilla_builddir.to_s - - # libfxscintilla source file should be stored there - file libfxscintilla_tarball => static_sourcesdir do |t| - # download the source file using wget or curl - chdir File.dirname(t.name) do - sh "wget '#{libfxscintilla_source_uri}' -O #{libfxscintilla_tarball}" - end - end - - # Extract the libfxscintilla builds - file static_libfxscintilla_builddir => libfxscintilla_tarball do |t| - sh 'tar', '-xzf', libfxscintilla_tarball.to_s, '-C', static_libfxscintilla_builddir.parent.to_s - end - - self.fox_env = [ - "'CFLAGS=-I#{static_installdir}/include'", - "'CPPFLAGS=-I#{static_installdir}/include'", - "'LDFLAGS=-L#{static_installdir}/lib'", - "'FOX_CFLAGS=-I#{static_installdir}/include/fox-1.6 -DFOX_1_6'", - "'FOX_LIBS=-L#{static_installdir}/lib -lFOX-1.6'", - ] - - # generate the makefile in a clean build location - file libfxscintilla_makefile => [static_libfxscintilla_builddir, libfox_a] do |t| - chdir( static_libfxscintilla_builddir ) do - options = [ - "--target=#{host_platform}", - "--host=#{host_platform}", - "--build=#{ruby_build}", - "--prefix=#{static_installdir}", - "--disable-shared", - ] - - configure_path = static_libfxscintilla_builddir + 'configure' - sh "env #{[fox_env, configure_path.to_s, *options].join(" ")}" - end - end - - # build libfxscintilla.a - task libfxscintilla_a => [libfxscintilla_makefile] do |t| - chdir( static_libfxscintilla_builddir ) do - sh "make -j#{NUM_CPUS} #{fox_env.join(" ")} install" - end - end - - desc "compile static libz libraries" - task :static_libs => [ libz_a, libpng_a, libjpeg_a, libtiff_a, libfox_a, libfxscintilla_a ] - end -end - -if File.exist?(File.expand_path("~/.rake-compiler/config.yml")) - CrossLibraries = [ - 'i386-mingw32', - 'x64-mingw32', - ].map do |platform| - CrossLibrary.new platform - end -else - $stderr.puts "Cross-compilation disabled -- rake-compiler not properly installed" - CrossLibraries = [] -end - - -desc 'cross compile required libs for win32' -task :cross => [ :mingw32, :static_libs ] - -task :mingw32 do - # Use Rake::ExtensionCompiler helpers to find the proper host - unless Rake::ExtensionCompiler.mingw_host then - warn "You need to install mingw32 cross compile functionality to be able to continue." - warn "Please refer to your distribution/package manager documentation about installation." - fail - end -end - - -# vim: syntax=ruby diff --git a/ext/fox16_c/extconf.rb b/ext/fox16_c/extconf.rb index 14d0e50bb4e9a72f4edf4ff525a656e2afb25967..4ce01e0f3aff82df34a3e8445f6a9e39533c08f2 100755 --- a/ext/fox16_c/extconf.rb +++ b/ext/fox16_c/extconf.rb @@ -72,16 +72,259 @@ def fxscintilla_support_suppressed? ARGV.include? "--without-fxscintilla" end +def with_env(hash) + hash.each do |k, v| + ENV[k] = v + end + begin + yield + ensure + hash.each do |k, v| + ENV.delete(k) + end + end +end + +LIBZ_VERSION = ENV['LIBZ_VERSION'] || '1.2.7' +LIBZ_SOURCE_URI = "http://downloads.sourceforge.net/project/libpng/zlib/#{LIBZ_VERSION}/zlib-#{LIBZ_VERSION}.tar.bz2" + +LIBPNG_VERSION = ENV['LIBPNG_VERSION'] || '1.5.13' +LIBPNG_SOURCE_URI = "http://prdownloads.sourceforge.net/libpng/libpng-#{LIBPNG_VERSION}.tar.gz" + +LIBJPEG_VERSION = ENV['LIBJPEG_VERSION'] || '8d' +LIBJPEG_SOURCE_URI = "http://www.ijg.org/files/jpegsrc.v#{LIBJPEG_VERSION}.tar.gz" + +LIBTIFF_VERSION = ENV['LIBTIFF_VERSION'] || '4.0.3' +LIBTIFF_SOURCE_URI = "http://download.osgeo.org/libtiff/tiff-#{LIBTIFF_VERSION}.tar.gz" + +LIBFOX_VERSION = ENV['LIBFOX_VERSION'] || '1.6.49' +LIBFOX_SOURCE_URI = "http://ftp.fox-toolkit.org/pub/fox-#{LIBFOX_VERSION}.tar.gz" + +LIBFXSCINTILLA_VERSION = ENV['LIBFXSCINTILLA_VERSION'] || '2.28.0' +LIBFXSCINTILLA_SOURCE_URI = "http://download.savannah.gnu.org/releases/fxscintilla/fxscintilla-#{LIBFXSCINTILLA_VERSION}.tar.gz" + def do_rake_compiler_setup - if enable_config("win32-static-build") + if enable_config("win32-cross") + require 'mini_portile' + dir_config("installed") - have_library( 'gdi32', 'CreateDC' ) && append_library( $libs, 'gdi32' ) - have_library( 'opengl32' ) && append_library( $libs, 'opengl32' ) - have_library( 'winspool', 'EnumPrintersA') && append_library( $libs, 'winspool' ) - CONFIG['CC'] += "\nCXX=#{RbConfig::CONFIG["host"]}-g++" # Hack CXX into Makefile for cross compilation + libz_recipe = MiniPortile.new("libz", LIBZ_VERSION).tap do |recipe| + recipe.files = [LIBZ_SOURCE_URI] + recipe.target = portsdir = File.expand_path('../../../ports', __FILE__) + # Prefer host_alias over host in order to use i586-mingw32msvc as + # correct compiler prefix for cross build, but use host if not set. + recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"] + class << recipe + def configure + Dir.chdir work_path do + mk = File.read 'win32/Makefile.gcc' + File.open 'win32/Makefile.gcc', 'wb' do |f| + f.puts "BINARY_PATH = #{path}/bin" + f.puts "LIBRARY_PATH = #{path}/lib" + f.puts "INCLUDE_PATH = #{path}/include" + mk.sub!(/^PREFIX\s*=\s*$/, "PREFIX = #{host}-") + f.puts mk + end + end + end + + def configured? + Dir.chdir work_path do + !! (File.read('win32/Makefile.gcc') =~ /^BINARY_PATH/) + end + end + + def compile + execute "compile", "make -f win32/Makefile.gcc SHARED_MODE=1" + end + + def install + execute "install", "make -f win32/Makefile.gcc install SHARED_MODE=1" + end + end + + checkpoint = File.join(portsdir, "#{recipe.name}-#{recipe.version}-#{recipe.host}.installed") + unless File.exist?(checkpoint) + recipe.cook + FileUtils.touch checkpoint + end + recipe.activate + end + + libpng_recipe = MiniPortile.new("libpng", LIBPNG_VERSION).tap do |recipe| + recipe.files = [LIBPNG_SOURCE_URI] + recipe.target = portsdir = File.expand_path('../../../ports', __FILE__) + # Prefer host_alias over host in order to use i586-mingw32msvc as + # correct compiler prefix for cross build, but use host if not set. + recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"] + recipe.configure_options = [ + "--host=#{recipe.host}", + "--enable-shared", + "--disable-static", + ] + + checkpoint = File.join(portsdir, "#{recipe.name}-#{recipe.version}-#{recipe.host}.installed") + unless File.exist?(checkpoint) + with_env( + 'CPPFLAGS' => "-I#{libz_recipe.path}/include", + 'LDFLAGS' => "-L#{libz_recipe.path}/lib" + ) do + recipe.cook + FileUtils.touch checkpoint + end + end + recipe.activate + end + + libjpeg_recipe = MiniPortile.new("libjpeg", LIBJPEG_VERSION).tap do |recipe| + recipe.files = [LIBJPEG_SOURCE_URI] + recipe.target = portsdir = File.expand_path('../../../ports', __FILE__) + # Prefer host_alias over host in order to use i586-mingw32msvc as + # correct compiler prefix for cross build, but use host if not set. + recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"] + recipe.configure_options = [ + "--host=#{recipe.host}", + "--enable-shared", + "--disable-static", + ] + + checkpoint = File.join(portsdir, "#{recipe.name}-#{recipe.version}-#{recipe.host}.installed") + unless File.exist?(checkpoint) + recipe.cook + FileUtils.touch checkpoint + end + recipe.activate + end + + libtiff_recipe = MiniPortile.new("libtiff", LIBTIFF_VERSION).tap do |recipe| + recipe.files = [LIBTIFF_SOURCE_URI] + recipe.target = portsdir = File.expand_path('../../../ports', __FILE__) + # Prefer host_alias over host in order to use i586-mingw32msvc as + # correct compiler prefix for cross build, but use host if not set. + recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"] + recipe.configure_options = [ + "--host=#{recipe.host}", + "--enable-shared", + "--disable-static", + ] + + checkpoint = File.join(portsdir, "#{recipe.name}-#{recipe.version}-#{recipe.host}.installed") + unless File.exist?(checkpoint) + recipe.cook + FileUtils.touch checkpoint + end + recipe.activate + end + + libfox_recipe = MiniPortile.new("libfox", LIBFOX_VERSION).tap do |recipe| + recipe.files = [LIBFOX_SOURCE_URI] + recipe.target = portsdir = File.expand_path('../../../ports', __FILE__) + # Prefer host_alias over host in order to use i586-mingw32msvc as + # correct compiler prefix for cross build, but use host if not set. + recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"] + recipe.configure_options = [ + "--host=#{recipe.host}", + "--without-xft", + "--without-x", + "--enable-shared", + "--disable-static", + ] + class << recipe + def compile + # Add param -no-undefined to libtool to build a win32 shared lib + execute "compile", "#{ENV['MAKE'] || "make"} libFOX_1_6_la_LDFLAGS='-version-info 0:49:0 -export-dynamic -no-undefined'" + end + end + + checkpoint = File.join(portsdir, "#{recipe.name}-#{recipe.version}-#{recipe.host}.installed") + unless File.exist?(checkpoint) + with_env( + "CPPFLAGS" => "-I#{libjpeg_recipe.path}/include -I#{libpng_recipe.path}/include -I#{libtiff_recipe.path}/include -I#{libz_recipe.path}/include", + "LDFLAGS" => "-L#{libjpeg_recipe.path}/lib -L#{libpng_recipe.path}/lib -L#{libtiff_recipe.path}/lib -L#{libz_recipe.path}/lib" + ) do + recipe.cook + FileUtils.touch checkpoint + end + end + recipe.activate + end + + libfxscintills_recipe = MiniPortile.new("libfxscintilla", LIBFXSCINTILLA_VERSION).tap do |recipe| + recipe.files = [LIBFXSCINTILLA_SOURCE_URI] + recipe.target = portsdir = File.expand_path('../../../ports', __FILE__) + # Prefer host_alias over host in order to use i586-mingw32msvc as + # correct compiler prefix for cross build, but use host if not set. + recipe.host = RbConfig::CONFIG["host_alias"].empty? ? RbConfig::CONFIG["host"] : RbConfig::CONFIG["host_alias"] + recipe.configure_options = [ + "--host=#{recipe.host}", + "--enable-shared", + "--disable-static", + ] + class << recipe + attr_accessor :libfox_path + def mk + "#{ENV['MAKE'] || "make"}" + end + + def compile + execute "compile_lexers", "cd lexers && #{mk}" + execute "compile_lexlib", "cd lexlib && #{mk}" + execute "compile_src", "cd src && #{mk}" + execute "compile_fox", "cd fox && #{mk} libfxscintilla_la_LDFLAGS='-version-info 23:0:3 -export-dynamic -no-undefined -L#{libfox_path}/lib -lFOX-1.6'" + end + + def install + execute "install", "cd fox && #{mk} install && cd ../include && #{mk} install" + end + end + recipe.libfox_path = libfox_recipe.path + + checkpoint = File.join(portsdir, "#{recipe.name}-#{recipe.version}-#{recipe.host}.installed") + unless File.exist?(checkpoint) + recipe.cook + FileUtils.touch checkpoint + end + recipe.activate + end + +# have_library( 'gdi32', 'CreateDC' ) && append_library( $libs, 'gdi32' ) +# have_library( 'opengl32' ) && append_library( $libs, 'opengl32' ) +# have_library( 'winspool', 'EnumPrintersA') && append_library( $libs, 'winspool' ) + +# dir_config('libz', "#{libz_recipe.path}/include", "#{libz_recipe.path}/lib") +# dir_config('libpng', "#{libpng_recipe.path}/include", "#{libpng_recipe.path}/lib") +# dir_config('libtiff', "#{libtiff_recipe.path}/include", "#{libtiff_recipe.path}/lib") +# dir_config('libjpeg', "#{libjpeg_recipe.path}/include", "#{libjpeg_recipe.path}/lib") + dir_config('libfox', "#{libfox_recipe.path}/include", "#{libfox_recipe.path}/lib") + dir_config('libfxscintilla', "#{libfxscintills_recipe.path}/include", "#{libfxscintills_recipe.path}/lib") + + shared_dlls = [ + "#{libfxscintills_recipe.path}/bin/libfxscintilla-20.dll", + "#{libfox_recipe.path}/bin/libFOX-1.6-0.dll", + "#{libjpeg_recipe.path}/bin/libjpeg-8.dll", + "#{libpng_recipe.path}/bin/libpng15-15.dll", + "#{libtiff_recipe.path}/bin/libtiff-5.dll", + "#{libz_recipe.path}/bin/zlib1.dll", + ] + shared_dlls.each do |dll| + FileUtils.cp dll, '.', verbose: true + end + + gcc_shared_dlls = %w[libwinpthread-1.dll libgcc_s_dw2-1.dll libgcc_s_sjlj-1.dll libgcc_s_seh-1.dll libstdc++-6.dll] + gcc_shared_dlls.each do |dll| + cmd = "#{CONFIG['CC']} -print-file-name=#{dll}" + res = `#{cmd}`.chomp + next if dll == res + puts "#{cmd} => #{res}" + FileUtils.cp `#{cmd}`.chomp, '.', verbose: true + end + + CONFIG['CXX'] = "#{RbConfig::CONFIG["host"]}-g++" # CXX setting must be prefixed for cross build + CONFIG['CC'] += "\nCXX=#{CONFIG['CXX']}" # Hack CXX into Makefile for cross compilation CONFIG['LDSHARED'].gsub!('gcc', 'g++') # ensure C++ linker is used, so that libstdc++ is linked static - $LDFLAGS += " -s -static-libgcc -static-libstdc++" # mingw-w64 v4.7 defaults to dynamic linking + $LDFLAGS += " -s" # remove symbol table informations from shared lib + elsif RUBY_PLATFORM =~ /mingw/ $CFLAGS = $CFLAGS + " -I/usr/local/include" $LDFLAGS = $LDFLAGS + " -I/usr/local/lib" @@ -96,9 +339,8 @@ def do_rake_compiler_setup $libs = append_library($libs, "stdc++") unless RUBY_PLATFORM =~ /mingw/ || enable_config("win32-static-build") have_header("sys/time.h") unless RUBY_PLATFORM =~ /mingw/ || enable_config("win32-static-build") have_header("signal.h") - if have_library("z", "deflate") - have_library("png", "png_create_read_struct") - end + have_library("z", "deflate") + have_library("png", "png_create_read_struct") have_library("jpeg", "jpeg_mem_init") have_library("tiff", "TIFFSetErrorHandler") have_library("Xft", "XftInit") @@ -106,11 +348,10 @@ def do_rake_compiler_setup find_library("X11", "XFindContext", "/usr/X11R6/lib") find_library("GL", "glXCreateContext", "/usr/X11R6/lib") find_library("GLU", "gluNewQuadric", "/usr/X11R6/lib") - $libs = append_library($libs, "FOX-1.6") $libs = append_library($libs, "Xrandr") unless RUBY_PLATFORM =~ /mingw/ || enable_config("win32-static-build") $libs = append_library($libs, "Xcursor") unless RUBY_PLATFORM =~ /mingw/ || enable_config("win32-static-build") - $libs = append_library($libs, "png") find_header('FXRbCommon.h', File.join(File.dirname(__FILE__), 'include')) + $libs = append_library($libs, "FOX-1.6") if is_fxscintilla_build? FileUtils.move('scintilla_wrap.cpp.bak', 'scintilla_wrap.cpp') if FileTest.exist?('scintilla_wrap.cpp.bak') $CPPFLAGS = $CPPFLAGS + " -DWITH_FXSCINTILLA -DHAVE_FOX_1_6" diff --git a/ext/fox16_c/impl.cpp b/ext/fox16_c/impl.cpp index 009484e59eb79c1738597851fdc9fa58c77bd4c9..408c363e1ff1c00edb793c1445849914f72743a3 100644 --- a/ext/fox16_c/impl.cpp +++ b/ext/fox16_c/impl.cpp @@ -454,7 +454,6 @@ IMPLEMENT_FXID_STUBS(FXRbImage) IMPLEMENT_FXDRAWABLE_STUBS(FXRbImage) IMPLEMENT_FXIMAGE_STUBS(FXRbImage) -/* Start stub implementations for class FXRbImageData */ /* Start stub implementations for class FXRbImageFrame */ IMPLEMENT_FXOBJECT_STUBS(FXRbImageFrame) IMPLEMENT_FXID_STUBS(FXRbImageFrame) diff --git a/lib/fox16.rb b/lib/fox16.rb index c27088176c5dbed27f0928ef6b3c0f551d0d3171..7902976db905b4104a6a66667f43d34a523abab1 100644 --- a/lib/fox16.rb +++ b/lib/fox16.rb @@ -1,9 +1,19 @@ -if RUBY_PLATFORM =~ /(mswin|mingw)/i - require "#{RUBY_VERSION.sub(/\.\d+$/, '')}/fox16_c.so" -elsif RUBY_PLATFORM =~ /darwin/ - require "fox16_c.bundle" -else - require "fox16_c.so" +begin + require 'fox16_c' +rescue LoadError + # If it's a Windows binary gem, try the <major>.<minor> subdirectory + if RUBY_PLATFORM =~/(mswin|mingw)/i + major_minor = RUBY_VERSION[ /^(\d+\.\d+)/ ] or + raise "Oops, can't extract the major/minor version from #{RUBY_VERSION.dump}" + + # Set the PATH environment variable, so that libpq.dll can be found. + old_path = ENV['PATH'] + ENV['PATH'] = "#{File.expand_path("../#{RUBY_PLATFORM.gsub("i386", "x86")}", __FILE__)};#{old_path}" + require "#{major_minor}/fox16_c" + ENV['PATH'] = old_path + else + raise + end end require "fox16/core"