You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
5.2 KiB
176 lines
5.2 KiB
Step 1: A Basic Starting Point
|
|
==============================
|
|
|
|
The most basic project is an executable built from source code files.
|
|
For simple projects, a three line ``CMakeLists.txt`` file is all that is
|
|
required. This will be the starting point for our tutorial. Create a
|
|
``CMakeLists.txt`` file in the ``Step1`` directory that looks like:
|
|
|
|
.. code-block:: cmake
|
|
:caption: CMakeLists.txt
|
|
:name: CMakeLists.txt-start
|
|
|
|
cmake_minimum_required(VERSION 3.10)
|
|
|
|
# set the project name
|
|
project(Tutorial)
|
|
|
|
# add the executable
|
|
add_executable(Tutorial tutorial.cxx)
|
|
|
|
|
|
Note that this example uses lower case commands in the ``CMakeLists.txt`` file.
|
|
Upper, lower, and mixed case commands are supported by CMake. The source
|
|
code for ``tutorial.cxx`` is provided in the ``Step1`` directory and can be
|
|
used to compute the square root of a number.
|
|
|
|
Build and Run
|
|
-------------
|
|
|
|
That's all that is needed - we can build and run our project now! First, run
|
|
the :manual:`cmake <cmake(1)>` executable or the
|
|
:manual:`cmake-gui <cmake-gui(1)>` to configure the project and then build it
|
|
with your chosen build tool.
|
|
|
|
For example, from the command line we could navigate to the
|
|
``Help/guide/tutorial`` directory of the CMake source code tree and create a
|
|
build directory:
|
|
|
|
.. code-block:: console
|
|
|
|
mkdir Step1_build
|
|
|
|
Next, navigate to the build directory and run CMake to configure the project
|
|
and generate a native build system:
|
|
|
|
.. code-block:: console
|
|
|
|
cd Step1_build
|
|
cmake ../Step1
|
|
|
|
Then call that build system to actually compile/link the project:
|
|
|
|
.. code-block:: console
|
|
|
|
cmake --build .
|
|
|
|
Finally, try to use the newly built ``Tutorial`` with these commands:
|
|
|
|
.. code-block:: console
|
|
|
|
Tutorial 4294967296
|
|
Tutorial 10
|
|
Tutorial
|
|
|
|
|
|
Adding a Version Number and Configured Header File
|
|
--------------------------------------------------
|
|
|
|
The first feature we will add is to provide our executable and project with a
|
|
version number. While we could do this exclusively in the source code, using
|
|
``CMakeLists.txt`` provides more flexibility.
|
|
|
|
First, modify the ``CMakeLists.txt`` file to use the :command:`project` command
|
|
to set the project name and version number.
|
|
|
|
.. literalinclude:: Step2/CMakeLists.txt
|
|
:caption: CMakeLists.txt
|
|
:name: CMakeLists.txt-project-VERSION
|
|
:language: cmake
|
|
:end-before: # specify the C++ standard
|
|
|
|
Then, configure a header file to pass the version number to the source
|
|
code:
|
|
|
|
.. literalinclude:: Step2/CMakeLists.txt
|
|
:caption: CMakeLists.txt
|
|
:name: CMakeLists.txt-configure_file
|
|
:language: cmake
|
|
:start-after: # to the source code
|
|
:end-before: # add the executable
|
|
|
|
Since the configured file will be written into the binary tree, we
|
|
must add that directory to the list of paths to search for include
|
|
files. Add the following lines to the end of the ``CMakeLists.txt`` file:
|
|
|
|
.. literalinclude:: Step2/CMakeLists.txt
|
|
:caption: CMakeLists.txt
|
|
:name: CMakeLists.txt-target_include_directories
|
|
:language: cmake
|
|
:start-after: # so that we will find TutorialConfig.h
|
|
|
|
Using your favorite editor, create ``TutorialConfig.h.in`` in the source
|
|
directory with the following contents:
|
|
|
|
.. literalinclude:: Step2/TutorialConfig.h.in
|
|
:caption: TutorialConfig.h.in
|
|
:name: TutorialConfig.h.in
|
|
:language: c++
|
|
|
|
When CMake configures this header file the values for
|
|
``@Tutorial_VERSION_MAJOR@`` and ``@Tutorial_VERSION_MINOR@`` will be
|
|
replaced.
|
|
|
|
Next modify ``tutorial.cxx`` to include the configured header file,
|
|
``TutorialConfig.h``.
|
|
|
|
Finally, let's print out the executable name and version number by updating
|
|
``tutorial.cxx`` as follows:
|
|
|
|
.. literalinclude:: Step2/tutorial.cxx
|
|
:caption: tutorial.cxx
|
|
:name: tutorial.cxx-print-version
|
|
:language: c++
|
|
:start-after: {
|
|
:end-before: // convert input to double
|
|
|
|
Specify the C++ Standard
|
|
-------------------------
|
|
|
|
Next let's add some C++11 features to our project by replacing ``atof`` with
|
|
``std::stod`` in ``tutorial.cxx``. At the same time, remove
|
|
``#include <cstdlib>``.
|
|
|
|
.. literalinclude:: Step2/tutorial.cxx
|
|
:caption: tutorial.cxx
|
|
:name: tutorial.cxx-cxx11
|
|
:language: c++
|
|
:start-after: // convert input to double
|
|
:end-before: // calculate square root
|
|
|
|
We will need to explicitly state in the CMake code that it should use the
|
|
correct flags. The easiest way to enable support for a specific C++ standard
|
|
in CMake is by using the :variable:`CMAKE_CXX_STANDARD` variable. For this
|
|
tutorial, set the :variable:`CMAKE_CXX_STANDARD` variable in the
|
|
``CMakeLists.txt`` file to ``11`` and :variable:`CMAKE_CXX_STANDARD_REQUIRED`
|
|
to ``True``. Make sure to add the ``CMAKE_CXX_STANDARD`` declarations above the
|
|
call to ``add_executable``.
|
|
|
|
.. literalinclude:: Step2/CMakeLists.txt
|
|
:caption: CMakeLists.txt
|
|
:name: CMakeLists.txt-CXX_STANDARD
|
|
:language: cmake
|
|
:end-before: # configure a header file to pass some of the CMake settings
|
|
|
|
Rebuild
|
|
-------
|
|
|
|
Let's build our project again. We already created a build directory and ran
|
|
CMake, so we can skip to the build step:
|
|
|
|
.. code-block:: console
|
|
|
|
cd Step1_build
|
|
cmake --build .
|
|
|
|
Now we can try to use the newly built ``Tutorial`` with same commands as before:
|
|
|
|
.. code-block:: console
|
|
|
|
Tutorial 4294967296
|
|
Tutorial 10
|
|
Tutorial
|
|
|
|
Check that the version number is now reported when running the executable without
|
|
any arguments.
|