Search code examples
rubyeventmachineopenwrtruby-2.2

Compile error ruby eventmachine for OpenWRT Barrier Breaker errors with "error: size of array '...' is negative"


I have embarked on creating a package of Ruby 2.2 with Event Machine for OpenWRT Barrier Breaker. The makefile for the eventmachine package can be seen here: https://github.com/DaKaZ/ruby-openwrt/blob/master/packages/ruby-eventmachine/Makefile

I was able to successfully use the Ruby 2.2 implementation from the trunk of feeds/packages and am running OpenWRT Barrier Breaker with Ruby 2.2 on my router, but... eventmachine is throwing the following error when it builds:

In file included from /Volumes/OpenWrt/barrier_breaker/staging_dir/host/include/ruby-2.2.0/ruby.h:33:0,
             from rubymain.cpp:26:
/Volumes/OpenWrt/barrier_breaker/staging_dir/host/include/ruby-2.2.0/ruby/ruby.h:107:73: error: size of array 'ruby_check_sizeof_long' is negative
 typedef char ruby_check_sizeof_long[SIZEOF_LONG == sizeof(long) ? 1 : -1];
                                                                         ^
/Volumes/OpenWrt/barrier_breaker/staging_dir/host/include/ruby-2.2.0/ruby/ruby.h:111:76: error: size of array 'ruby_check_sizeof_voidp' is negative
 typedef char ruby_check_sizeof_voidp[SIZEOF_VOIDP == sizeof(void*) ? 1 : -1];
                                                                            ^
In file included from /Volumes/OpenWrt/barrier_breaker/staging_dir/host/include/ruby-2.2.0/ruby/intern.h:35:0,
                 from /Volumes/OpenWrt/barrier_breaker/staging_dir/host/include/ruby-2.2.0/ruby/ruby.h:1710,
                 from /Volumes/OpenWrt/barrier_breaker/staging_dir/host/include/ruby-2.2.0/ruby.h:33,
                 from rubymain.cpp:26:
/Volumes/OpenWrt/barrier_breaker/staging_dir/host/include/ruby-2.2.0/ruby/st.h:52:93: error: size of array 'st_check_for_sizeof_st_index_t' is negative
 typedef char st_check_for_sizeof_st_index_t[SIZEOF_VOIDP == (int)sizeof(st_index_t) ? 1 : -1];
                                                                                             ^
