Patchwork luajit: new package

login
register
mail settings
Submitter Thomas Petazzoni
Date July 14, 2012, 10:50 p.m.
Message ID <1342306252-19152-1-git-send-email-thomas.petazzoni@free-electrons.com>
Download mbox | patch
Permalink /patch/171031/
State Superseded
Headers show

Comments

Thomas Petazzoni - July 14, 2012, 10:50 p.m.
From: François Perrad <francois.perrad@gadz.org>

[thomas.petazzoni@free-electrons.com:
 - Added shared library patch to link luajit dynamically against the
   luajit library
 - Added no strip patch.
 - Added no symlink patch.
 - Removed symlink creation logic from luajit.mk.
 - Fixed compilation on x86_64 hosts by adding -m32 to the compile
   flags.
 - Added 'depends on' for the architectures supported by luajit.
]

Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
---
 package/Config.in                             |    3 +-
 package/luajit/Config.in                      |   10 ++++
 package/luajit/luajit-01-root-path.patch      |   22 +++++++++
 package/luajit/luajit-02-shared-lib.patch     |   17 +++++++
 package/luajit/luajit-03-dont-strip.patch     |   23 ++++++++++
 package/luajit/luajit-04-no-bin-symlink.patch |   40 ++++++++++++++++
 package/luajit/luajit.mk                      |   61 +++++++++++++++++++++++++
 7 files changed, 175 insertions(+), 1 deletion(-)
 create mode 100644 package/luajit/Config.in
 create mode 100644 package/luajit/luajit-01-root-path.patch
 create mode 100644 package/luajit/luajit-02-shared-lib.patch
 create mode 100644 package/luajit/luajit-03-dont-strip.patch
 create mode 100644 package/luajit/luajit-04-no-bin-symlink.patch
 create mode 100644 package/luajit/luajit.mk
Francois Perrad - July 15, 2012, 5:19 p.m.
With a x86 host and an ARM target, I obtain the following error :
>>> luajit 2.0.0-beta10 Building
/usr/bin/make -j2 PREFIX="/usr"
STATIC_CC="/home/user/build/qarm/host/usr/bin/arm-unknown-linux-uclibcgnueabi-gcc"
DYNAMIC_CC="/home/user/build/qarm/host/usr/bin/arm-unknown-linux-uclibcgnueabi-gcc
-fPIC" TARGET_LD="/home/user/build/qarm/host/usr/bin/arm-unknown-linux-uclibcgnueabi-gcc"
TARGET_AR="/home/user/build/qarm/host/usr/bin/arm-unknown-linux-uclibcgnueabi-ar
rcus" TARGET_STRIP="/home/user/build/qarm/host/usr/bin/arm-unknown-linux-uclibcgnueabi-strip"
CFLAGS=" -pipe -Os " LDFLAGS="" HOST_CC=""/usr/bin/gcc -m32""
HOST_CFLAGS="-O2 -I/home/user/build/qarm/host/include
-I/home/user/build/qarm/host/usr/include"
HOST_LDFLAGS="-L/home/user/build/qarm/host/lib
-L/home/user/build/qarm/host/usr/lib
-Wl,-rpath,/home/user/build/qarm/host/usr/lib" -C
/home/user/build/qarm/build/luajit-2.0.0-beta10 amalg
/usr/bin/make: invalid option -- '3'
/usr/bin/make: invalid option -- '2'

so, I remove extra quote :
ifeq ($(BR2_ARCH_IS_64),y)
LUAJIT_HOST_CC=$(HOSTCC)
else
LUAJIT_HOST_CC=$(HOSTCC) -m32
endif

and the build command could be rewrite with CROSS :
define LUAJIT_BUILD_CMDS
	$(MAKE) PREFIX="/usr" \
		HOST_CC="$(LUAJIT_HOST_CC)" \
		CROSS="$(TARGET_CROSS)" \
		-C $(@D) amalg
endef

François

Note : please, don't forget http://patchwork.ozlabs.org/patch/162294/

