Page 1 of 1

cmake

Posted: Wed Mar 17, 2010 3:26 pm
by yatagarasu
Hi everybody.

Here are some cmake scripts for devkitPro development. If you don't know, cmake is cross compiler build system much easier to use than make or auto-tools.

Here you can download simple Nintendo ds cmake project http://rghost.net/1182556
Just extract it somewhere.
Install latest cmake for your system from http://www.cmake.org/cmake/resources/software.html direct link for win32 installer http://www.cmake.org/files/v2.8/cmake-2 ... 32-x86.exe

than open command line in projects root and run

Code: Select all

#>prepare.bat Nitro Debug
#>cd build.Nitro.Debug
#>make
if everything is right you should see following output

Code: Select all

#>prepare.bat Nitro Debug

C:\devkitPro\projects\nitro>mkdir build.Nitro.Debug 

C:\devkitPro\projects\nitro>cd build.Nitro.Debug 

C:\devkitPro\projects\nitro\build.Nitro.Debug>cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=../cmake/Modules/Toolchain/Nitro.cmake -DCMAKE_BUILD_TYPE=Debug .. 
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Looking for arm-eabi-as
-- Looking for arm-eabi-as -- C:/devkitPro/devkitARM/bin/arm-eabi-as.exe
-- Looking for bin2s
-- Looking for bin2s -- C:/devkitPro/devkitARM/bin/bin2s.exe
-- Looking for arm-eabi-objcopy
-- Looking for arm-eabi-objcopy -- C:/devkitPro/devkitARM/bin/arm-eabi-objcopy.exe
-- Looking for ndstool
-- Looking for ndstool -- C:/devkitPro/devkitARM/bin/ndstool.exe
-- Check for working C compiler: c:/devkitPro/devkitARM/bin/arm-eabi-gcc.exe
-- Check for working C compiler: c:/devkitPro/devkitARM/bin/arm-eabi-gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: c:/devkitPro/devkitARM/bin/arm-eabi-g++.exe
-- Check for working CXX compiler: c:/devkitPro/devkitARM/bin/arm-eabi-g++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: C:/devkitPro/projects/nitro/build.Nitro.Debug

#>cd build.Nitro.Debug
#>make
[ 20%] Generating drunkenlogo_pcx.h
[ 40%] Generating drunkenlogo_pcx.o
Scanning dependencies of target nitro-arm9-data
Linking C static library libnitro-arm9-data.a
[ 40%] Built target nitro-arm9-data
Scanning dependencies of target nitro-arm9
[ 60%] Building CXX object CMakeFiles/nitro-arm9.dir/source/nehe6.cpp.obj
Linking CXX executable nitro-arm9
[ 60%] Built target nitro-arm9
Scanning dependencies of target nitro-nds
[ 60%] Generating nitro-arm9.o
[ 60%] Generating nitro.nds
Nintendo DS rom tool 1.47 - Feb 21 2010
by Rafael Vuijk, Dave Murphy, Alexei Karpenko
[100%] Built target nitro-nds
resulting rom file is generated in build.Nitro.Debug\nitro.nds

You can use prepare.bat [Nitro|PSP] [Debug|Release] to prepare build directory. It should be run only once. Next you can just run make in build directory. All CMakeLists.txt should be updated automatically.

Features: =)
1) Now only arm9 build is supported.
2) binary resources linkage is supported. (but no grit yet.)
3) devkitPSP is also supported.

CMakeLists.txt - is main cmake project file.

Code: Select all

cmake_minimum_required(VERSION 2.6)

# must be here so custom cmake scripts should be available.
set(SANDBOX_MODULE_DIR "${CMAKE_SOURCE_DIR}/cmake/modules")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${SANDBOX_MODULE_DIR}")

# must be here for generated resource .h files will be visible.
include_directories(${CMAKE_CURRENT_BINARY_DIR})

# project name.
project(nitro)

# generated rom name
set(ROM_NAME nitro)

# data files
set(DATA
    data/drunkenlogo.pcx
    )

#common source files
set(SOURCES
    source/nehe6.cpp
    )

#nitro source files
set(NITRO_SOURCES
    )

