History: Building Your Projects With CMake
Preview of version: 45
- «
- »
|
This section is an introduction on how to use CMake to build your own projects and have them link against Ogre. For more detailed information about CMake, refer to the official CMake website: http://www.cmake.org |
Introduction
This is a simple CMake script for use in your own projects.
The sample script uses the Ogre Wiki Tutorial Framework, but you can adapt it easily.
Works for Visual Studio and MinGW on Windows, and regular GCC tool-chain on Linux.
Table of contents
Prerequisites
Be sure to visit the Prerequisites page!
Note for Windows:
If you don't have Boost installed, you want to set the environment variable BOOST_ROOT to OGRE_HOME/boost_1_42
What It Does
The CMake script will configure your project to output the executable into 'BUILD_DIRECTORY/dist/bin', either by post-build copy or by setting the output path directly.
The INSTALL project/target will copy plugins.cfg and resources.cfg to the bin directory, and on Windows it will additionally copy the Ogre DLLs and the Media directory as well (to 'BUILD_DIRECTORY/Media').
Normally, you don't need to build the install target more than once, or whenever Ogre itself changes.
If you don't want, or need that behavior, either don't build INSTALL, or modify it to suit your needs.
What You Need
Ogre Wiki Tutorial Framework
Get the Ogre Wiki Tutorial Framework and put the four files in a directory:
- ogreapp
- CMakeLists.txt (see below)
- BaseApplication.h
- BaseApplication.cpp
- TutorialApplication.h
- TutorialApplication.cpp
CMakeLists.txt
|
|
This CMake script assumes the following:
|
#/* #----------------------------------------------------------------------------- #Filename: CMakeLists.txt #----------------------------------------------------------------------------- # #This source file is part of the # ___ __ __ _ _ _ # /___\__ _ _ __ ___ / / /\ \ (_) | _(_) # // // _` | '__/ _ \ \ \/ \/ / | |/ / | #/ \_// (_| | | | __/ \ /\ /| | <| | #\___/ \__, |_| \___| \/ \/ |_|_|\_\_| # |___/ # Tutorial Framework # http://www.ogre3d.org/tikiwiki/ #----------------------------------------------------------------------------- #*/ cmake_minimum_required(VERSION 2.6) project(OgreApp) if(WIN32) set(CMAKE_MODULE_PATH "$ENV{OGRE_HOME}/CMake/;${CMAKE_MODULE_PATH}") set(OGRE_SAMPLES_INCLUDEPATH $ENV{OGRE_HOME}/Samples/include ) endif(WIN32) if(UNIX) set(CMAKE_MODULE_PATH "/usr/local/lib/OGRE/cmake/;${CMAKE_MODULE_PATH}") set(OGRE_SAMPLES_INCLUDEPATH /usr/local/share/OGRE/samples/Common/include/ ) endif(UNIX) if (CMAKE_BUILD_TYPE STREQUAL "") # CMake defaults to leaving CMAKE_BUILD_TYPE empty. This screws up # differentiation between debug and release builds. set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build, options are: None (CMAKE_CXX_FLAGS or CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel." FORCE) endif () set(CMAKE_DEBUG_POSTFIX "_d") set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/dist") find_package(OGRE REQUIRED) if(NOT "${OGRE_VERSION_NAME}" STREQUAL "Cthugha") message(SEND_ERROR "You need Ogre 1.7 Cthugha to build this.") endif() find_package(OIS REQUIRED) if(NOT OIS_FOUND) message(SEND_ERROR "Failed to find OIS.") endif() # Find Boost if (NOT OGRE_BUILD_PLATFORM_IPHONE) if (WIN32 OR APPLE) set(Boost_USE_STATIC_LIBS TRUE) else () # Statically linking boost to a dynamic Ogre build doesn't work on Linux 64bit set(Boost_USE_STATIC_LIBS ${OGRE_STATIC}) endif () if (MINGW) # this is probably a bug in CMake: the boost find module tries to look for # boost libraries with name libboost_*, but CMake already prefixes library # search names with "lib". This is the workaround. set(CMAKE_FIND_LIBRARY_PREFIXES ${CMAKE_FIND_LIBRARY_PREFIXES} "") endif () set(Boost_ADDITIONAL_VERSIONS "1.42" "1.42.0" "1.41.0" "1.41" "1.40.0" "1.40" "1.39.0" "1.39" "1.38.0" "1.38" "1.37.0" "1.37" ) # Components that need linking (NB does not include header-only components like bind) set(OGRE_BOOST_COMPONENTS thread date_time) find_package(Boost COMPONENTS ${OGRE_BOOST_COMPONENTS} QUIET) if (NOT Boost_FOUND) # Try again with the other type of libs set(Boost_USE_STATIC_LIBS NOT ${Boost_USE_STATIC_LIBS}) find_package(Boost COMPONENTS ${OGRE_BOOST_COMPONENTS} QUIET) endif() find_package(Boost QUIET) # Set up referencing of Boost include_directories(${Boost_INCLUDE_DIR}) add_definitions(-DBOOST_ALL_NO_LIB) set(OGRE_LIBRARIES ${OGRE_LIBRARIES} ${Boost_LIBRARIES}) endif() set(HDRS ./BaseApplication.h ./TutorialApplication.h ) set(SRCS ./BaseApplication.cpp ./TutorialApplication.cpp ) include_directories( ${OIS_INCLUDE_DIRS} ${OGRE_INCLUDE_DIRS} ${OGRE_SAMPLES_INCLUDEPATH} ) add_executable(OgreApp WIN32 ${HDRS} ${SRCS}) set_target_properties(OgreApp PROPERTIES DEBUG_POSTFIX _d) target_link_libraries(OgreApp ${OGRE_LIBRARIES} ${OIS_LIBRARIES}) file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/dist/bin) file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/dist/media) # post-build copy for win32 if(WIN32 AND NOT MINGW) add_custom_command( TARGET OgreApp PRE_BUILD COMMAND if not exist .\\dist\\bin mkdir .\\dist\\bin ) add_custom_command( TARGET OgreApp POST_BUILD COMMAND copy \"$(TargetPath)\" .\\dist\\bin ) endif(WIN32 AND NOT MINGW) if(MINGW) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/dist/bin) endif(MINGW) if(WIN32) install(TARGETS OgreApp RUNTIME DESTINATION bin CONFIGURATIONS All) install(DIRECTORY ${CMAKE_SOURCE_DIR}/dist/Media DESTINATION ./ CONFIGURATIONS Release RelWithDebInfo Debug ) install(FILES ${CMAKE_SOURCE_DIR}/dist/bin/plugins.cfg ${CMAKE_SOURCE_DIR}/dist/bin/resources.cfg DESTINATION bin CONFIGURATIONS Release RelWithDebInfo ) install(FILES ${CMAKE_SOURCE_DIR}/dist/bin/plugins_d.cfg ${CMAKE_SOURCE_DIR}/dist/bin/resources_d.cfg DESTINATION bin CONFIGURATIONS Debug ) install(FILES ${OGRE_PLUGIN_DIR_REL}/OgreMain.dll ${OGRE_PLUGIN_DIR_REL}/RenderSystem_Direct3D9.dll ${OGRE_PLUGIN_DIR_REL}/RenderSystem_GL.dll ${OGRE_PLUGIN_DIR_REL}/OIS.dll DESTINATION bin CONFIGURATIONS Release RelWithDebInfo ) install(FILES ${OGRE_PLUGIN_DIR_DBG}/OgreMain_d.dll ${OGRE_PLUGIN_DIR_DBG}/RenderSystem_Direct3D9_d.dll ${OGRE_PLUGIN_DIR_DBG}/RenderSystem_GL_d.dll ${OGRE_PLUGIN_DIR_DBG}/OIS_d.dll DESTINATION bin CONFIGURATIONS Debug ) endif(WIN32)
Replace OgreApp with any name you want.
CMAKE_MODULE_PATH points to where you installed the Ogre3D cmake modules.
OGRE_SAMPLES_INCLUDEPATH points to where you installed the Ogre3D Samples framework include directory.
This usually happens when you run make install.
How To Use It
After having created your OgreApp source directory, and populated it with the four files from the Ogre Wiki Tutorial Framework and the CMakeLists.txt file, you are now ready to build it using CMake.
- Open CMake-Gui, choose your source directory ('ogreapp') and a build directory ('ogreapp_build').
- Click 'Configure', choose a generator.
- Click 'Configure' again if CMake ran without fatal errors.
- Click 'Generate'.
- Navigate to your 'ogreapp_build' directory.
What you should do next depends on what generator you're using.
Visual Studio
- Open the 'OgreApp' solution and build the 'BUILD_ALL' project.
- Build the 'INSTALL' project - you only need to build this once to copy the Ogre DLLs, configuration files and media over.
MinGW
- Open a command prompt and issue the command: mingw32-make
- Install the Ogre files by doing a mingw32-make install
GCC on Linux
- In a console, issue the command: make
- You should see the make command looking for the parts of the build that are required (Ogre (obviously:)), OIS, boost, etc..) Then the compilation progress indicators
- Now if you list this directories contents you should see an "OgreApp" binary (assuming that's what you named your target in the CMakeLists.txt file).
- If you try running the bin now, you'll get an error because you're missing the resources.cfg and the plugins.cfg config files. For people not familiar, these tell the Ogre engine where certain libraries, plugins, assets, etc... can be found. The details of these files and how to configure them can be found elsewhere in the wiki. For now, look for them in the OgreSDK build directory inst/bin/release (assuming you built ogre from source and not the pre-built SDK). I'm not sure where these files can be found in the pre-built SDK. These versions of the config files contain way more than what is needed to run this sample bare bones app but we're just testing our build process at this point.
- Run the "OgreApp" bin and you should see a blank screen with some OgreSDK info overlays. If you've gotten this far, your build process works!