2012/7/15 Thomas Petazzoni <thomas.petazzoni@free-electrons.com>:
> From: François Perrad <francois.perrad@gadz.org>
>
> [thomas.petazzoni@free-electrons.com:
>  - Added shared library patch to link luajit dynamically against the
>    luajit library
>  - Added no strip patch.
>  - Added no symlink patch.
>  - Removed symlink creation logic from luajit.mk.
>  - Fixed compilation on x86_64 hosts by adding -m32 to the compile
>    flags.
>  - Added 'depends on' for the architectures supported by luajit.
> ]
>
> Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> ---
>  package/Config.in                             |    3 +-
>  package/luajit/Config.in                      |   10 ++++
>  package/luajit/luajit-01-root-path.patch      |   22 +++++++++
>  package/luajit/luajit-02-shared-lib.patch     |   17 +++++++
>  package/luajit/luajit-03-dont-strip.patch     |   23 ++++++++++
>  package/luajit/luajit-04-no-bin-symlink.patch |   40 ++++++++++++++++
>  package/luajit/luajit.mk                      |   61 +++++++++++++++++++++++++
>  7 files changed, 175 insertions(+), 1 deletion(-)
>  create mode 100644 package/luajit/Config.in
>  create mode 100644 package/luajit/luajit-01-root-path.patch
>  create mode 100644 package/luajit/luajit-02-shared-lib.patch
>  create mode 100644 package/luajit/luajit-03-dont-strip.patch
>  create mode 100644 package/luajit/luajit-04-no-bin-symlink.patch
>  create mode 100644 package/luajit/luajit.mk
>
Thomas Petazzoni - July 15, 2012, 6 p.m.
Le Sun, 15 Jul 2012 19:19:03 +0200,
François Perrad <francois.perrad@gadz.org> a écrit :

> -Wl,-rpath,/home/user/build/qarm/host/usr/lib" -C
> /home/user/build/qarm/build/luajit-2.0.0-beta10 amalg
> /usr/bin/make: invalid option -- '3'
> /usr/bin/make: invalid option -- '2'
> 
> so, I remove extra quote :
> ifeq ($(BR2_ARCH_IS_64),y)
> LUAJIT_HOST_CC=$(HOSTCC)
> else
> LUAJIT_HOST_CC=$(HOSTCC) -m32
> endif

Hum, yes, this part was a last-minute addition, which was wrong
apparently. But this doesn't answer my initial question: it is not
possible to build luajit for a 64 bits architecture on a 32 bits host.
If this isn't solved, we can't include luajit as is.

> and the build command could be rewrite with CROSS :
> define LUAJIT_BUILD_CMDS
> 	$(MAKE) PREFIX="/usr" \
> 		HOST_CC="$(LUAJIT_HOST_CC)" \
> 		CROSS="$(TARGET_CROSS)" \
> 		-C $(@D) amalg
> endef

No, using TARGET_CROSS directly doesn't work when ccache is enabled.
ccache is only used in TARGET_CC and TARGET_CXX, that's why I've done
this this way.

Can you look at the bitness problem?

Thanks!

Thomas
Francois Perrad - July 17, 2012, 8:07 a.m.
2012/7/15 Thomas Petazzoni <thomas.petazzoni@free-electrons.com>:
> Le Sun, 15 Jul 2012 19:19:03 +0200,
> François Perrad <francois.perrad@gadz.org> a écrit :
>
>> -Wl,-rpath,/home/user/build/qarm/host/usr/lib" -C
>> /home/user/build/qarm/build/luajit-2.0.0-beta10 amalg
>> /usr/bin/make: invalid option -- '3'
>> /usr/bin/make: invalid option -- '2'
>>
>> so, I remove extra quote :
>> ifeq ($(BR2_ARCH_IS_64),y)
>> LUAJIT_HOST_CC=$(HOSTCC)
>> else
>> LUAJIT_HOST_CC=$(HOSTCC) -m32
>> endif
>
> Hum, yes, this part was a last-minute addition, which was wrong
> apparently. But this doesn't answer my initial question: it is not
> possible to build luajit for a 64 bits architecture on a 32 bits host.
> If this isn't solved, we can't include luajit as is.
>
>> and the build command could be rewrite with CROSS :
>> define LUAJIT_BUILD_CMDS
>>       $(MAKE) PREFIX="/usr" \
>>               HOST_CC="$(LUAJIT_HOST_CC)" \
>>               CROSS="$(TARGET_CROSS)" \
>>               -C $(@D) amalg
>> endef
>
> No, using TARGET_CROSS directly doesn't work when ccache is enabled.
> ccache is only used in TARGET_CC and TARGET_CXX, that's why I've done
> this this way.
>
> Can you look at the bitness problem?

see http://www.freelists.org/post/luajit/crosscompiling-with-different-bitness

François.

>
> Thanks!
>
> Thomas
> --
> Thomas Petazzoni, Free Electrons
> Kernel, drivers, real-time and embedded Linux
> development, consulting, training and support.
> http://free-electrons.com
Thomas Petazzoni - July 17, 2012, 8:11 a.m.
Le Tue, 17 Jul 2012 10:07:21 +0200,
François Perrad <francois.perrad@gadz.org> a écrit :