#psp source files
set(PSP_SOURCES
    )


if (${CMAKE_SYSTEM_NAME} STREQUAL Nitro) # could be used to determin Nitro build
# compiles arm9 core binary
nitro_add_executable(${ROM_NAME}-arm9 ${SOURCES} ${NITRO_SOURCES})
# compiles arm9 library
#nitro_add_library(${ROM_NAME}-arm9 STATIC ${SOURCES} ${NITRO_SOURCES})

# link your libraries here - before nitro libraries
target_link_libraries(${ROM_NAME}-arm9 nds9)

nitro_build_rom(${ROM_NAME} ${ROM_NAME}-arm9 ${DATA})
endif()

if (${CMAKE_SYSTEM_NAME} STREQUAL PSP) # could be used to determin PSP build
# compiles psp binary
psp_add_executable(${ROM_NAME}-psp ${SOURCES} ${PSP_SOURCES})
# compiles psp library
#psp_add_library(${ROM_NAME}-psp STATIC ${SOURCES} ${PSP_SOURCES})

# link your libraries here - before psp libraries
target_link_psp_libraries(${ROM_NAME}-psp)

psp_build_rom(${ROM_NAME} ${ROM_NAME}-psp ${DATA})
endif()
everything else should be obvious.
think it would be useful.
comments are welcome.

PS. cmake output is colored =)))

PPS. I'd like to mention Richard Quirks article http://quirkygba.blogspot.com/2008/09/a ... art-1.html which inspired my work.

Re: cmake

Posted: Thu Mar 18, 2010 1:56 am
by StevenH
Just one question for you...


WHY?????

Re: cmake

Posted: Thu Mar 18, 2010 2:05 am
by WinterMute
Really don't see the need. Very, very few people move away from the templates provided by devkitPro for DS code and, honestly, I have yet to see the gnu make replacement that's worth the bother.

You might think cmake is easier but really, most of our users don't actually have to do anything other than copy a template. Using .bat files is also ridiculous, we have a large number of OSX & linux users.

Re: cmake

Posted: Thu Mar 18, 2010 2:11 am
by StevenH
WinterMute wrote:we have a large number of OSX & linux users.
I'm one :), well I'm running linux under a VM and I should be ordering my Mac next month, I hope

Re: cmake

Posted: Thu Mar 18, 2010 8:31 am
by yatagarasu
The appealing side of cmake is that it is make file generator. It easily can generate make file for any gnu toolchain and even msvc. I personally use this scripts to build my project on win32, nitro, psp and linux platform. All you need is to switch Toolchain files or use none for native toolchain. So i just wanted to share them with those who possibly need them =)

So just don't compare cmake with make? because cmake uses make )

And bat file aren't ridiculous - they just reduce amoun of typing. And can be converted to shell scripts with all eyes shut ) And cmake works great under linux.

ps. i guess topic should be moved to user contributions.

Re: cmake

Posted: Thu Mar 18, 2010 10:04 am
by WinterMute
Yeah but ... bat files don't work under linux or OSX and the devkitPro installer gives you a bash shell under windows. Your bat file needs arguments ...

From the average devkitARM user's perspective this is way more complex than what already exists and doesn't seem to come close to what the template makefiles do.

Re: cmake

Posted: Thu Mar 18, 2010 3:10 pm
by yatagarasu
and the devkitPro installer gives you a bash shell under windows.
ok. never used it, because I program in Far Manager. and forgot that devkitPro have it.
Bash script even simpler to make user friendly =)

Code: Select all

#!/bin/sh

usage="Usage: $0 [Nitro|PSP] [Debug|Release]"

if [ $# -eq 2 ]; then
    mkdir build.$1.$2
    cd build.$1.$2
    cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=../cmake/Modules/Toolchain/$1.cmake -DCMAKE_BUILD_TYPE=$2 ..
else
    echo "$usage"; exit 1;
fi
From the average devkitARM user's perspective this is way more complex than what already exists and doesn't seem to come close to what the template makefiles do.
I like libnds makefile templates. They are simple and clear. CMake can be useful in far more complex projects (which may consist of multiple separate projects and libraries).