Hi All,
I recently cross-compiled Mosquitto 1.3 for an embedded ARM/Linux
board, and although it wasn't too difficult, it did require a
modification to the Makfiles to do an "install," and it might be
nice to update the build files to make the process easier.
Cross-compiling the binaries was easy. It just required setting all
of the variables for the build tools. Assuming a cross-compiler
prefix of "arm-linux-" I did this:
$ make CC=arm-linux-gcc CXX=arm-linux-g++ \
AR=arm-linux-ar LD=arm-linux-ld
That worked great. Then I tried to install the binaries to a staging
directory, but the build uses the install "-s" switch to strip the
binaries of debug symbols. This is the desired behavior, but, by
default, it uses the native (x86) strip program. We need the one
from the cross compiler. So I did a global search/replace in all the
Makefiles of "$(INSTALL) -s" with:
$(INSTALL) -s --strip-program=$(STRIP)
And then I did the install with:
$ make STRIP=arm-linux-strip DESTDIR=$PWD/_install
install
And that put all the cross-compiled binaries into ./_install, which
I then copied onto the board.
So anyway, I was thinking that it might be kind of nice to have a
"CROSS_COMPILE" variable in the config.mk to automate this. Perhaps,
like with the Linux kernel, just set this to the GCC prefix, and
have the tool variables set automatically. Maybe it can be added
this to config.mk like:
# Uncomment to cross-compile the broker.
# Set to the proper compiler prefix for the target board.
#CROSS_COMPILE:=arm-linux-
That could then be used to set the variables:
CC=$(CROSS_COMPILE)gcc
CXX=$(CROSS_COMPILE)g++
AR=$(CROSS_COMPILE)ar
LD=$(CROSS_COMPILE)ld
STRIP-$(CROSS_COMPILE)strip
And then, maybe to prevent someone from accidentally installing
cross-compiled binaries onto their host, also update the DESTDIR to
something local, perhaps using the compiler prefix to come up with a
staging directory name:
ifdef CROSS_COMPILE
DESTDIR ?= $(PWD)/$(CROSS_COMPILE)build
endif
Thanks,
Frank
|