I have been attempting and failing to build Kos for some time now (about 2 weeks) and I have hit a wall. My apologies for maybe traversing areas already explored but I tried to find the answer on my own and could not.
Please allow me to explain what I have done so far.
First I am using Kos 2.0 (and ports) I downloaded from here if that helps
I started with this post by PH3NOM which got me pretty far in the chain. I followed the instructions, with the addition of adding the --disable-werror flag to the dc-chain makefile as described here. I also had to disable Avast DeepScan as it was running every script in a sandbox (you have no idea how annoying that was).
Problem was this still didn't work! I had to do some more searching and found a Makefile for the dc-chain here that worked (I think... it completed!). The complete Makefile below, with some minor alterations (such as using the default versions of GCC, BinUtils, Newlib the scripts download for you, adding the above flag, only running one worker thread).
All well and good. I go to run the environ.sh script in the kos base dir and ran the top level makefile, only altering the location of my $KOS_BASE to match my installation. I seemed to encounter this issue, least according to the log below. I confirmed I do not have an sh-elf-g++.exe anywhere on my computer, which it is complaining about.
I took BlueCrabs advice and blew away the kos base dir and the opt/toolchains/dc folder in case there were any leftover artifacts from a bad build and encountered the same error using a clean set of sources. I seen reference to conflicting GCC versions which may be my issue (I hope) yet I am too green of a developer to know how to resolve this myself.
Thankfully I kept all the dc-chain logs in addition to saving the logs of the kos base make operation, so feel free to ask for them if required.
I appreciate the documentation on this forum as it has been very helpful to do this on my own. I just wish I could complete the process. It'd be awesome to be able to actually compile some code to push to my DC sometime soon!
kos base make log
Code: Select all
Maple@LAPTOP-4R4BAJ2G ~/dc/kos
$ make
for i in utils libk++ kernel addons ; do make -C $i || exit -1; done
make[1]: Entering directory '/home/Maple/dc/kos/utils'
for i in genromfs wav2adpcm vqenc gba-crcfix; do make -C $i; done
make[2]: Entering directory '/home/Maple/dc/kos/utils/genromfs'
cc -O2 -Wall -c -o genromfs.o genromfs.c
cc genromfs.o -o genromfs
make[2]: Leaving directory '/home/Maple/dc/kos/utils/genromfs'
make[2]: Entering directory '/home/Maple/dc/kos/utils/wav2adpcm'
cc -O2 -Wall wav2adpcm.c -o wav2adpcm
make[2]: Leaving directory '/home/Maple/dc/kos/utils/wav2adpcm'
make[2]: Entering directory '/home/Maple/dc/kos/utils/vqenc'
cc -O2 -Wall -DINLINE=inline -c -o vqenc.o vqenc.c
cc -O2 -Wall -DINLINE=inline -c -o get_image.o get_image.c
cc -O2 -Wall -DINLINE=inline -c -o get_image_jpg.o get_image_jpg.c
cc -O2 -Wall -DINLINE=inline -c -o get_image_png.o get_image_png.c
cc -O2 -Wall -DINLINE=inline -c -o readpng.o readpng.c
cc -o vqenc vqenc.o get_image.o get_image_jpg.o get_image_png.o readpng.o -lpng -ljpeg -lz -lm
make[2]: Leaving directory '/home/Maple/dc/kos/utils/vqenc'
make[2]: Entering directory '/home/Maple/dc/kos/utils/gba-crcfix'
cc -O2 -Wall -DINLINE=inline -c -o gba-crcfix.o gba-crcfix.c
cc gba-crcfix.o -o gba-crcfix
make[2]: Leaving directory '/home/Maple/dc/kos/utils/gba-crcfix'
make[1]: Leaving directory '/home/Maple/dc/kos/utils'
make[1]: Entering directory '/home/Maple/dc/kos/libk++'
kos-c++ -c mem.cc -o mem.o
/home/Maple/dc/kos/utils/gnu_wrappers/kos-cc: line 50: /opt/toolchains/dc/sh-elf/bin/sh-elf-g++: No such file or directory
make[1]: *** [/home/Maple/dc/kos/Makefile.rules:14: mem.o] Error 127
make[1]: Leaving directory '/home/Maple/dc/kos/libk++'
make: *** [Makefile:23: all] Error 255
Code: Select all
#!/bin/bash
# Dreamcast toolchain makefile by Jim Ursetto
# adapted from Stalin's build script version 0.3
#
# Interesting parameters:
# erase=0|1 Erase build directories on the fly to save space
# thread_model=posix|single|kos Set gcc threading model
# verbose=0|1 Display
# makejobs=-jn Set the number of jobs for calls to make to n
#
# Interesting targets (you can 'make' any of these):
# all: patch build
# patch: patch-gcc patch-newlib patch-kos
# build: build-sh4 build-arm
# build-sh4: build-sh4-binutils build-sh4-gcc
# build-arm: build-arm-binutils build-arm-gcc
# build-sh4-gcc: build-sh4-gcc-pass1 build-sh4-newlib build-sh4-gcc-pass2
# build-arm-gcc: build-arm-gcc-pass1
# build-sh4-newlib: build-sh4-newlib-only fixup-sh4-newlib
# gdb
# insight
# User configuration
sh_target=sh-elf
arm_target=arm-eabi
sh_prefix := /opt/toolchains/dc/$(sh_target)
arm_prefix := /opt/toolchains/dc/$(arm_target)
# kos_root: KOS Git root (contains kos/ and kos-ports/)
kos_root=$(CURDIR)/../../..
# kos_base: equivalent of KOS_BASE (contains include/ and kernel/)
kos_base=$(CURDIR)/../..
binutils_ver=2.23.2
gcc_ver=4.7.3
newlib_ver=2.0.0
gdb_ver=6.7.1
insight_ver=6.7.1
# With GCC 4.x versions, the patches provide a kos thread model, so you should
# use it. With 3.4.6, you probably want posix here. If you really don't want
# threading support for C++ (or Objective C/Objective C++), you can set this to
# single (why you would is beyond me, though).
thread_model=kos
erase=1
verbose=1
# Set this value to -jn where n is the number of jobs you want to run with make.
# If you only want one job, just set this to nothing (i.e, "makejobs=").
# Tracking down problems with multiple make jobs is much more difficult than
# with just one running at a time. So, if you run into trouble, then you should
# clear this variable and try again with just one job running.
makejobs=
# Set the languages to build for pass 2 of building gcc for sh-elf. The default
# here is to build C, C++, Objective C, and Objective C++. You may want to take
# out the latter two if you're not worried about them and/or you're short on
# hard drive space.
#pass2_languages=c,c++,objc,obj-c++
pass2_languages=c,c++
# Change this if you don't have Bash installed in /bin
SHELL = /bin/bash
# Makefile variables
install=$(prefix)/bin
pwd := $(shell pwd)
patches := $(pwd)/patches
logdir := $(pwd)/logs
PATH := $(sh_prefix)/bin:$(arm_prefix)/bin:$(PATH)
binutils_dir=binutils-$(binutils_ver)
gcc_dir=gcc-$(gcc_ver)
newlib_dir=newlib-$(newlib_ver)
all: patch build
# ---- patch {{{
binutils_patches := $(wildcard $(patches)/binutils-$(binutils_ver)*.diff)
gcc_patches := $(wildcard $(patches)/gcc-$(gcc_ver)*.diff)
newlib_patches := $(wildcard $(patches)/newlib-$(newlib_ver)*.diff)
kos_patches := $(wildcard $(patches)/kos-*.diff)
patch_targets=patch-binutils patch-gcc patch-newlib patch-kos
patch: $(patch_targets)
patch-binutils: $(binutils_patches)
patch-gcc: $(gcc_patches)
patch-newlib: $(newlib_patches)
patch-kos: $(kos_patches)
$(newlib_patches):
cd $(newlib_dir); patch -p1 < $@
$(binutils_patches):
cd $(binutils_dir); patch -p1 < $@
$(gcc_patches):
cd $(gcc_dir); patch -p1 < $@
$(kos_patches):
cd $(kos_root); patch -p1 < $@
# ---- }}}
# ---- build {{{
build: build-sh4 build-arm
build-sh4: build-sh4-binutils build-sh4-gcc
build-arm: build-arm-binutils build-arm-gcc build-arm-libgcc
build-sh4-gcc: build-sh4-gcc-pass1 build-sh4-newlib build-sh4-gcc-pass2
build-arm-gcc: build-arm-gcc-pass1
$(clean_arm_hack)
build-sh4-newlib: build-sh4-newlib-only fixup-sh4-newlib
# Ensure that, no matter where we enter, prefix and target are set correctly.
build_sh4_targets=build-sh4-binutils build-sh4-gcc build-sh4-gcc-pass1 build-sh4-newlib build-sh4-newlib-only build-sh4-gcc-pass2
build_arm_targets=build-arm-binutils build-arm-gcc build-arm-gcc-pass1 build-arm-libgcc
$(build_sh4_targets): prefix = $(sh_prefix)
$(build_sh4_targets): target = $(sh_target)
$(build_sh4_targets): thread_model = kos
$(build_sh4_targets): extra_configure_args = --disable-libssp --disable-tls --disable-nls --with-multilib-list=m4-single-only,m4-nofpu,m4 --with-endian=little --with-cpu=m4-single-only
$(build_arm_targets): prefix = $(arm_prefix)
$(build_arm_targets): target = $(arm_target)
$(build_arm_targets): thread_model = posix
$(build_arm_targets): extra_configure_args = --with-arch=armv4
# To avoid code repetition, we use the same commands for both
# architectures. But we can't create a single target called
# build-binutils for both sh4 and arm, because phony targets
# can't be run multiple times. So we create multiple targets.
build_binutils = build-sh4-binutils build-arm-binutils
build_gcc_pass1 = build-sh4-gcc-pass1 build-arm-gcc-pass1
build_newlib = build-sh4-newlib-only
build_gcc_pass2 = build-sh4-gcc-pass2
build_arm_libgcc = build-arm-libgcc
# Here we use the essentially same code for multiple targets,
# differing only by the current state of the variables below.
$(build_binutils): build = build-binutils-$(target)-$(binutils_ver)
$(build_binutils): src_dir = binutils-$(binutils_ver)
$(build_binutils): log = $(logdir)/$(build).log
$(build_binutils): logdir
@echo "+++ Building $(src_dir) to $(build)..."
-mkdir -p $(build)
> $(log)
cd $(build); ../$(src_dir)/configure --target=$(target) --prefix=$(prefix) --disable-werror $(to_log)
make -C $(build) all install DESTDIR=$(DESTDIR) $(to_log)
make -C $(build)/bfd install DESTDIR=$(DESTDIR) $(to_log)
$(clean_up)
$(build_arm_libgcc): build = build-arm-libgcc
$(build_arm_libgcc): src_dir = gcc-$(gcc_ver)
$(build_arm_libgcc): log = $(logdir)/$(build).log
$(build_arm_libgcc): logdir
@echo "+++ Building $(src_dir) to $(build)..."
-mkdir -p $(build)
> $(log)
cd $(build); ../$(src_dir)/configure --target=$(target) --prefix=$(prefix) --disable-werror --without-headers \
--with-newlib --enable-languages=c $(extra_configure_args) $(to_log)
make -C $(build) all-target-libgcc install-target-libgcc DESTDIR=$(DESTDIR) $(to_log)
$(build_gcc_pass1) $(build_gcc_pass2): build = build-gcc-$(target)-$(gcc_ver)
$(build_gcc_pass1) $(build_gcc_pass2): src_dir = gcc-$(gcc_ver)
$(build_gcc_pass1): log = $(logdir)/$(build)-pass1.log
$(build_gcc_pass1): logdir
@echo "+++ Building $(src_dir) to $(build) (pass 1)..."
-mkdir -p $(build)
> $(log)
cd $(build); ../$(src_dir)/configure --target=$(target) --prefix=$(prefix) --disable-werror --without-headers \
--with-newlib --enable-languages=c $(extra_configure_args) $(to_log)
make -C $(build) all-gcc install-gcc DESTDIR=$(DESTDIR) $(to_log)
$(build_newlib): build = build-newlib-$(target)-$(newlib_ver)
$(build_newlib): src_dir = newlib-$(newlib_ver)
$(build_newlib): log = $(logdir)/$(build).log
$(build_newlib): logdir
@echo "+++ Building $(src_dir) to $(build)..."
-mkdir -p $(build)
> $(log)
cd $(build); ../$(src_dir)/configure --target=$(target) --prefix=$(prefix) --disable-werror $(to_log)
make -C $(build) all install CC_FOR_TARGET=$(install)/$(target)-gcc AS_FOR_TARGET=$(install)/$(target)-as \
LD_FOR_TARGET=$(install)/$(target)-ld AR_FOR_TARGET=$(install)/$(target)-ar \
RANLIB_FOR_TARGET=$(install)/$(target)-ranlib DESTDIR=$(DESTDIR) $(to_log)
$(clean_up)
fixup-sh4-newlib: newlib_inc=$(DESTDIR)$(sh_prefix)/$(sh_target)/include
fixup-sh4-newlib:
@echo "+++ Fixing up sh4 newlib includes..."
# KOS pthread.h is modified
# to define _POSIX_THREADS
# pthreads to kthreads mapping
# so KOS includes are available as kos/file.h
# kos/thread.h requires arch/arch.h
# arch/arch.h requires dc/video.h
cp $(kos_base)/include/pthread.h $(newlib_inc)
cp $(kos_base)/include/sys/_pthread.h $(newlib_inc)/sys
cp $(kos_base)/include/sys/sched.h $(newlib_inc)/sys
ln -nsf $(kos_base)/include/kos $(newlib_inc)
ln -nsf $(kos_base)/kernel/arch/dreamcast/include/arch $(newlib_inc)
ln -nsf $(kos_base)/kernel/arch/dreamcast/include/dc $(newlib_inc)
$(build_gcc_pass2): log = $(logdir)/$(build)-pass2.log
$(build_gcc_pass2): logdir
@echo "+++ Building $(src_dir) to $(build) (pass 2)..."
-mkdir -p $(build)
> $(log)
cd $(build); ../$(src_dir)/configure --target=$(target) --prefix=$(prefix) --disable-werror --with-newlib \
--enable-threads=$(thread_model) --enable-languages=c,c++,objc,obj-c++ $(extra_configure_args) $(to_log)
make -C $(build) all install DESTDIR=$(DESTDIR) $(to_log)
$(clean_up)
# ---- }}}}
# GDB building
gdb-$(gdb_ver).tar.bz2:
@echo "+++ Downloading GDB..."
wget -c ftp://ftp.gnu.org/gnu/gdb/gdb-$(gdb_ver).tar.bz2
unpack_gdb: gdb-$(gdb_ver).tar.bz2 unpack_gdb_stamp
unpack_gdb_stamp:
@echo "+++ Unpacking GDB..."
rm -f $@
rm -rf gdb-$(gdb_ver)
tar jxf gdb-$(gdb_ver).tar.bz2
touch $@
build_gdb: log = $(logdir)/gdb-$(gdb_ver).log
build_gdb: logdir
build_gdb: unpack_gdb build_gdb_stamp
build_gdb_stamp:
@echo "+++ Building GDB..."
rm -f $@
> $(log)
rm -rf build-gdb-$(gdb_ver)
mkdir build-gdb-$(gdb_ver)
cd build-gdb-$(gdb_ver); ../gdb-$(gdb_ver)/configure \
--prefix=$(sh_prefix) \
--target=$(sh_target) $(to_log)
make -C build-gdb-$(gdb_ver) $(to_log)
touch $@
install_gdb: log = $(logdir)/gdb-$(gdb_ver).log
install_gdb: logdir
install_gdb: build_gdb install_gdb_stamp
install_gdb_stamp:
@echo "+++ Installing GDB..."
rm -f $@
make -C build-gdb-$(gdb_ver) install DESTDIR=$(DESTDIR) $(to_log)
touch $@
gdb: install_gdb
# INSIGHT building
insight-$(insight_ver).tar.bz2:
@echo "+++ Downloading INSIGHT..."
wget -c ftp://sourceware.org/pub/insight/releases/insight-$(insight_ver).tar.bz2
unpack_insight: insight-$(insight_ver).tar.bz2 unpack_insight_stamp
unpack_insight_stamp:
@echo "+++ Unpacking INSIGHT..."
rm -f $@
rm -rf insight-$(insight_ver)
tar jxf insight-$(insight_ver).tar.bz2
touch $@
build_insight: log = $(logdir)/insight-$(insight_ver).log
build_insight: logdir
build_insight: unpack_insight build_insight_stamp
build_insight_stamp:
@echo "+++ Building INSIGHT..."
rm -f $@
> $(log)
rm -rf build-insight-$(insight_ver)
mkdir build-insight-$(insight_ver)
cd build-insight-$(insight_ver); ../insight-$(insight_ver)/configure \
--prefix=$(sh_prefix) \
--target=$(sh_target) $(to_log)
make -C build-insight-$(insight_ver) $(to_log)
touch $@
install_insight: log = $(logdir)/insight-$(insight_ver).log
install_insight: logdir
install_insight: build_insight install_insight_stamp
install_insight_stamp:
@echo "+++ Installing INSIGHT..."
rm -f $@
make -C build-insight-$(insight_ver) install DESTDIR=$(DESTDIR) $(to_log)
touch $@
insight: install_insight
# ---- support {{{
clean:
-rm -rf build-newlib-$(sh_target)-$(newlib_ver)
-rm -rf build-newlib-$(arm_target)-$(newlib_ver)
-rm -rf build-gcc-$(sh_target)-$(gcc_ver)
-rm -rf build-gcc-$(arm_target)-$(gcc_ver)
-rm -rf build-binutils-$(sh_target)-$(binutils_ver)
-rm -rf build-binutils-$(arm_target)-$(binutils_ver)
-rm -rf build-gdb-$(gdb_ver) install_gdb_stamp build_gdb_stamp
-rm -rf build-insight-$(gdb_ver) install_insight_stamp build_insight_stamp
logdir:
@mkdir -p $(logdir)
# If erase=1, erase build directories on the fly.
ifeq (1,$(erase))
define clean_up
@echo "+++ Cleaning up $(build)..."
-rm -rf $(build)
endef
# Hack to clean up ARM gcc pass 1
define clean_arm_hack
@echo "+++ Cleaning up build-gcc-$(arm_target)-$(gcc_ver)..."
-rm -rf build-gcc-$(arm_target)-$(gcc_ver)
endef
endif
# If verbose=1, display output to screen as well as log files
ifeq (1,$(verbose))
to_log = 2>&1 | tee -a $(log)
else
to_log = >> $(log) 2>&1
endif
# ---- }}}
# ---- phony targets {{{
.PHONY: $(patch_targets)
.PHONY: $(newlib_patches) $(binutils_patches) $(gcc_patches) $(kos_patches)
.PHONY: all build patch build-sh4 build-arm $(build_sh4_targets) $(build_arm_targets) clean
.PHONY: build-binutils build-newlib build-gcc-pass1 build-gcc-pass2 fixup-sh4-newlib
.PHONY: gdb install_gdb build_gdb unpack_gdb
.PHONY: insight install_insight build_insight unpack_insight
# ---- }}}}
# vim:tw=0:fdm=marker:fdc=2:fdl=1