diff --git a/CMakeLists.txt b/CMakeLists.txt
index 23ecc05892..94eae1699a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,44 +18,6 @@
cmake_minimum_required(VERSION 2.8)
project(Retro)
-include(CMakeParseArguments)
-
-function(add_application name)
- set(options DEBUGBREAK CONSOLE)
- set(oneValueArgs TYPE CREATOR)
- set(multiValueArgs FILES MAKEAPPL_ARGS)
- cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
-
- list(APPEND ARGS_FILES ${ARGS_UNPARSED_ARGUMENTS})
-
- set(files)
- foreach(f ${ARGS_FILES})
- list(APPEND files "${CMAKE_CURRENT_SOURCE_DIR}/${f}")
- endforeach()
-
- add_executable(${name} ${files})
-
- if(${ARGS_DEBUGBREAK})
- list(APPEND ARGS_MAKEAPPL_ARGS -b)
- endif()
- if(${ARGS_CONSOLE})
- target_link_libraries(${name} RetroConsole)
- endif()
-
-
- if(TARGET libretro)
- set_target_properties(${name} PROPERTIES LINK_DEPENDS libretro)
- endif(TARGET libretro)
-
- set_target_properties(${name} PROPERTIES OUTPUT_NAME ${name}.flt)
-
- add_custom_command(
- OUTPUT ${name}.bin ${name} ${name}.dsk
- COMMAND ${MAKE_APPL} ${ARGS_MAKEAPPL_ARGS} -c "${name}.flt" -o "${name}"
- DEPENDS ${name})
- add_custom_target(${name}_APPL ALL DEPENDS ${name}.bin)
-endfunction()
-
if(CMAKE_SYSTEM_NAME MATCHES Retro68)
add_subdirectory(libretro)
@@ -67,6 +29,12 @@ add_subdirectory(TestApps)
add_subdirectory(Raytracer)
add_subdirectory(Launcher)
else()
+
+configure_file(cmake/retro68.toolchain.cmake.in cmake/retro68.toolchain.cmake @ONLY)
+
+install(DIRECTORY cmake/ DESTINATION cmake FILES_MATCHING PATTERN "*.cmake")
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake/retro68.toolchain.cmake DESTINATION cmake)
+
add_subdirectory(ResourceFiles)
add_subdirectory(MakeAPPL)
add_subdirectory(ASFilter)
diff --git a/HelloWorld/CMakeLists.txt b/HelloWorld/CMakeLists.txt
new file mode 100644
index 0000000000..c810f7a018
--- /dev/null
+++ b/HelloWorld/CMakeLists.txt
@@ -0,0 +1,11 @@
+# cmake \
+# -DCMAKE_TOOLCHAIN_FILE=$SRC/retro68.toolchain.cmake \
+# -DRETRO68_ROOT=$PREFIX \
+# -DCMAKE_BUILD_TYPE=Release
+
+cmake_minimum_required(VERSION 2.8)
+
+add_application(HelloWorld
+ hello.c
+ CONSOLE
+ )
diff --git a/HelloWorld/Makefile b/HelloWorld/Makefile
new file mode 100644
index 0000000000..b62121380e
--- /dev/null
+++ b/HelloWorld/Makefile
@@ -0,0 +1,15 @@
+# path to RETRO68
+RETRO68=../../Retro68-build/toolchain
+
+PREFIX=$(RETRO68)/m68k-unknown-elf
+CC=$(RETRO68)/bin/m68k-unknown-elf-gcc
+CXX=$(RETRO68)/bin/m68k-unknown-elf-g++
+MAKEAPPL=$(RETRO68)/bin/MakeAPPL
+
+LDFLAGS=-lRetroConsole
+
+HelloWorld.bin HelloWorld.APPL HelloWorld.dsk: HelloWorld.flt
+ $(MAKEAPPL) -c HelloWorld.flt -o HelloWorld
+
+HelloWorld.flt: hello.o
+ $(CXX) $< -o $@ $(LDFLAGS) # C++ used for linking because RetroConsole needs it
diff --git a/HelloWorld/hello.c b/HelloWorld/hello.c
new file mode 100644
index 0000000000..1dbd3ac56d
--- /dev/null
+++ b/HelloWorld/hello.c
@@ -0,0 +1,28 @@
+/*
+ Copyright 2014 Wolfgang Thaller.
+
+ This file is part of Retro68.
+
+ Retro68 is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Retro68 is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Retro68. If not, see .
+*/
+
+#include
+
+int main(int argc, char** argv)
+{
+ printf("Hello, world.\n");
+ printf("\n(Press Return)\n");
+ getchar();
+ return 0;
+}
diff --git a/build-toolchain.sh b/build-toolchain.sh
index 541af35aba..f8c96047e8 100644
--- a/build-toolchain.sh
+++ b/build-toolchain.sh
@@ -66,19 +66,18 @@ cd build-host
cmake ${SRC} -DCMAKE_INSTALL_PREFIX=$PREFIX
cd ..
+make -C build-host install
+
# create an empty libretrocrt.a so that cmake's compiler test doesn't fail
$PREFIX/bin/m68k-unknown-elf-ar cqs $PREFIX/m68k-unknown-elf/lib/libretrocrt.a
# the real libretrocrt.a is built and installed by `make -C build-target install` later
mkdir -p build-target
cd build-target
-cmake ${SRC} -DCMAKE_INSTALL_PREFIX=$PREFIX/m68k-unknown-elf \
- -DCMAKE_TOOLCHAIN_FILE=$SRC/retro68.toolchain.cmake \
- -DRETRO68_ROOT=$PREFIX \
+cmake ${SRC} -DCMAKE_TOOLCHAIN_FILE=$PREFIX/cmake/retro68.toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release
cd ..
-make -C build-host install
if test ! -e $PREFIX/bin/m68k-unknown-elf-as.real; then
mv $PREFIX/bin/m68k-unknown-elf-as $PREFIX/bin/m68k-unknown-elf-as.real
diff --git a/cmake/add_application.cmake b/cmake/add_application.cmake
new file mode 100644
index 0000000000..1ce8478192
--- /dev/null
+++ b/cmake/add_application.cmake
@@ -0,0 +1,46 @@
+include(CMakeParseArguments)
+
+cmake_policy(PUSH)
+cmake_policy(SET CMP0012 NEW)
+
+function(add_application name)
+
+ set(options DEBUGBREAK CONSOLE)
+ set(oneValueArgs TYPE CREATOR)
+ set(multiValueArgs FILES MAKEAPPL_ARGS)
+ cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
+
+ list(APPEND ARGS_FILES ${ARGS_UNPARSED_ARGUMENTS})
+
+ set(files)
+ foreach(f ${ARGS_FILES})
+ list(APPEND files "${CMAKE_CURRENT_SOURCE_DIR}/${f}")
+ endforeach()
+
+ add_executable(${name} ${files})
+
+ if(${ARGS_DEBUGBREAK})
+ list(APPEND ARGS_MAKEAPPL_ARGS -b)
+ endif()
+ if(${ARGS_CONSOLE})
+ target_link_libraries(${name} RetroConsole)
+
+ # RetroConsole library uses C++:
+ set_target_properties(${name} PROPERTIES LINKER_LANGUAGE CXX)
+ endif()
+
+
+ if(TARGET libretro)
+ set_target_properties(${name} PROPERTIES LINK_DEPENDS libretro)
+ endif(TARGET libretro)
+
+ set_target_properties(${name} PROPERTIES OUTPUT_NAME ${name}.flt)
+
+ add_custom_command(
+ OUTPUT ${name}.bin ${name} ${name}.dsk
+ COMMAND ${MAKE_APPL} ${ARGS_MAKEAPPL_ARGS} -c "${name}.flt" -o "${name}"
+ DEPENDS ${name})
+ add_custom_target(${name}_APPL ALL DEPENDS ${name}.bin)
+endfunction()
+
+cmake_policy(POP)
\ No newline at end of file
diff --git a/retro68.toolchain.cmake b/cmake/retro68.toolchain.cmake.in
similarity index 86%
rename from retro68.toolchain.cmake
rename to cmake/retro68.toolchain.cmake.in
index a2478b5ddd..0f029a0018 100644
--- a/retro68.toolchain.cmake
+++ b/cmake/retro68.toolchain.cmake.in
@@ -18,7 +18,7 @@
set( CMAKE_SYSTEM_NAME Retro68 )
set( CMAKE_SYSTEM_VERSION 1)
-set( RETRO68_ROOT "" CACHE PATH "path to root of Retro68 Toolchain" )
+set( RETRO68_ROOT "@CMAKE_INSTALL_PREFIX@" CACHE PATH "path to root of Retro68 Toolchain" )
set( CMAKE_INSTALL_PREFIX "${RETRO68_ROOT}/m68k-unknown-elf/" CACHE PATH "installation prefix" )
set( MAKE_APPL "${RETRO68_ROOT}/bin/MakeAPPL" )
@@ -27,3 +27,5 @@ set( REZ "${RETRO68_ROOT}/bin/Rez" )
set( CMAKE_C_COMPILER "${RETRO68_ROOT}/bin/m68k-unknown-elf-gcc" )
set( CMAKE_CXX_COMPILER "${RETRO68_ROOT}/bin/m68k-unknown-elf-g++" )
+list( APPEND CMAKE_MODULE_PATH "${RETRO68_ROOT}/cmake" )
+include(add_application)