From d67c5198b23c375502fe1c540b3d075326729413 Mon Sep 17 00:00:00 2001 From: Lars Kanis <lars@greiz-reinsdorf.de> Date: Sun, 31 Mar 2013 15:32:36 +0200 Subject: [PATCH] Add support for x64-mingw32 target. Update cross compilation tasks to build x64 and x86 targets. --- Rakefile | 34 +- Rakefile.cross | 718 ++++++++++++++++++---------------- ext/fox16_c/FXRuby.cpp | 10 +- ext/fox16_c/extconf.rb | 2 +- ext/fox16_c/include/FXRuby.h | 11 +- swig-interfaces/FXApp.i | 4 +- swig-interfaces/FXGLCanvas.i | 8 +- swig-interfaces/FXScintilla.i | 10 +- 8 files changed, 423 insertions(+), 374 deletions(-) diff --git a/Rakefile b/Rakefile index e4f47f6..9348b70 100755 --- a/Rakefile +++ b/Rakefile @@ -19,7 +19,8 @@ end # Some constants we'll need PKG_VERSION = Fox.fxrubyversion -FXSCINTILLA_INSTALL_DIR = Pathname( "build/builds/fxscintilla-#{LIBFXSCINTILLA_VERSION}" ).expand_path +# TODO: Don't depend on cross compilation task +FXSCINTILLA_INSTALL_DIR = Pathname( CrossLibraries.first.static_libfxscintilla_builddir ).expand_path SWIG = (RUBY_PLATFORM =~ /mingw/) ? "swig-1.3.22.exe" : "swig-1.3.22" SWIGFLAGS = "-fcompact -noruntime -c++ -ruby -no_default -I../fox-includes" @@ -91,14 +92,29 @@ task :test => [:compile] Rake::ExtensionTask.new("fox16_c", hoe.spec) do |ext| ext.cross_compile = true - ext.cross_platform = ['i386-mingw32'] - ext.cross_config_options += [ - "--with-fox-include=#{STATIC_INSTALLDIR}/include/fox-1.6", - "--with-fxscintilla-include=#{STATIC_INSTALLDIR}/include/fxscintilla", - "--with-installed-dir=#{STATIC_INSTALLDIR}", - "--enable-win32-static-build", - "--with-fxscintilla", - ] + 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", + ] + } + 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 + end end # Set environment variable SWIG_LIB to diff --git a/Rakefile.cross b/Rakefile.cross index 922b104..0c057b8 100755 --- a/Rakefile.cross +++ b/Rakefile.cross @@ -9,20 +9,7 @@ require 'uri' require 'rbconfig' require 'pathname' -ENV['RUBY_CC_VERSION'] ||= '1.8.7:1.9.3' - -# Cross-compilation constants -COMPILE_HOME = Pathname( "build" ).expand_path -STATIC_SOURCESDIR = COMPILE_HOME + 'sources' -STATIC_BUILDDIR = COMPILE_HOME + 'builds' -STATIC_INSTALLDIR = COMPILE_HOME + 'install' -RUBY_BUILD = RbConfig::CONFIG["host"] -CROSS_PREFIX = begin - Rake::ExtensionCompiler.mingw_host -rescue => err - $stderr.puts "Cross-compilation disabled -- %s" % [ err.message ] - 'unknown' -end +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 @@ -32,354 +19,392 @@ else 1 end - -# Fetch zlib tarball -LIBZ_VERSION = ENV['LIBZ_VERSION'] || '1.2.7' -LIBZ_SOURCE_URI = URI( "http://downloads.sourceforge.net/project/libpng/zlib/#{LIBZ_VERSION}/zlib-#{LIBZ_VERSION}.tar.bz2" ) -LIBZ_TARBALL = STATIC_SOURCESDIR + File.basename( LIBZ_SOURCE_URI.path ) -STATIC_LIBZ_BUILDDIR = STATIC_BUILDDIR + LIBZ_TARBALL.basename(".tar.bz2") -LIBZ_MAKEFILE = STATIC_LIBZ_BUILDDIR + 'Makefile' -LIBZ_A = STATIC_INSTALLDIR + 'lib' + 'libz.a' - -# Fetch libpng tarball -LIBPNG_VERSION = ENV['LIBPNG_VERSION'] || '1.5.13' -LIBPNG_SOURCE_URI = URI( "http://prdownloads.sourceforge.net/libpng/libpng-#{LIBPNG_VERSION}.tar.gz?download" ) -LIBPNG_TARBALL = STATIC_SOURCESDIR + File.basename( LIBPNG_SOURCE_URI.path ) -STATIC_LIBPNG_BUILDDIR = STATIC_BUILDDIR + LIBPNG_TARBALL.basename(".tar.gz") -LIBPNG_MAKEFILE = STATIC_LIBPNG_BUILDDIR + 'Makefile' -LIBPNG_A = STATIC_INSTALLDIR + 'lib' + 'libpng.a' - - -# Fetch libjpeg tarball -LIBJPEG_VERSION = ENV['LIBJPEG_VERSION'] || '8d' -LIBJPEG_SOURCE_URI = URI( "http://www.ijg.org/files/jpegsrc.v#{LIBJPEG_VERSION}.tar.gz" ) -LIBJPEG_TARBALL = STATIC_SOURCESDIR + File.basename( LIBJPEG_SOURCE_URI.path ) -STATIC_LIBJPEG_BUILDDIR = STATIC_BUILDDIR + "jpeg-#{LIBJPEG_VERSION}" -LIBJPEG_MAKEFILE = STATIC_LIBJPEG_BUILDDIR + 'Makefile' -LIBJPEG_A = STATIC_INSTALLDIR + 'lib' + 'libjpeg.a' - - -# Fetch libtiff tarball -LIBTIFF_VERSION = ENV['LIBTIFF_VERSION'] || '4.0.3' -LIBTIFF_SOURCE_URI = URI( "http://download.osgeo.org/libtiff/tiff-#{LIBTIFF_VERSION}.tar.gz" ) -LIBTIFF_TARBALL = STATIC_SOURCESDIR + File.basename( LIBTIFF_SOURCE_URI.path ) -STATIC_LIBTIFF_BUILDDIR = STATIC_BUILDDIR + LIBTIFF_TARBALL.basename(".tar.gz") -LIBTIFF_MAKEFILE = STATIC_LIBTIFF_BUILDDIR + 'Makefile' -LIBTIFF_A = STATIC_INSTALLDIR + 'lib' + 'libtiff.a' - - -# Fetch libfox tarball -LIBFOX_VERSION = ENV['LIBFOX_VERSION'] || '1.6.47' -LIBFOX_SOURCE_URI = URI( "http://ftp.fox-toolkit.org/pub/fox-#{LIBFOX_VERSION}.tar.gz" ) -LIBFOX_TARBALL = STATIC_SOURCESDIR + File.basename( LIBFOX_SOURCE_URI.path ) -STATIC_LIBFOX_BUILDDIR = STATIC_BUILDDIR + LIBFOX_TARBALL.basename(".tar.gz") -LIBFOX_MAKEFILE = STATIC_LIBFOX_BUILDDIR + 'Makefile' -LIBFOX_A = STATIC_INSTALLDIR + 'lib' + 'libfox.a' - -# Fetch fxscintilla tarball -LIBFXSCINTILLA_VERSION = ENV['LIBFXSCINTILLA_VERSION'] || '2.28.0' -LIBFXSCINTILLA_SOURCE_URI = URI( "http://download.savannah.gnu.org/releases/fxscintilla/fxscintilla-#{LIBFXSCINTILLA_VERSION}.tar.gz" ) -LIBFXSCINTILLA_TARBALL = STATIC_SOURCESDIR + File.basename( LIBFXSCINTILLA_SOURCE_URI.path ) -STATIC_LIBFXSCINTILLA_BUILDDIR = STATIC_BUILDDIR + LIBFXSCINTILLA_TARBALL.basename(".tar.gz") -LIBFXSCINTILLA_MAKEFILE = STATIC_LIBFXSCINTILLA_BUILDDIR + 'Makefile' -LIBFXSCINTILLA_A = STATIC_INSTALLDIR + 'lib' + '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 - -LIBZ_ENV = [ - "CC=#{CROSS_PREFIX}-gcc", - "AR=#{CROSS_PREFIX}-ar", - "RANLIB=#{CROSS_PREFIX}-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}", +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.47' + 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", ] - 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 - -LIBPNG_ENV = [ - "'CPPFLAGS=-I#{STATIC_INSTALLDIR}/include'", - "'LDFLAGS=-L#{STATIC_INSTALLDIR}/lib'", -] -# 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=#{CROSS_PREFIX}", - "--host=#{CROSS_PREFIX}", - "--build=#{RUBY_BUILD}", - "--prefix=#{STATIC_INSTALLDIR}", - "--disable-shared", + # 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}'", ] - - 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=#{CROSS_PREFIX}", - "--host=#{CROSS_PREFIX}", - "--build=#{RUBY_BUILD}", - "--prefix=#{STATIC_INSTALLDIR}", - "--disable-shared", + # 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'", ] - 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 - -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=#{CROSS_PREFIX}", - "--host=#{CROSS_PREFIX}", - "--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)}", + # 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'", ] - 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 - -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=#{CROSS_PREFIX}", - "--host=#{CROSS_PREFIX}", - "--build=#{RUBY_BUILD}", - "--prefix=#{STATIC_INSTALLDIR}", - "--disable-shared", - "--without-xft", - "--without-x", + # 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'", ] - configure_path = STATIC_LIBFOX_BUILDDIR + 'configure' - sh "env #{[LIBFOX_ENV, configure_path.to_s, *options].join(" ")}" + # 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 -# 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 - -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=#{CROSS_PREFIX}", - "--host=#{CROSS_PREFIX}", - "--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" +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 "compile static libz libraries" -task :static_libs => [ LIBZ_A, LIBPNG_A, LIBJPEG_A, LIBTIFF_A, LIBFOX_A, LIBFXSCINTILLA_A ] - desc 'cross compile required libs for win32' task :cross => [ :mingw32, :static_libs ] @@ -390,7 +415,6 @@ task :mingw32 do warn "Please refer to your distribution/package manager documentation about installation." fail end - ENV['CROSS_PREFIX'] = Rake::ExtensionCompiler.mingw_host end diff --git a/ext/fox16_c/FXRuby.cpp b/ext/fox16_c/FXRuby.cpp index 4f2cb14..7ef9f06 100644 --- a/ext/fox16_c/FXRuby.cpp +++ b/ext/fox16_c/FXRuby.cpp @@ -552,7 +552,7 @@ static VALUE FXRbConvertMessageData(FXObject* sender,FXObject* recv,FXSelector s return to_ruby(reinterpret_cast<FXEvent*>(ptr)); } else if(type==SEL_SIGNAL){ - return to_ruby(static_cast<int>(reinterpret_cast<long>(ptr))); + return to_ruby(static_cast<int>(reinterpret_cast<FXuval>(ptr))); } else if(type==SEL_IO_READ || type==SEL_IO_WRITE || @@ -600,7 +600,7 @@ static VALUE FXRbConvertMessageData(FXObject* sender,FXObject* recv,FXSelector s } } else if(sender->isMemberOf(FXMETACLASS(FXColorDialog))){ - if(type==SEL_CHANGED || type==SEL_COMMAND) return to_ruby(static_cast<FXColor>(reinterpret_cast<unsigned long>(ptr))); + if(type==SEL_CHANGED || type==SEL_COMMAND) return to_ruby(static_cast<FXColor>(reinterpret_cast<FXuval>(ptr))); } else if(sender->isMemberOf(FXMETACLASS(FXColorRing))){ if(type==SEL_CHANGED || type==SEL_COMMAND){ @@ -609,7 +609,7 @@ static VALUE FXRbConvertMessageData(FXObject* sender,FXObject* recv,FXSelector s } } else if(sender->isMemberOf(FXMETACLASS(FXColorSelector))){ - if(type==SEL_CHANGED || type==SEL_COMMAND) return to_ruby(static_cast<FXColor>(reinterpret_cast<unsigned long>(ptr))); + if(type==SEL_CHANGED || type==SEL_COMMAND) return to_ruby(static_cast<FXColor>(reinterpret_cast<FXuval>(ptr))); } else if(sender->isMemberOf(FXMETACLASS(FXColorWell))){ if(type==SEL_CHANGED || @@ -617,7 +617,7 @@ static VALUE FXRbConvertMessageData(FXObject* sender,FXObject* recv,FXSelector s type==SEL_CLICKED || type==SEL_DOUBLECLICKED || type==SEL_TRIPLECLICKED) { - VALUE v=to_ruby(static_cast<FXColor>(reinterpret_cast<unsigned long>(ptr))); + VALUE v=to_ruby(static_cast<FXColor>(reinterpret_cast<FXuval>(ptr))); return v; } } @@ -819,7 +819,7 @@ static VALUE FXRbConvertMessageData(FXObject* sender,FXObject* recv,FXSelector s } else if(sender->isMemberOf(FXMETACLASS(FXSpinner))){ if(type==SEL_CHANGED || type==SEL_COMMAND) - return to_ruby(static_cast<FXint>(reinterpret_cast<long>(ptr))); + return to_ruby(static_cast<FXint>(reinterpret_cast<FXuval>(ptr))); } else if(sender->isMemberOf(FXMETACLASS(FXSplitter))){ if(type==SEL_CHANGED || type==SEL_COMMAND) diff --git a/ext/fox16_c/extconf.rb b/ext/fox16_c/extconf.rb index 9e9b75a..89e9b17 100755 --- a/ext/fox16_c/extconf.rb +++ b/ext/fox16_c/extconf.rb @@ -79,7 +79,7 @@ def do_rake_compiler_setup have_library( 'opengl32' ) && append_library( $libs, 'opengl32' ) have_library( 'winspool', 'EnumPrintersA') && append_library( $libs, 'winspool' ) - CONFIG['CC'] += "\nCXX=#{ENV['CROSS_PREFIX']}-g++" # Hack CXX into Makefile for cross compilation + CONFIG['CC'] += "\nCXX=#{RbConfig::CONFIG["host"]}-g++" # 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 elsif RUBY_PLATFORM =~ /mingw/ diff --git a/ext/fox16_c/include/FXRuby.h b/ext/fox16_c/include/FXRuby.h index 21f527d..111c11e 100644 --- a/ext/fox16_c/include/FXRuby.h +++ b/ext/fox16_c/include/FXRuby.h @@ -41,6 +41,13 @@ #define RSTRING_PTR(s) RSTRING((s))->ptr #endif +#ifndef NUM2SIZET +#define NUM2SIZET(s) NUM2ULONG(s) +#endif +#ifndef SIZET2NUM +#define SIZET2NUM(s) ULONG2NUM(s) +#endif + // Opaque type declaration for SWIG runtime support struct swig_type_info; @@ -322,7 +329,7 @@ inline VALUE fxid_to_int(FXID id){ #ifndef WIN32 return UINT2NUM(static_cast<unsigned int>(id)); #else - return ULONG2NUM(reinterpret_cast<unsigned long>(id)); + return SIZET2NUM(reinterpret_cast<size_t>(id)); #endif } @@ -334,7 +341,7 @@ inline FXID int_to_fxid(VALUE value){ #ifndef WIN32 return static_cast<FXID>(NUM2UINT(value)); #else - return reinterpret_cast<FXID>(NUM2ULONG(value)); + return reinterpret_cast<FXID>(NUM2SIZET(value)); #endif } diff --git a/swig-interfaces/FXApp.i b/swig-interfaces/FXApp.i index e215142..f192169 100644 --- a/swig-interfaces/FXApp.i +++ b/swig-interfaces/FXApp.i @@ -197,8 +197,8 @@ public: %extend { /// Return pointer to display - unsigned long getDisplay() const { - return reinterpret_cast<unsigned long>(self->getDisplay()); + FXuval getDisplay() const { + return reinterpret_cast<FXuval>(self->getDisplay()); } } diff --git a/swig-interfaces/FXGLCanvas.i b/swig-interfaces/FXGLCanvas.i index 59bbcef..4c9162d 100644 --- a/swig-interfaces/FXGLCanvas.i +++ b/swig-interfaces/FXGLCanvas.i @@ -53,13 +53,13 @@ public: %extend { /// Return current context, if any - static unsigned long getCurrentContext(){ - return reinterpret_cast<unsigned long>(FXGLCanvas::getCurrentContext()); + static FXuval getCurrentContext(){ + return reinterpret_cast<FXuval>(FXGLCanvas::getCurrentContext()); } /// Get GL context handle - unsigned long getContext() const { - return reinterpret_cast<unsigned long>(self->getContext()); + FXuval getContext() const { + return reinterpret_cast<FXuval>(self->getContext()); } } diff --git a/swig-interfaces/FXScintilla.i b/swig-interfaces/FXScintilla.i index cb31972..8d06eb8 100644 --- a/swig-interfaces/FXScintilla.i +++ b/swig-interfaces/FXScintilla.i @@ -139,11 +139,12 @@ public: // Convert wParam argument uptr_t wp; switch(TYPE(wParam)){ + case T_BIGNUM: case T_FIXNUM: - wp=static_cast<uptr_t>(NUM2UINT(wParam)); + wp=static_cast<uptr_t>(NUM2SIZET(wParam)); break; case T_STRING: - wp=static_cast<uptr_t>(reinterpret_cast<long>(RSTRING_PTR(wParam))); + wp=static_cast<uptr_t>(reinterpret_cast<FXuval>(RSTRING_PTR(wParam))); break; case T_TRUE: case T_FALSE: @@ -157,11 +158,12 @@ public: // Convert lParam argument sptr_t lp; switch(TYPE(lParam)){ + case T_BIGNUM: case T_FIXNUM: - lp=static_cast<sptr_t>(NUM2UINT(lParam)); + lp=static_cast<sptr_t>(NUM2SIZET(lParam)); break; case T_STRING: - lp=static_cast<sptr_t>(reinterpret_cast<long>(RSTRING_PTR(lParam))); + lp=static_cast<sptr_t>(reinterpret_cast<FXival>(RSTRING_PTR(lParam))); break; case T_TRUE: case T_FALSE: -- GitLab