Click here to Skip to main content
15,881,089 members
Articles / Programming Languages / C
Article

The CMake Build Manager

Rate me:
Please Sign up or sign in to vote.
4.87/5 (23 votes)
31 Oct 2003CPOL2 min read 78.4K   1.2K   56   7
CMake is a cross-platform open-source build tool that generates Visual Studio 6, 7 and 7.1 IDE project files. It also generates makefiles for NMake, Borland, Mac OSX, Linux, and most UNIX systems.

Download Unix binaries: http://www.cmake.org/HTML/Download.html

CMake.jpg

Introduction

CMake is a cross platform build manager. It was developed to support a single input describing a build process that works on all platforms. However, instead of taking over the build process, it simply generates input for the native build tools. CMake can generate microsoft project files and various makefile formats for UNIX and Windows. With Visual Studio 6, 7, and 7.1 all having different project formats, CMake can be used to maintain support for all three versions in your project. In addition to porting the build system, CMake can be used to test the compiler for supported C++ features. CMake supports a full try/compile try/run system much like autoconf on UNIX. This will allow your code to take advantage of the supported features of the language as they become available.

Background

CMake is an Open Source project that has been in develpment for the past three years. For more information about CMake, see http://www.cmake.org/. Full source code for CMake can be downloaded from the the CMake homepage as well.

Using the Code


The following example demonstrates some key ideas of CMake.

There are three directories involved. The top level directory has two subdirectories called ./Demo and ./Hello. In the directory ./Hello, a library is built. In the directory ./Demo, an executable is built by linking to the library. A total of three CMakeList.txt files are created: one for each directory.

The first, top-level directory contains the following CMakeLists.txt file.

# The name of our project is "HELLO".  CMakeLists files in this project can
# refer to the root source directory of the project as ${HELLO_SOURCE_DIR} and
# to the root binary directory of the project as ${HELLO_BINARY_DIR}.
PROJECT(HELLO)

# Recurse into the "Hello" and "Demo" subdirectories.  This does not actually
# cause another cmake executable to run.  The same process will walk through
# the project's entire directory structure.
SUBDIRS(Hello Demo)
Then for each subdirectory listed in the SUBDIRS command, CMakeLists.txt files are created. In the ./Hello directory, the following CMakeLists.txt file is created:
# Create a library called "Hello" which includes the source file "hello.cxx".
# Any number of sources could be listed here.
ADD_LIBRARY(Hello hello.cxx)
Finally, in the ./Demo directory, the third and final CMakeLists.txt file is created:
# Make sure the compiler can find include files from our Hello library.
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/Hello)

# Make sure the linker can find the Hello library once it is built.
LINK_DIRECTORIES(${HELLO_BINARY_DIR}/Hello)

# Add executable called "helloDemo" that is built from the source files
# "demo.cxx" and "demo_b.cxx".  
ADD_EXECUTABLE(helloDemo demo.cxx demo_b.cxx)

# Link the executable to the Hello library.
TARGET_LINK_LIBRARIES(helloDemo Hello)

CMake when executed in the top-level directory will process the CMakeLists.txt file and then descend into the listed subdirectories. Variables, include paths, library paths, etc. are inherited. Depending on the system, makefiles (Unix) or workspaces/projects (MSVC) will be built. These can then be used in the usual way to build the code.

History

  • 1 Nov 2003 - updated download

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
United States United States
Currently, Mr Hoffman is a Vice President at Kitware Inc. where he develops object oriented visualization software. Mr. Hoffman completed his B.S in Computer Science from the University of Central Florida in 1990. He then joined General Electric Corporate Research and Development as a member of the Software Technology Program. During the program, he earned an M.S. in Computer Science from Rensselaer Polytechnic Institute. His master’s project led to the software package TargetJr that is a rich environment for Image Understanding research. The system consists of around 800K lines of C++ code and is used by GE, Oxford University, and several other sites around the world for advanced work in Computer Vision. His work on the TargetJr project concentrated on the system infrastructure, GUI, visualization and GIS.

In addition to the TargetJr package, Mr. Hoffman has contributed to the DARPA funded Image Understanding Environment (IUE) project. In 1996, he was recognized for his work as a technical directory for the IUE at the DARPA IU Workshop. As an expert in C++ and object oriented programming, he has also planned and taught several graduate level courses at Rensselaer Polytechnic Institute on C++ and large object oriented systems. He also taught a course on object oriented programming at New York University.

Comments and Discussions

 
Praiseit is still inspirational as of today Pin
Southmountain22-Jun-21 14:23
Southmountain22-Jun-21 14:23 
GeneralI highly recommend this Pin
John M. Drescher13-Mar-09 6:22
John M. Drescher13-Mar-09 6:22 
I have been using this for about a year with my cross platform Qt projects and it works great. Boy I could have used this years ago when I needed to keep vc6 and vc2003 project files for the same MFC source code synchronized. Now I can do the same with any version of VS and also generate *nix make files for when I compile my applications on linux as well. Thank You Bill for all your hard work on this and for making this open source/free.

John

QuestionIncluding cxx files into the project... Pin
GAleks6-Nov-05 23:12
GAleks6-Nov-05 23:12 
GeneralThank you Pin
tsurutsuru10-Aug-05 9:04
tsurutsuru10-Aug-05 9:04 
Questioncan Build Mozilla? Pin
SharpKnife4-Jan-04 16:14
SharpKnife4-Jan-04 16:14 
AnswerRe: can Build Mozilla? Pin
William A. Hoffman6-Apr-04 10:50
William A. Hoffman6-Apr-04 10:50 
GeneralThanks Pin
matrowang19-Jul-03 4:47
matrowang19-Jul-03 4:47 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.