> > No, using TARGET_CROSS directly doesn't work when ccache is enabled.
> > ccache is only used in TARGET_CC and TARGET_CXX, that's why I've done
> > this this way.
> >
> > Can you look at the bitness problem?
> 
> see http://www.freelists.org/post/luajit/crosscompiling-with-different-bitness

Ok, the reply is:
http://www.freelists.org/post/luajit/crosscompiling-with-different-bitness,1

Essentially the first sentence shows that Mike Pall has not seen that
we were talking about cross-compilation. It's not because you're
running under a x86 kernel that you cannot generate binaries for x86-64.

The second sentence shows that the cross-compilation support in luajit
is not really nice.

So the only solution that I see is to integrate the proposal of
Jean-Christophe Plagnol-Villard that allows to have a kconfig option
defining the host architecture, and then do some depends on magic to
only show the package when we have the right architecture combination.
Can you look into this?

Best regards,

Thomas
Francois Perrad - July 17, 2012, 10:10 a.m.
2012/7/17 Thomas Petazzoni <thomas.petazzoni@free-electrons.com>:
> Le Tue, 17 Jul 2012 10:07:21 +0200,
> François Perrad <francois.perrad@gadz.org> a écrit :
>
>> > No, using TARGET_CROSS directly doesn't work when ccache is enabled.
>> > ccache is only used in TARGET_CC and TARGET_CXX, that's why I've done
>> > this this way.
>> >
>> > Can you look at the bitness problem?
>>
>> see http://www.freelists.org/post/luajit/crosscompiling-with-different-bitness
>
> Ok, the reply is:
> http://www.freelists.org/post/luajit/crosscompiling-with-different-bitness,1
>
> Essentially the first sentence shows that Mike Pall has not seen that
> we were talking about cross-compilation. It's not because you're
> running under a x86 kernel that you cannot generate binaries for x86-64.
>
> The second sentence shows that the cross-compilation support in luajit
> is not really nice.
>
> So the only solution that I see is to integrate the proposal of
> Jean-Christophe Plagnol-Villard that allows to have a kconfig option
> defining the host architecture, and then do some depends on magic to
> only show the package when we have the right architecture combination.
> Can you look into this?
>

I applied this patch http://patchwork.ozlabs.org/patch/153235/

now, we could write :
    config BR2_PACKAGE_LUAJIT
	    bool "luajit"
	    depends on BR2_i386 || (BR2_x86_64 && BR2_HOSTARCH='x86_64') ||
BR2_powerpc || BR2_arm || BR2_armeb

François
> Best regards,
>
> Thomas
> --
> Thomas Petazzoni, Free Electrons
> Kernel, drivers, real-time and embedded Linux
> development, consulting, training and support.
> http://free-electrons.com

Patch

diff --git a/package/Config.in b/package/Config.in
index 99257b4..a117fc4 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -245,7 +245,8 @@  endmenu
 menu "Interpreter languages and scripting"
 source "package/haserl/Config.in"
 source "package/lua/Config.in"
-if BR2_PACKAGE_LUA
+source "package/luajit/Config.in"
+if BR2_PACKAGE_LUA || BR2_PACKAGE_LUAJIT
 menu "LUA libraries/modules"
 source "package/cgilua/Config.in"
 source "package/copas/Config.in"
