Now that ELLCC can build itself, it’s time to do some testing of other packages. I thought tcsh (a widely used command shell for *nix) would be a good choice, because it would exercise a bunch of system calls and standard library functions on all the targets.
I created a tcsh directory under the ELLCC test/src directory and got the latest version of tcsh sources.
I made a modified build script and Makefile to do the overall configure and build because I wanted an easy way to create executables for all the targets. The build script creates a directory for each target and runs the tcsh configure program in the directory:
#!/bin/sh # ELLCC build script. # Get the staging directory. prefix=`cd ../../..; pwd` # Figure out the compilers to use. . $prefix/build-setup $* echo Configured to $WHY. echo C compiler: $cc $CFLAGS echo C++ compiler: $cxx $CXXFLAGS echo In: build$builddir if [ "x$arg1" != "x" ] ; then # Build for a single target. targets=$arg1 fi # Configure for all active targets in the target list. for t in $targets; do t=`basename $t -elf` if [ -e $prefix/libecc/mkscripts/targets/$t/setup.mk ] ; then echo Configuring for $t-$os mkdir -p build-$t-$os make DIR=build-$t-$os CC=$cc CXX=$cxx AR=$ar TARGET=$t OS=$os \ target=$t haslibs=$haslibs \ bindir=$bindir prefix=$prefix build=$build \ configure || exit 1 make -C build-$t-$os || exit 1 fi done
The build script uses a simple make file to get the proper build parameters for each target:
-include $(prefix)/libecc/mkscripts/targets/$(TARGET)/setup.mk ifneq ($(TARGET),$(build)) HOST=--host=$(TARGET)-$(OS) BUILD=--build=$(build)-$(OS) else HOST= BUILD= endif ifneq ($(CC),gcc) ifeq ($(haslibs),yes) CFLAGS=$(CFLAGS.$(TARGET)) CXXFLAGS=$(CXXFLAGS.$(TARGET)) endif endif configure: cd $(DIR) ; \ ../src/configure \ CC=$(CC) CFLAGS="$(CFLAGS)" \ CXX=$(CXX) CXXFLAGS="$(CXXFLAGS)" \ --bindir=$(bindir) --prefix=$(prefix) \ $(HOST) $(BUILD) $(TARGETS) clean: rm -fr build-*
Now building is a simple as:
[~/ellcc/test/src/tcsh] dev% ./build
This will do all the configures and makes. The file command can tell what each binary is:
[~/ellcc/test/src/tcsh] dev% file */tcsh build-armeb-linux/tcsh: ELF 32-bit MSB executable, ARM, version 1, statically linked, BuildID[sha1]=0x078219cbae606a2a0f587d2ef1ec08cb2f74507d, not stripped build-arm-linux/tcsh: ELF 32-bit LSB executable, ARM, version 1, statically linked, BuildID[sha1]=0x1e9b7097aeabe9d87bab6a6c58299d5e9ad8420b, not stripped build-i386-linux/tcsh: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, BuildID[sha1]=0xe22f2010af0036439a4291a813fe52281fc0a854, not stripped build-microblaze-linux/tcsh: ELF 32-bit MSB executable, version 1 (SYSV), statically linked, not stripped build-mipsel-linux/tcsh: ELF 32-bit LSB executable, MIPS, MIPS-I version 1, statically linked, BuildID[sha1]=0x38cea1a3ab4fbc8499d49c9db3d81fb61856694d, not stripped build-mips-linux/tcsh: ELF 32-bit MSB executable, MIPS, MIPS-I version 1, statically linked, BuildID[sha1]=0xfb15ef6c9556283827968236f14b182f23ecc1e0, not stripped build-ppc-linux/tcsh: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), statically linked, BuildID[sha1]=0x728ba20e60011cb9e4daff2961c285fa689e23aa, not stripped build-x86_64-linux/tcsh: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=0xbd05c401b4275cb101304547a070d55dd296227c, not stripped [~/ellcc/test/src/tcsh] dev%
The size command will give a comparison of the executable size of each target:
[~/ellcc/test/src/tcsh] dev% size */tcsh text data bss dec hex filename 852268 11940 84232 948440 e78d8 build-armeb-linux/tcsh 850044 11940 84232 946216 e7028 build-arm-linux/tcsh 836222 11932 83960 932114 e3912 build-i386-linux/tcsh 1211936 11944 84104 1307984 13f550 build-microblaze-linux/tcsh 963356 11984 84088 1059428 102a64 build-mipsel-linux/tcsh 963536 11984 84088 1059608 102b18 build-mips-linux/tcsh 892092 13364 84352 989808 f1a70 build-ppc-linux/tcsh 878438 15800 89840 984078 f040e build-x86_64-linux/tcsh [~/ellcc/test/src/tcsh] dev%
It is interesting that the microblaze text section is to much larger than the rest.
I’ll try to run one of the executables.
[~/ellcc/test/src/tcsh] dev% ~/ellcc/bin/qemu-ppc build-ppc-linux/tcsh [~/ellcc/test/src/tcsh] dev% echo $version tcsh 6.18.01 (Astron) 2012-02-14 (ppc-apple-linux) options wide,nls,dl,al,kan,rh,color,filec [~/ellcc/test/src/tcsh] dev%
Sure enough, it is an ppc-apple-linux build (!?!). Fun.
Dear Author, another question about making tcsh for mipsel.
I successfully compiled “hello world” proggie for my mediaplayer, now I want to ask you about explaining step by step how can I compile tcsh-6.19-00 for mipsel, please. What is interested:
1) Where should I put 1st build script? in tcsh-6.19.00 folder or where?
2) First prefix define makes strange steps when I run it:
dev@stgrace:~/tcsh-6.19.00$ cd ../../..; pwd
/
3) If prefix should be (in my case) defined for /home/dev/ellcc folder , then I do not see no build-setup shell script there, yet I do not see build-setup not in ellcc folder, not in tcsh-6.19.00 folder. Nothing.
4) What about variables $WHY, $CC, $CCFLAGS, $CXXFLAGS, and – build$builddir ?
5) Might be your scripts are _parts_ which should be injected in existing Makefile and/or configure script ?
Please reply and – Thank you in advance!:)
-Viktor
Hi Viktor,
Take a look at http://ellcc.org/?p=77308 I think it might help you.
-Rich
Rich, thanks for the answering and new post, I’ll make my reply there!