This is the mail archive of the crossgcc@sourceware.org mailing list for the crossgcc project.

See the CrossGCC FAQ for lots more information.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Announcing Crossplex: make macros for building cross compiler toolchains and embedded systems


Greetings toolchain fans,

I want to let you know about a toolchain builder that I've been
working on for some time that has finally reached a level where it
might be useful to embedded developers. You can get it here:
http://crossplex.org

I started writing Crossplex because I wanted the functionality of
crosstool and buildroot in the form of make macros that I could embed
in existing makefiles. Since I work on many different architectures
and those architectures share many of the same sources, I wanted a
system that would separate the process of building from the data of
configuration, and I wanted to do so in such a way that parallel make
could take full advantage of the dependency graph.

For example, let's say I have an application "hello-world" that will
get delivered four differnt ways: two different software
configurations ("release" and "devel") on two different hardware
architectures ("x86" and "mipsel"). The Crossplex macros allow me to
completely specify all of these configurations in a SINGLE makefile
using make macros that look something like this:

########################################################
# -*- makefile -*-

# Toolchain versions
DAVES_TOOLCHAIN_VERSIONS := binutils-2.20
DAVES_TOOLCHAIN_VERSIONS += gcc-4.2.0
DAVES_TOOLCHAIN_VERSIONS += glibc-2.5
DAVES_TOOLCHAIN_VERSIONS += linux-2.6.28.7
DAVES_TOOLCHAIN_VERSIONS += gdb-6.8

# Specify the mipsel toolchain
$(eval $(call Glibc_Toolchain,/build_top,mipsel-glibc,mipsel-lt-linux-gnu,\
              $(DAVES_TOOLCHAIN_VERSIONS),PATH,THREAD=linuxthreads,davixtc))

# Specify the x86 toolchain
$(eval $(call Glibc_Toolchain,/build_top,x86-glibc,i686-nptl-linux-gnu,\
              $(DAVES_TOOLCHAIN_VERSIONS),PATH,THREAD=nptl,davixtc))

# Specify the root filesystem for each product.
# The toolchain is associated with the filesystem.
$(eval
$(call Configure_TargetFS,mymips/rel,/build_top,x86-glibc/toolchain PATH)
$(call Configure_TargetFS,mymips/dev,/build_top,x86-glibc/toolchain PATH)
$(call Configure_TargetFS,myx86/rel,/build_top,mipsel-glibc/toolchain PATH)
$(call Configure_TargetFS,myx86/dev,/build_top,mipsel-glibc/toolchain PATH)
)

# Specify the installation of some text files like /init /etc/passwd
# and /etc/network/interfaces.  They're found in subdirs of fs-template/
$(eval
$(call TargetFS_Template,mymips/rel,$(shell pwd)/fs-template/mipsbase)
$(call TargetFS_Template,mymips/dev,$(shell pwd)/fs-template/mipsbase)
$(call TargetFS_Template,mymips/dev,$(shell pwd)/fs-template/mipsdev)
$(call TargetFS_Template,myx86/rel,$(shell pwd)/fs-template/x86base)
$(call TargetFS_Template,myx86/dev,$(shell pwd)/fs-template/x86base)
$(call TargetFS_Template,myx86/dev,$(shell pwd)/fs-template/x86dev)
)

# Install busybox with a "basic" profile on each target
# Each will get built with the toolchain appropriate to the install target
# If intermediate build files share the same configuration and toolchain,
# they will only be built once
$(eval
$(call TargetFS_Install_Make,mymips/rel,busybox-1.4.0,REL,BASIC SH)
$(call TargetFS_Install_Make,mymips/dev,busybox-1.4.0,REL,BASIC SH)
$(call TargetFS_Install_Make,myx86/rel,busybox-1.4.0,REL,BASIC SH)
$(call TargetFS_Install_Make,myx86/dev,busybox-1.4.0,REL,BASIC SH)
)

# Specify the build and installation of the in-house program
# "hello-world" from the directory "hellodir".
$(eval
$(call TargetFS_Install_Local_Program,mymips/rel,hellodir,hello-world)
$(call TargetFS_Install_Local_Program,mymips/dev,hellodir,hello-world)
$(call TargetFS_Install_Local_Program,mymips/rel,hellodir,hello-world)
$(call TargetFS_Install_Local_Program,mymips/dev,hellodir,hello-world)
)

# Specify a kernel for each product
THIS_LINUX := linux-2.6.28.7
$(eval
$(call Build_Linux_Kernel,mymips/linux,$(THIS_LINUX),/build_top,,,\
        mipsel-glibc/toolchain PATH)
$(call Build_Linux_Kernel,mymips/linux-dev,$(THIS_LINUX),/build_top,,,\
        mipsel-glibc/toolchain PATH)
$(call Build_Linux_Kernel,myx86/linux,$(THIS_LINUX),/build_top,,,\
        x86-glibc/toolchain PATH)
$(call Build_Linux_Kernel,myx86/linux-dev,$(THIS_LINUX),/build_top,,,\
        x86-glibc/toolchain PATH)
)

########################################################

Then everything can be built and installed with a single "make -j10".
Crossplex defines variables containing all the installed software
paths so that you can specify individual targets and use those targets
as dependencies for other actions in the file, such as archiving,
serving via NFS, or kitting up for delivery.

Crossplex has a lot of power that I haven't even touched on in this
email, but it also has a long way to grow before it is compatible with
every architecture or set of library, kernel, and appliacation
versions. I have some rudmentary documentation in place on the
website, and I'm working on improving that documentation.

I'm hoping to get some developers to try it out in its current state,
and find out what people like and what they think needs improvement.

Dave

--
For unsubscribe information see http://sourceware.org/lists.html#faq


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]