diff --git a/package/luajit/Config.in b/package/luajit/Config.in
new file mode 100644
index 0000000..3ddd3c0
--- /dev/null
+++ b/package/luajit/Config.in
@@ -0,0 +1,10 @@ 
+config BR2_PACKAGE_LUAJIT
+	bool "luajit"
+	depends on BR2_i386 || BR2_x86_64 || BR2_powerpc || BR2_arm || BR2_armeb
+	help
+	  LuaJIT implements the full set of language features defined
+	  by Lua 5.1. The virtual machine (VM) is API- and
+	  ABI-compatible to the standard Lua interpreter and can be
+	  deployed as a drop-in replacement.
+
+	  http://luajit.org/
diff --git a/package/luajit/luajit-01-root-path.patch b/package/luajit/luajit-01-root-path.patch
new file mode 100644
index 0000000..3b0a585
--- /dev/null
+++ b/package/luajit/luajit-01-root-path.patch
@@ -0,0 +1,22 @@ 
+Adjust installation location to /usr
+
+Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+
+Index: b/src/luaconf.h
+===================================================================
+--- a/src/luaconf.h
++++ b/src/luaconf.h
+@@ -22,9 +22,9 @@
+ #define LUA_CPATH_DEFAULT \
+   ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll"
+ #else
+-#define LUA_ROOT	"/usr/local/"
+-#define LUA_LDIR	LUA_ROOT "share/lua/5.1/"
+-#define LUA_CDIR	LUA_ROOT "lib/lua/5.1/"
++#define LUA_ROOT	"/usr/"
++#define LUA_LDIR	LUA_ROOT "share/lua/"
++#define LUA_CDIR	LUA_ROOT "lib/lua/"
+ #ifdef LUA_XROOT
+ #define LUA_JDIR	LUA_XROOT "share/luajit-2.0.0-beta10/"
+ #define LUA_XPATH \
diff --git a/package/luajit/luajit-02-shared-lib.patch b/package/luajit/luajit-02-shared-lib.patch
new file mode 100644
index 0000000..d5122ba
--- /dev/null
+++ b/package/luajit/luajit-02-shared-lib.patch
@@ -0,0 +1,17 @@ 
+Compile the luajit binary dynamically against the luajit library
+
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+
+Index: b/src/Makefile
+===================================================================
+--- a/src/Makefile
++++ b/src/Makefile
+@@ -629,7 +629,7 @@
+ 
+ $(LUAJIT_T): $(TARGET_O) $(LUAJIT_O) $(TARGET_DEP)
+ 	$(E) "LINK      $@"
+-	$(Q)$(TARGET_LD) $(TARGET_ALDFLAGS) -o $@ $(LUAJIT_O) $(TARGET_O) $(TARGET_ALIBS)
++	$(Q)$(TARGET_LD) $(TARGET_ALDFLAGS) -o $@ $(LUAJIT_O) -lluajit -L. $(TARGET_ALIBS)
+ 	$(Q)$(TARGET_STRIP) $@
+ 	$(E) "OK        Successfully built LuaJIT"
+ 
diff --git a/package/luajit/luajit-03-dont-strip.patch b/package/luajit/luajit-03-dont-strip.patch
new file mode 100644
index 0000000..9651cdf
--- /dev/null
+++ b/package/luajit/luajit-03-dont-strip.patch
@@ -0,0 +1,23 @@ 
+Don't strip the library and binary
+
+This allows Buildroot to do it if needed, but only if needed.
+
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+
+Index: b/src/Makefile
+===================================================================
+--- a/src/Makefile
++++ b/src/Makefile
+@@ -625,12 +625,10 @@
+ $(LUAJIT_SO): $(LJVMCORE_O)
+ 	$(E) "DYNLINK   $@"
+ 	$(Q)$(TARGET_LD) $(TARGET_ASHLDFLAGS) -o $@ $(LJVMCORE_DYNO) $(TARGET_ALIBS)
+-	$(Q)$(TARGET_STRIP) $@
+ 
+ $(LUAJIT_T): $(TARGET_O) $(LUAJIT_O) $(TARGET_DEP)
+ 	$(E) "LINK      $@"
+ 	$(Q)$(TARGET_LD) $(TARGET_ALDFLAGS) -o $@ $(LUAJIT_O) -lluajit -L. $(TARGET_ALIBS)
+-	$(Q)$(TARGET_STRIP) $@
+ 	$(E) "OK        Successfully built LuaJIT"
+ 
+ ##############################################################################
diff --git a/package/luajit/luajit-04-no-bin-symlink.patch b/package/luajit/luajit-04-no-bin-symlink.patch
new file mode 100644
index 0000000..3eed7de
--- /dev/null
+++ b/package/luajit/luajit-04-no-bin-symlink.patch
@@ -0,0 +1,40 @@ 
+Do not use a symlink for the binary, simply name if luajit
+
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+
+Index: b/Makefile
+===================================================================
+--- a/Makefile
++++ b/Makefile
+@@ -41,8 +41,7 @@
+ INSTALL_MAN= $(INSTALL_SHARE)/man/man1
+ INSTALL_PKGCONFIG= $(INSTALL_LIB)/pkgconfig
+ 
+-INSTALL_TNAME= luajit-$(VERSION)
+-INSTALL_TSYMNAME= luajit
++INSTALL_TNAME= luajit
+ INSTALL_ANAME= libluajit-$(ABIVER).a
+ INSTALL_SONAME= libluajit-$(ABIVER).so.$(MAJVER).$(MINVER).$(RELVER)
+ INSTALL_SOSHORT= libluajit-$(ABIVER).so
+@@ -56,7 +55,6 @@
+ INSTALL_SHORT1= $(INSTALL_LIB)/$(INSTALL_SOSHORT)
+ INSTALL_SHORT2= $(INSTALL_LIB)/$(INSTALL_SOSHORT)
+ INSTALL_T= $(INSTALL_BIN)/$(INSTALL_TNAME)
+-INSTALL_TSYM= $(INSTALL_BIN)/$(INSTALL_TSYMNAME)
+ INSTALL_PC= $(INSTALL_PKGCONFIG)/$(INSTALL_PCNAME)
+ 
+ INSTALL_DIRS= $(INSTALL_BIN) $(INSTALL_LIB) $(INSTALL_INC) $(INSTALL_MAN) \
+@@ -114,13 +112,6 @@
+ 	  $(RM) $(FILE_PC).tmp
+ 	cd src && $(INSTALL_F) $(FILES_INC) $(INSTALL_INC)
+ 	cd lib && $(INSTALL_F) $(FILES_JITLIB) $(INSTALL_JITLIB)
+-	@echo "==== Successfully installed LuaJIT $(VERSION) to $(PREFIX) ===="
+-	@echo ""
+-	@echo "Note: the beta releases deliberately do NOT install a symlink for luajit"
+-	@echo "You can do this now by running this command (with sudo):"
+-	@echo ""
+-	@echo "  $(SYMLINK) $(INSTALL_TNAME) $(INSTALL_TSYM)"
+-	@echo ""
+ 
+ ##############################################################################
+ 
diff --git a/package/luajit/luajit.mk b/package/luajit/luajit.mk
new file mode 100644
index 0000000..4fcfb3d
--- /dev/null
+++ b/package/luajit/luajit.mk
@@ -0,0 +1,61 @@ 
+#############################################################
+#
+# luajit
+#
+#############################################################
+
+LUAJIT_VERSION = 2.0.0-beta10
+LUAJIT_SOURCE  = LuaJIT-$(LUAJIT_VERSION).tar.gz
+LUAJIT_SITE    = http://luajit.org/download
+
+LUAJIT_INSTALL_STAGING = YES
+
+define LUAJIT_NOLARGEFILE_FIX_MAKEFILE
+	$(SED) 's/TARGET_XCFLAGS= -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE/TARGET_XCFLAGS=/' $(@D)/src/Makefile
+endef
+
+ifneq ($(BR2_LARGEFILE),y)
+LUAJIT_POST_PATCH_HOOKS += LUAJIT_NOLARGEFILE_FIX_MAKEFILE
+endif
+
+# The luajit build procedure requires the host compiler to have the
+# same bitness as the target compiler. So when the target is a 32 bits
+# target, we pass -m32 to ensure that even on 64 bits hosts, a
+# compiler of the same bitness is used. However, this doesn't work for
+# x86 hosts targetting a x86_64 machine.
+ifeq ($(BR2_ARCH_IS_64),y)
+LUAJIT_HOST_CC="$(HOSTCC)"
+else
+LUAJIT_HOST_CC="$(HOSTCC) -m32"
+endif
+
+# We unfortunately can't use TARGET_CONFIGURE_OPTS, because the luajit
+# build system uses non conventional variable names.
+define LUAJIT_BUILD_CMDS
+	$(MAKE) PREFIX="/usr" \
+		STATIC_CC="$(TARGET_CC)" \
+		DYNAMIC_CC="$(TARGET_CC) -fPIC" \
+		TARGET_LD="$(TARGET_CC)" \
+		TARGET_AR="$(TARGET_AR) rcus" \
+		TARGET_STRIP="$(TARGET_STRIP)" \
+		CFLAGS="$(TARGET_CFLAGS)" \
+		LDFLAGS="$(TARGET_LDFLAGS)" \
+		HOST_CC="$(LUAJIT_HOST_CC)" \
+		HOST_CFLAGS="$(HOST_CFLAGS)" \
+		HOST_LDFLAGS="$(HOST_LDFLAGS)" \
+		-C $(@D) amalg
+endef
+
+define LUAJIT_INSTALL_STAGING_CMDS
+	$(MAKE) PREFIX="/usr" DESTDIR="$(STAGING_DIR)" -C $(@D) install
+endef
+
+define LUAJIT_INSTALL_TARGET_CMDS
+	$(MAKE) PREFIX="/usr" DESTDIR="$(TARGET_DIR)" -C $(@D) install
+endef
+
+define LUAJIT_CLEAN_CMDS
+	-$(MAKE) -C $(@D) clean
+endef
+
+$(eval $(call GENTARGETS))