make[4]: *** [rubymain.o] Error 1
make[3]: *** [/Volumes/OpenWrt/barrier_breaker/build_dir/target-mipsel_74kc+dsp2_uClibc-0.9.33.2/linux-brcm47xx_mips74k/ruby-eventmachine-1.0.7/.built] Error 2
make[3]: Leaving directory `/Volumes/OpenWrt/barrier_breaker/feeds/rubyopenwrt/packages/ruby-eventmachine'
make[2]: *** [package/feeds/rubyopenwrt/ruby-eventmachine/compile] Error 2
make[2]: Leaving directory `/Volumes/OpenWrt/barrier_breaker'
make[1]: *** [/Volumes/OpenWrt/barrier_breaker/staging_dir/target-mipsel_74kc+dsp2_uClibc-0.9.33.2/stamp/.package_compile] Error 2
make[1]: Leaving directory `/Volumes/OpenWrt/barrier_breaker'
make: *** [world] Error 2

This appears to be an error in the HOST version of ruby but I can't figure out how to correctly use the cross compiled version to build eventmachine. Please help!


Solution

  • For anyone interested - I was able to build and run event machine and it works great, but ONLY with a custom Makefile - I could never get the auto generated files to run correctly. Here is that Makefile. I use a simple script to setup the build properly:

    echo "[update feeds]"
    ./scripts/feeds update -a
    
    echo "[install packages from rubyopenwrt feed]"
    ./scripts/feeds install -a -p rubyopenwrt
    
    echo "[install customized ruby-eventmachine makefile]"
    cp em-build-works/Makefile feeds/rubyopenwrt/packages/ruby-eventmachine
    

    Here is the working Makefile:

    include $(TOPDIR)/rules.mk
    include $(INCLUDE_DIR)/kernel.mk
    
    
    RUBY_PKG_LIBVER:=2.2
    
    PKG_NAME:=ruby-eventmachine
    PKG_SHORT_NAME:=eventmachine
    PKG_RELEASE:=1
    PKG_LIBVER:=1.0.7
    PKG_REV:=6dbdb97bada05d33a1f0d469a49d8c46ac2e77d0
    PKG_VERSION:=$(PKG_LIBVER)
    
    PKG_SOURCE:=$(PKG_NAME).tar.gz
    PKG_SOURCE_URL:=git://github.com/eventmachine/eventmachine.git
    PKG_SOURCE_VERSION:=$(PKG_REV)
    PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
    PKG_SOURCE_PROTO:=git
    
    PKG_BUILD_DEPENDS:=
    PKG_BUILD_PARALLEL:=1
    
    include $(INCLUDE_DIR)/package.mk
    
    define Package/ruby-eventmachine
      SUBMENU:=Ruby
      SECTION:=lang
      CATEGORY:=Languages
      DEPENDS:=+ruby-socket +libstdcpp +libc +libgcc +libssl +libcrypto
      TITLE:=Ruby eventmachine gem
    endef
    
    RUBY:= \
        $(STAGING_DIR_HOST)/bin/ruby -I $(STAGING_DIR_HOST)/share/ri \
    
    
    define Package/ruby-eventmachine/description
     This package contains the ruby eventmachine gem.
    endef
    
    define Build/Configure/eventmachine
        (cd $(PKG_BUILD_DIR)/ext; \
            $(RUBY) extconf.rb; \
        );
    endef
    
    define Build/Compile/eventmachine
        $(MAKE_VARS) \
        $(MAKE) -C $(PKG_BUILD_DIR)/ext \
            $(MAKE_FLAGS) \
            $(1);
        $(CP) $(PKG_BUILD_DIR)/ext/*.so $(PKG_BUILD_DIR)/lib/
    endef
    
    define Build/Configure/fastfilereader
        (cd $(PKG_BUILD_DIR)/ext/fastfilereader; \
            $(RUBY) extconf.rb; \
        );
    endef
    
    define Build/Compile/fastfilereader
        $(MAKE_VARS) \
        $(MAKE) -C $(PKG_BUILD_DIR)/ext/fastfilereader \
            $(MAKE_FLAGS) \
            $(1);
        $(CP) $(PKG_BUILD_DIR)/ext/fastfilereader/*.so $(PKG_BUILD_DIR)/lib/
    endef
    
    define Build/Configure
        $(call Build/Configure/eventmachine)
        $(call Build/Configure/fastfilereader)
    endef
    
    # hack Makefiles here
    define Build/Compile
        $(SED) 's/-fstack-protector//' $(PKG_BUILD_DIR)/ext/fastfilereader/Makefile
        $(SED) '17s/host.*/target-mips-rlx5281-linux\/usr\/include\/ruby-2.2\/mips-linux-gnu/' $(PKG_BUILD_DIR)/ext/fastfilereader/Makefile
        $(call Build/Compile/fastfilereader)
        $(SED) 's/-fstack-protector//' $(PKG_BUILD_DIR)/ext/Makefile
        $(SED) '17s/host.*/target-mips-rlx5281-linux\/usr\/include\/ruby-2.2\/mips-linux-gnu/' $(PKG_BUILD_DIR)/ext/Makefile
        $(call Build/Compile/eventmachine)
    endef
    
    define Package/ruby-eventmachine/install
        $(INSTALL_DIR) $(1)/usr/lib/ruby/$(RUBY_PKG_LIBVER)/mips-linux-gnu
        $(CP) $(PKG_BUILD_DIR)/lib/eventmachine.rb $(1)/usr/lib/ruby/$(RUBY_PKG_LIBVER)/
        $(CP) $(PKG_BUILD_DIR)/lib/em $(1)/usr/lib/ruby/$(RUBY_PKG_LIBVER)/
        $(CP) $(PKG_BUILD_DIR)/lib/*.so $(1)/usr/lib/ruby/$(RUBY_PKG_LIBVER)/mips-linux-gnu
    endef
    
    $(eval $(call BuildPackage,ruby-eventmachine,+libopenssl))