* RFC: Cross compiling Emacs with qemu-user
@ 2017-12-12 17:32 Mario Lang
2017-12-12 17:51 ` Andreas Schwab
2017-12-12 20:34 ` Stefan Monnier
0 siblings, 2 replies; 4+ messages in thread
From: Mario Lang @ 2017-12-12 17:32 UTC (permalink / raw)
To: emacs-devel
Hi.
It appears cross compilation of Emacs (tested on ARM) can be done with
the help of qemu-user. If you have binfmt support of qemu-user
installed properly, you can actually cross-compile Emacs without any
modifications at all. However, this usually requires some tinkering
with the global state on the build host, which is undesireable.
To avoid going through binfmt support, I just whipped up a very crude
patch to prefix calling of built binaries. I know this isn't ready for
inclusion, however, I'd like to post this here to solicit comments.
* In principle, would this be something Emacs would want to support?
* What would need to be done to make the patch below acceptable?
I needed to replace some of the relative executable paths since
qemu-user apparently has a problem with ./foo and ../foo alike paths.
I am using this patch in an experimental buildroot package for Emacs.
EMACS_CONF_OPTS += --with-emulator="$(QEMU_USER) -L $(TARGET_DIR)"
And voila! I get a fully working Emacs for ARM built on x86_64.
diff --git a/admin/grammars/Makefile.in b/admin/grammars/Makefile.in
index 740168fc73..43fe11eaee 100644
--- a/admin/grammars/Makefile.in
+++ b/admin/grammars/Makefile.in
@@ -45,7 +45,7 @@ am__v_at_1 =
unexport EMACSDATA EMACSDOC EMACSPATH
EMACS = ${top_builddir}/src/emacs
-emacs = EMACSLOADPATH= "${EMACS}" -batch --no-site-file --no-site-lisp
+emacs = EMACSLOADPATH= ${EMACS} -batch --no-site-file --no-site-lisp
make_bovine = ${emacs} -l semantic/bovine/grammar -f bovine-batch-make-parser
make_wisent = ${emacs} -l semantic/wisent/grammar -f wisent-batch-make-parser
diff --git a/admin/unidata/Makefile.in b/admin/unidata/Makefile.in
index c389cb3f53..66d7587a58 100644
--- a/admin/unidata/Makefile.in
+++ b/admin/unidata/Makefile.in
@@ -31,7 +31,7 @@ top_builddir =
EMACS = ${top_builddir}/src/emacs
unidir = ${top_srcdir}/lisp/international
-emacs = "${EMACS}" -batch --no-site-file --no-site-lisp
+emacs = ${EMACS} -batch --no-site-file --no-site-lisp
lparen = (
unifiles = $(addprefix ${unidir}/,$(sort $(shell sed -n 's/^[ \t][ \t]*${lparen}"\(uni-[^"]*\)"$$/\1/p' ${srcdir}/unidata-gen.el)))
diff --git a/configure.ac b/configure.ac
index 562b19afe6..df2fc99836 100644
--- a/configure.ac
+++ b/configure.ac
@@ -298,6 +298,11 @@ AC_DEFUN
[string giving default POP mail host])],
AC_DEFINE_UNQUOTED(MAILHOST, ["$withval"], [String giving fallback POP mail host.]))
+AC_ARG_WITH([emulator],[AS_HELP_STRING([--with-emulator=EMULATOR],
+ [Emulator to use when executing target binaries])],
+ EMULATOR="$withval"
+ AC_SUBST(EMULATOR))
+
AC_ARG_WITH([sound],[AS_HELP_STRING([--with-sound=VALUE],
[compile with sound support (VALUE one of: yes, alsa, oss, bsd-ossaudio, no;
default yes). Only for GNU/Linux, FreeBSD, NetBSD, MinGW, Cygwin.])],
diff --git a/leim/Makefile.in b/leim/Makefile.in
index f18010af60..af55e3fc4b 100644
--- a/leim/Makefile.in
+++ b/leim/Makefile.in
@@ -53,7 +53,7 @@ EMACS =
# How to run Emacs.
# Prevent any setting of EMACSLOADPATH in user environment causing problems.
-RUN_EMACS = EMACSLOADPATH= '$(EMACS)' -batch --no-site-file --no-site-lisp
+RUN_EMACS = EMACSLOADPATH= $(EMACS) -batch --no-site-file --no-site-lisp
MKDIR_P = @MKDIR_P@
diff --git a/lisp/Makefile.in b/lisp/Makefile.in
index de3dc18617..884417d3c1 100644
--- a/lisp/Makefile.in
+++ b/lisp/Makefile.in
@@ -56,7 +56,7 @@ FIND_DELETE =
# We never change directory before running Emacs, so a relative file
# name is fine, and makes life easier. If we need to change
# directory, we can use emacs --chdir.
-EMACS = ../src/emacs${EXEEXT}
+EMACS = @EMULATOR@ $(CURDIR)/../src/emacs${EXEEXT}
# Command line flags for Emacs.
@@ -106,7 +106,7 @@ COMPILE_FIRST =
# The actual Emacs command run in the targets below.
# Prevent any setting of EMACSLOADPATH in user environment causing problems.
-emacs = EMACSLOADPATH= '$(EMACS)' $(EMACSOPT)
+emacs = EMACSLOADPATH= $(EMACS) $(EMACSOPT)
## Subdirectories, relative to builddir.
SUBDIRS = $(sort $(shell find ${srcdir} -type d -print))
diff --git a/src/Makefile.in b/src/Makefile.in
index b395627893..d397dc4080 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -54,7 +54,7 @@ lwlibdir =
# Configuration files for .o files to depend on.
config_h = config.h $(srcdir)/conf_post.h
-bootstrap_exe = ../src/bootstrap-emacs$(EXEEXT)
+bootstrap_exe = $(CURDIR)/bootstrap-emacs$(EXEEXT)
## ns-app if HAVE_NS, else empty.
OTHER_FILES = @OTHER_FILES@
@@ -320,7 +320,9 @@ INTERVALS_H =
GETLOADAVG_LIBS = @GETLOADAVG_LIBS@
-RUN_TEMACS = ./temacs
+RUN_TEMACS = temacs
+
+EMULATOR = @EMULATOR@
# Whether builds should contain details. '--no-build-details' or empty.
BUILD_DETAILS = @BUILD_DETAILS@
@@ -506,7 +508,7 @@ LIBES =
## in practice this rule was always run anyway.
$(srcdir)/macuvs.h $(lispsource)/international/charprop.el: \
bootstrap-emacs$(EXEEXT) FORCE
- $(MAKE) -C ../admin/unidata all EMACS="../$(bootstrap_exe)"
+ $(MAKE) -C ../admin/unidata all EMACS="$(EMULATOR) $(bootstrap_exe)"
## We require charprop.el to exist before ucs-normalize.el is
## byte-compiled, because ucs-normalize.el needs to load 2 uni-*.el files.
@@ -539,7 +541,7 @@ emacs$(EXEEXT):
ifeq ($(CANNOT_DUMP),yes)
ln -f temacs$(EXEEXT) $@
else
- LC_ALL=C $(RUN_TEMACS) -batch $(BUILD_DETAILS) -l loadup dump
+ LC_ALL=C $(EMULATOR) $(RUN_TEMACS) -batch $(BUILD_DETAILS) -l loadup dump
ifneq ($(PAXCTL_dumped),)
$(PAXCTL_dumped) $@
endif
@@ -560,9 +562,9 @@ emacs$(EXEEXT):
$(etc)/DOC: lisp.mk $(libsrc)/make-docfile$(EXEEXT) $(obj) $(lisp)
$(AM_V_GEN)$(MKDIR_P) $(etc)
-$(AM_V_at)rm -f $(etc)/DOC
- $(AM_V_at)$(libsrc)/make-docfile -d $(srcdir) \
+ $(AM_V_at)$(EMULATOR) $(libsrc)/make-docfile -d $(srcdir) \
$(SOME_MACHINE_OBJECTS) $(obj) > $(etc)/DOC
- $(AM_V_at)$(libsrc)/make-docfile -a $(etc)/DOC -d $(lispsource) \
+ $(AM_V_at)$(EMULATOR) $(libsrc)/make-docfile -a $(etc)/DOC -d $(lispsource) \
$(shortlisp)
$(libsrc)/make-docfile$(EXEEXT): $(lib)/libgnu.a
@@ -583,7 +585,7 @@ am__v_GLOBALS_0 =
am__v_GLOBALS_1 =
gl-stamp: $(libsrc)/make-docfile$(EXEEXT) $(GLOBAL_SOURCES)
- $(AM_V_GLOBALS)$(libsrc)/make-docfile -d $(srcdir) -g $(obj) > globals.tmp
+ $(AM_V_GLOBALS)$(EMULATOR) $(libsrc)/make-docfile -d $(srcdir) -g $(obj) > globals.tmp
$(AM_V_at)$(top_srcdir)/build-aux/move-if-change globals.tmp globals.h
$(AM_V_at)echo timestamp > $@
@@ -726,7 +728,7 @@ .PHONY:
## bootstrap-emacs$(EXEEXT) as an order-only prerequisite.
%.elc: %.el | bootstrap-emacs$(EXEEXT)
- @$(MAKE) -C ../lisp EMACS="$(bootstrap_exe)" THEFILE=$< $<c
+ @$(MAKE) -C ../lisp EMACS="$(EMULATOR) $(bootstrap_exe)" THEFILE=$< $<c
## VCSWITNESS points to the file that holds info about the current checkout.
## We use it as a heuristic to decide when to rebuild loaddefs.el.
@@ -734,7 +736,7 @@ .PHONY:
VCSWITNESS =
$(lispsource)/loaddefs.el: $(VCSWITNESS) | bootstrap-emacs$(EXEEXT)
- $(MAKE) -C ../lisp autoloads EMACS="$(bootstrap_exe)"
+ $(MAKE) -C ../lisp autoloads EMACS="$(EMULATOR) $(bootstrap_exe)"
## Dump an Emacs executable named bootstrap-emacs containing the
## files from loadup.el in source form.
@@ -743,11 +745,11 @@ bootstrap-emacs$(EXEEXT):
ifeq ($(CANNOT_DUMP),yes)
ln -f temacs$(EXEEXT) $@
else
- $(RUN_TEMACS) --batch $(BUILD_DETAILS) --load loadup bootstrap
+ $(EMULATOR) $(RUN_TEMACS) --batch $(BUILD_DETAILS) --load loadup bootstrap
ifneq ($(PAXCTL_dumped),)
$(PAXCTL_dumped) emacs$(EXEEXT)
endif
mv -f emacs$(EXEEXT) $@
endif
@: Compile some files earlier to speed up further compilation.
- $(MAKE) -C ../lisp compile-first EMACS="$(bootstrap_exe)"
+ $(MAKE) -C ../lisp compile-first EMACS="$(EMULATOR) $(bootstrap_exe)"
--
CYa,
⡍⠁⠗⠊⠕
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: RFC: Cross compiling Emacs with qemu-user
2017-12-12 17:32 RFC: Cross compiling Emacs with qemu-user Mario Lang
@ 2017-12-12 17:51 ` Andreas Schwab
2017-12-12 20:34 ` Stefan Monnier
1 sibling, 0 replies; 4+ messages in thread
From: Andreas Schwab @ 2017-12-12 17:51 UTC (permalink / raw)
To: Mario Lang; +Cc: emacs-devel
On Dez 12 2017, Mario Lang <mlang@delysid.org> wrote:
> @@ -320,7 +320,9 @@ INTERVALS_H =
>
> GETLOADAVG_LIBS = @GETLOADAVG_LIBS@
>
> -RUN_TEMACS = ./temacs
> +RUN_TEMACS = temacs
> +
> +EMULATOR = @EMULATOR@
>
> # Whether builds should contain details. '--no-build-details' or empty.
> BUILD_DETAILS = @BUILD_DETAILS@
> @@ -743,11 +745,11 @@ bootstrap-emacs$(EXEEXT):
> ifeq ($(CANNOT_DUMP),yes)
> ln -f temacs$(EXEEXT) $@
> else
> - $(RUN_TEMACS) --batch $(BUILD_DETAILS) --load loadup bootstrap
> + $(EMULATOR) $(RUN_TEMACS) --batch $(BUILD_DETAILS) --load loadup bootstrap
That cannot work, when $(EMULATOR) is empty temacs can no longer be
found.
Andreas.
--
Andreas Schwab, SUSE Labs, schwab@suse.de
GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7
"And now for something completely different."
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: RFC: Cross compiling Emacs with qemu-user
2017-12-12 17:32 RFC: Cross compiling Emacs with qemu-user Mario Lang
2017-12-12 17:51 ` Andreas Schwab
@ 2017-12-12 20:34 ` Stefan Monnier
2017-12-12 21:03 ` Mario Lang
1 sibling, 1 reply; 4+ messages in thread
From: Stefan Monnier @ 2017-12-12 20:34 UTC (permalink / raw)
To: emacs-devel
> * In principle, would this be something Emacs would want to support?
I';ll let Eli and John chime in, but I don't see any reason why not.
> * What would need to be done to make the patch below acceptable?
Good question. Some comments below.
> EMACS = ${top_builddir}/src/emacs
> -emacs = EMACSLOADPATH= "${EMACS}" -batch --no-site-file --no-site-lisp
> +emacs = EMACSLOADPATH= ${EMACS} -batch --no-site-file --no-site-lisp
I'm not sure if Emacs can be built currently in a directory whose full
name includes spaces, but it's something that *should* work. The above
would break it AFAICT, so we need some other solution.
> +AC_ARG_WITH([emulator],[AS_HELP_STRING([--with-emulator=EMULATOR],
> + [Emulator to use when executing target binaries])],
> + EMULATOR="$withval"
> + AC_SUBST(EMULATOR))
It'd be good to make the doc slightly more precise (i.e. clarify that
it specifies an actual *command* rather than just which kind of
emulator we want to use).
> -RUN_TEMACS = ./temacs
> +RUN_TEMACS = temacs
Why did you need to get rid of the "./"? It's needed to tell the shell
not to search through $PATH but in the cwd instead.
> - $(MAKE) -C ../admin/unidata all EMACS="../$(bootstrap_exe)"
> + $(MAKE) -C ../admin/unidata all EMACS="$(EMULATOR) $(bootstrap_exe)"
Hmm... how will $(EMULATOR) know to look in ../ ?
Stefan
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: RFC: Cross compiling Emacs with qemu-user
2017-12-12 20:34 ` Stefan Monnier
@ 2017-12-12 21:03 ` Mario Lang
0 siblings, 0 replies; 4+ messages in thread
From: Mario Lang @ 2017-12-12 21:03 UTC (permalink / raw)
To: emacs-devel
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> EMACS = ${top_builddir}/src/emacs
>> -emacs = EMACSLOADPATH= "${EMACS}" -batch --no-site-file --no-site-lisp
>> +emacs = EMACSLOADPATH= ${EMACS} -batch --no-site-file --no-site-lisp
>
> I'm not sure if Emacs can be built currently in a directory whose full
> name includes spaces, but it's something that *should* work. The above
> would break it AFAICT, so we need some other solution.
Yeah, I am unhappy with this as well. It just was the easiest way to
get what I needed.
>> +AC_ARG_WITH([emulator],[AS_HELP_STRING([--with-emulator=EMULATOR],
>> + [Emulator to use when executing target binaries])],
>> + EMULATOR="$withval"
>> + AC_SUBST(EMULATOR))
>
> It'd be good to make the doc slightly more precise (i.e. clarify that
> it specifies an actual *command* rather than just which kind of
> emulator we want to use).
Sure.
>> -RUN_TEMACS = ./temacs
>> +RUN_TEMACS = temacs
>
> Why did you need to get rid of the "./"? It's needed to tell the shell
> not to search through $PATH but in the cwd instead.
As mentioned in my original mail, qemu-user seems to have issues with
executable paths starting with ./ and ../. In particular, in these
cases, it doesn't find the elf loader for some reason. Specifying a
relative path without leading ./ works. I have not investigated further
so far.
>> - $(MAKE) -C ../admin/unidata all EMACS="../$(bootstrap_exe)"
>> + $(MAKE) -C ../admin/unidata all EMACS="$(EMULATOR) $(bootstrap_exe)"
>
> Hmm... how will $(EMULATOR) know to look in ../ ?
bootstrap_exe has been modified to use $(CURDIR) a little further up...
--
CYa,
⡍⠁⠗⠊⠕
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-12-12 21:03 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-12-12 17:32 RFC: Cross compiling Emacs with qemu-user Mario Lang
2017-12-12 17:51 ` Andreas Schwab
2017-12-12 20:34 ` Stefan Monnier
2017-12-12 21:03 ` Mario Lang
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).