diff --git a/.gitignore b/.gitignore index 52540e7..bd5fafc 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,58 @@ CMakeFiles Makefile cmake_install.cmake install_manifest.txt + +# +# Sublime Test +# +# cache files for sublime text +*.tmlanguage.cache +*.tmPreferences.cache +*.stTheme.cache + +# workspace files are user-specific +*.sublime-workspace + +# project files should be checked into the repository, unless a significant +# proportion of contributors will probably not be using SublimeText +# *.sublime-project + +# +# C / C++ +# + +# Compiled Object files +*.slo +*.lo +*.o +*.obj +*.ko +*.elf + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll +*.so.* +*.dylib + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib +*.lo + +# Executables +*.exe +*.out +*.app + +/**/build \ No newline at end of file diff --git a/01-basic/A-hello-cmake/CMakeLists.txt b/01-basic/A-hello-cmake/CMakeLists.txt new file mode 100644 index 0000000..ec649c0 --- /dev/null +++ b/01-basic/A-hello-cmake/CMakeLists.txt @@ -0,0 +1,10 @@ +# Set the minimum version of CMake that can be used +# To find the cmake version run +# $ cmake --version +cmake_minimum_required(VERSION 2.6) + +# Set the project name +project (hello_cmake) + +# Add an executable +add_executable(hello_cmake main.cpp) \ No newline at end of file diff --git a/01-basic/A-hello-cmake/README.md b/01-basic/A-hello-cmake/README.md new file mode 100644 index 0000000..e7cfa78 --- /dev/null +++ b/01-basic/A-hello-cmake/README.md @@ -0,0 +1,73 @@ +# Hello CMake + +Shows a very basic hello world example. + +## New Concepts + +### Minimum CMake version + +``` +cmake_minimum_required(VERSION 2.6) +``` + +When creating a project using CMake, you can specify the minimum version of CMake that is supported. + + +### Projects + +``` +project (hello_cmake) +``` + +A CMake build can include a project name to make referencing certain variables when using multiple projects. + +### Creating an executable + +``` +add_executable(hello_cmake main.cpp) +``` + +The add_executable() command specifies that an executable should be build from the specified source files, in this example main.cpp. The first argument to the add_executable() function is the name of the executable to be built, and the second argument is the source file from which to build the executable. + +HINT: A shorthand that some people use is to have the project name and executable name the same. This allows you to specify the CMakeLists.txt as follows, + +``` +cmake_minimum_required(VERSION 2.6) +project (hello_cmake) +add_executable(${PROJECT_NAME} main.cpp) +``` + +In this example, the project() function, will create a variable ${PROJECT_NAME} with the value hello_cmake. This can then be passed to the add_executable() function to output a 'hello_cmake' executable. + +## Building the example + +``` +$ mkdir build + +$ cd build + +$ cmake .. +-- The C compiler identification is GNU 4.8.4 +-- The CXX compiler identification is GNU 4.8.4 +-- Check for working C compiler: /usr/bin/cc +-- Check for working C compiler: /usr/bin/cc -- works +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working CXX compiler: /usr/bin/c++ +-- Check for working CXX compiler: /usr/bin/c++ -- works +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Configuring done +-- Generating done +-- Build files have been written to: /workspace/cmake-examples/01-basic/hello_cmake/build + +$ make +Scanning dependencies of target hello_cmake +[100%] Building CXX object CMakeFiles/hello_cmake.dir/hello_cmake.cpp.o +Linking CXX executable hello_cmake +[100%] Built target hello_cmake + +$ ./hello_cmake +Hello CMake! +``` + diff --git a/01-basic/A-hello-cmake/main.cpp b/01-basic/A-hello-cmake/main.cpp new file mode 100644 index 0000000..750dcac --- /dev/null +++ b/01-basic/A-hello-cmake/main.cpp @@ -0,0 +1,7 @@ +#include + +int main(int argc, char *argv[]) +{ + std::cout << "Hello CMake!" << std::endl; + return 0; +} \ No newline at end of file diff --git a/01-basic/B-hello-headers/CMakeLists.txt b/01-basic/B-hello-headers/CMakeLists.txt new file mode 100644 index 0000000..6476a26 --- /dev/null +++ b/01-basic/B-hello-headers/CMakeLists.txt @@ -0,0 +1,23 @@ +# Set the minimum version of CMake that can be used +# To find the cmake version run +# $ cmake --version +cmake_minimum_required(VERSION 2.6) + +# Set the project name +project (hello_headers) + +# Set the direcoties that should be included in the build command +# when running g++ these will be included as -I/directory/path/ +include_directories( + ${PROJECT_SOURCE_DIR}/inc + ) + +# Create a sources variable with a link to all cpp files to compile +set(SOURCES + src/Hello.cpp + src/main.cpp +) + + +# Add an executable with the above sources +add_executable(${PROJECT_NAME} ${SOURCES}) \ No newline at end of file diff --git a/01-basic/B-hello-headers/README.md b/01-basic/B-hello-headers/README.md new file mode 100644 index 0000000..5c6fd54 --- /dev/null +++ b/01-basic/B-hello-headers/README.md @@ -0,0 +1,117 @@ +# Hello CMake + +Shows a hello world example, which uses a seperate cpp file and include directory. + +## New Concepts + +### Directory Paths + +CMake syntax specifies a number of variables which can be used to help find useful directories in your project or source tree. Some of these include + +Variable | Info +-------- | ------ +CMAKE_SOURCE_DIR | The root source directory +CMAKE_CURRENT_SOURCE_DIR | The current source directory if using sub-projects and directories +PROJECT_SOURCE_DIR | The source director of the current cmake project. +CMAKE_BINARY_DIR | The root binary / build directory. This is the directory you run the cmake command from +CMAKE_CURRENT_BINARY_DIR | The build directory you are currently in. +PROJECT_BINARY_DIR | The build directory for the current project. + +### Including Directories + +``` +include_directories( + ${PROJECT_SOURCE_DIR}/inc + ) +``` + +When you have a seperate include folders, you can include them using the 'include_directories' function. +This will add these directories to the compiler with the -I flag, e.g. -I/directory/path + +### Setting Source files + +``` +# Create a sources variable with a link to all cpp files to compile +set(SOURCES + src/Hello.cpp + src/main.cpp +) + +add_executable(${PROJECT_NAME} ${SOURCES}) +``` + +Creating a variable which includes the source files allows you to be clearer about these files and add them to various commands, for example, the 'add_executable()' function. + +An alternative to setting specific file names in the SOURCES variable is to use a GLOB command to find files using wildcard pattern matching. + +``` +file(GLOB SOURCES "src/*.cpp") +``` + +## Building the example + +``` +$ mkdir build + +$ cd build + +$ cmake .. +-- The C compiler identification is GNU 4.8.4 +-- The CXX compiler identification is GNU 4.8.4 +-- Check for working C compiler: /usr/bin/cc +-- Check for working C compiler: /usr/bin/cc -- works +-- Detecting C compiler ABI info +-- Detecting C compiler ABI info - done +-- Check for working CXX compiler: /usr/bin/c++ +-- Check for working CXX compiler: /usr/bin/c++ -- works +-- Detecting CXX compiler ABI info +-- Detecting CXX compiler ABI info - done +-- Configuring done +-- Generating done +-- Build files have been written to: /home/matrim/workspace/cmake-examples/01-basic/hello_headers/build + +$ make +Scanning dependencies of target hello_headers +[ 50%] Building CXX object CMakeFiles/hello_headers.dir/src/Hello.cpp.o +[100%] Building CXX object CMakeFiles/hello_headers.dir/src/main.cpp.o +Linking CXX executable hello_headers +[100%] Built target hello_headers + +$ ./hello_headers +Hello Headers! +``` + +### Verbose Output + +In the previous examples, when running the make command the output only shows the status of the build. To see the full output for debugging purposes you can add 'VERBOSE=1' to the command to show all commands. + +The VERBOSE output is show below, and looking at the output lets you see the include directories being added to the g++ command. + +``` +$ make clean +$ make VERBOSE=1 +/usr/bin/cmake -H/home/matrim/workspace/cmake-examples/01-basic/hello_headers -B/home/matrim/workspace/cmake-examples/01-basic/hello_headers/build --check-build-system CMakeFiles/Makefile.cmake 0 +/usr/bin/cmake -E cmake_progress_start /home/matrim/workspace/cmake-examples/01-basic/hello_headers/build/CMakeFiles /home/matrim/workspace/cmake-examples/01-basic/hello_headers/build/CMakeFiles/progress.marks +make -f CMakeFiles/Makefile2 all +make[1]: Entering directory `/home/matrim/workspace/cmake-examples/01-basic/hello_headers/build' +make -f CMakeFiles/hello_headers.dir/build.make CMakeFiles/hello_headers.dir/depend +make[2]: Entering directory `/home/matrim/workspace/cmake-examples/01-basic/hello_headers/build' +cd /home/matrim/workspace/cmake-examples/01-basic/hello_headers/build && /usr/bin/cmake -E cmake_depends "Unix Makefiles" /home/matrim/workspace/cmake-examples/01-basic/hello_headers /home/matrim/workspace/cmake-examples/01-basic/hello_headers /home/matrim/workspace/cmake-examples/01-basic/hello_headers/build /home/matrim/workspace/cmake-examples/01-basic/hello_headers/build /home/matrim/workspace/cmake-examples/01-basic/hello_headers/build/CMakeFiles/hello_headers.dir/DependInfo.cmake --color= +make[2]: Leaving directory `/home/matrim/workspace/cmake-examples/01-basic/hello_headers/build' +make -f CMakeFiles/hello_headers.dir/build.make CMakeFiles/hello_headers.dir/build +make[2]: Entering directory `/home/matrim/workspace/cmake-examples/01-basic/hello_headers/build' +/usr/bin/cmake -E cmake_progress_report /home/matrim/workspace/cmake-examples/01-basic/hello_headers/build/CMakeFiles 1 +[ 50%] Building CXX object CMakeFiles/hello_headers.dir/src/Hello.cpp.o +/usr/bin/c++ -I/home/matrim/workspace/cmake-examples/01-basic/hello_headers/inc -o CMakeFiles/hello_headers.dir/src/Hello.cpp.o -c /home/matrim/workspace/cmake-examples/01-basic/hello_headers/src/Hello.cpp +/usr/bin/cmake -E cmake_progress_report /home/matrim/workspace/cmake-examples/01-basic/hello_headers/build/CMakeFiles 2 +[100%] Building CXX object CMakeFiles/hello_headers.dir/src/main.cpp.o +/usr/bin/c++ -I/home/matrim/workspace/cmake-examples/01-basic/hello_headers/inc -o CMakeFiles/hello_headers.dir/src/main.cpp.o -c /home/matrim/workspace/cmake-examples/01-basic/hello_headers/src/main.cpp +Linking CXX executable hello_headers +/usr/bin/cmake -E cmake_link_script CMakeFiles/hello_headers.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/hello_headers.dir/src/Hello.cpp.o CMakeFiles/hello_headers.dir/src/main.cpp.o -o hello_headers -rdynamic +make[2]: Leaving directory `/home/matrim/workspace/cmake-examples/01-basic/hello_headers/build' +/usr/bin/cmake -E cmake_progress_report /home/matrim/workspace/cmake-examples/01-basic/hello_headers/build/CMakeFiles 1 2 +[100%] Built target hello_headers +make[1]: Leaving directory `/home/matrim/workspace/cmake-examples/01-basic/hello_headers/build' +/usr/bin/cmake -E cmake_progress_start /home/matrim/workspace/cmake-examples/01-basic/hello_headers/build/CMakeFiles 0 +``` \ No newline at end of file diff --git a/01-basic/C-static-library/CMakeLists.txt b/01-basic/C-static-library/CMakeLists.txt new file mode 100644 index 0000000..a1c946f --- /dev/null +++ b/01-basic/C-static-library/CMakeLists.txt @@ -0,0 +1,36 @@ +cmake_minimum_required(VERSION 2.6) + +project(hello_library) + +include_directories( + ${PROJECT_SOURCE_DIR}/inc + ) + +############################################################ +# Create a library +############################################################ + +# Source files to be used in the library +set(library_SOURCES + src/Hello.cpp +) + +#Generate the static library from the library sources +add_library(hello_library STATIC ${library_SOURCES}) + +############################################################ +# Create an executable +############################################################ + +# Source fles for the binary +set(binary_SOURCES + src/main.cpp +) + +# Add an executable with the above sources +add_executable(hello_binary ${binary_SOURCES}) + +# link the new hello_library target with the hello_binary target +target_link_libraries( hello_binary + hello_library +) \ No newline at end of file diff --git a/01-basic/C-static-library/README.md b/01-basic/C-static-library/README.md new file mode 100644 index 0000000..e69de29 diff --git a/01-basic/C-static-library/inc/Hello.h b/01-basic/C-static-library/inc/Hello.h new file mode 100644 index 0000000..f838400 --- /dev/null +++ b/01-basic/C-static-library/inc/Hello.h @@ -0,0 +1,10 @@ +#ifndef __HELLO_H__ +#define __HELLO_H__ + +class Hello +{ +public: + void print(); +}; + +#endif diff --git a/01-basic/C-static-library/src/Hello.cpp b/01-basic/C-static-library/src/Hello.cpp new file mode 100644 index 0000000..eee8667 --- /dev/null +++ b/01-basic/C-static-library/src/Hello.cpp @@ -0,0 +1,8 @@ +#include + +#include "Hello.h" + +void Hello::print() +{ + std::cout << "Hello Static Library!" << std::endl; +} \ No newline at end of file diff --git a/01-basic/C-static-library/src/main.cpp b/01-basic/C-static-library/src/main.cpp new file mode 100644 index 0000000..62a1520 --- /dev/null +++ b/01-basic/C-static-library/src/main.cpp @@ -0,0 +1,8 @@ +#include "Hello.h" + +int main(int argc, char *argv[]) +{ + Hello hi; + hi.print(); + return 0; +} \ No newline at end of file diff --git a/01-basic/D-shared-library/CMakeLists.txt b/01-basic/D-shared-library/CMakeLists.txt new file mode 100644 index 0000000..4fde1d0 --- /dev/null +++ b/01-basic/D-shared-library/CMakeLists.txt @@ -0,0 +1,36 @@ +cmake_minimum_required(VERSION 2.6) + +project(hello_library) + +include_directories( + ${PROJECT_SOURCE_DIR}/inc + ) + +############################################################ +# Create a library +############################################################ + +# Source files to be used in the library +set(library_SOURCES + src/Hello.cpp +) + +#Generate the shared library from the library sources +add_library(hello_library SHARED ${library_SOURCES}) + +############################################################ +# Create an executable +############################################################ + +# Source fles for the binary +set(binary_SOURCES + src/main.cpp +) + +# Add an executable with the above sources +add_executable(hello_binary ${binary_SOURCES}) + +# link the new hello_library target with the hello_binary target +target_link_libraries( hello_binary + hello_library +) \ No newline at end of file diff --git a/01-basic/D-shared-library/README.md b/01-basic/D-shared-library/README.md new file mode 100644 index 0000000..e69de29 diff --git a/01-basic/D-shared-library/inc/Hello.h b/01-basic/D-shared-library/inc/Hello.h new file mode 100644 index 0000000..f838400 --- /dev/null +++ b/01-basic/D-shared-library/inc/Hello.h @@ -0,0 +1,10 @@ +#ifndef __HELLO_H__ +#define __HELLO_H__ + +class Hello +{ +public: + void print(); +}; + +#endif diff --git a/01-basic/D-shared-library/src/Hello.cpp b/01-basic/D-shared-library/src/Hello.cpp new file mode 100644 index 0000000..083c482 --- /dev/null +++ b/01-basic/D-shared-library/src/Hello.cpp @@ -0,0 +1,8 @@ +#include + +#include "Hello.h" + +void Hello::print() +{ + std::cout << "Hello Shared Library!" << std::endl; +} \ No newline at end of file diff --git a/01-basic/D-shared-library/src/main.cpp b/01-basic/D-shared-library/src/main.cpp new file mode 100644 index 0000000..62a1520 --- /dev/null +++ b/01-basic/D-shared-library/src/main.cpp @@ -0,0 +1,8 @@ +#include "Hello.h" + +int main(int argc, char *argv[]) +{ + Hello hi; + hi.print(); + return 0; +} \ No newline at end of file diff --git a/01-basic/README.md b/01-basic/README.md new file mode 100644 index 0000000..91e6647 --- /dev/null +++ b/01-basic/README.md @@ -0,0 +1,10 @@ +# Basic Examples + +The basic examples in this directory show how the setup a cmake project and create an executable. The examples included are + + - hello-cmake. A hello world example. + - hello-headers. A slighly more complicated hello world example, with using Hello class and seperate source and include folders. + - shared-library. An example using a shared library. + - static-library. An example using a static library. + - installing. Shows how to create a 'make install' target to install the binaries and libraries + - build-type. An example showing how to set a default build type of your project. \ No newline at end of file diff --git a/02-sub-projects/README.md b/02-sub-projects/README.md new file mode 100644 index 0000000..6b7868c --- /dev/null +++ b/02-sub-projects/README.md @@ -0,0 +1 @@ +Examples showing how to create sub-projects in different directories \ No newline at end of file diff --git a/03-code-generation/README.md b/03-code-generation/README.md new file mode 100644 index 0000000..be92eb0 --- /dev/null +++ b/03-code-generation/README.md @@ -0,0 +1,3 @@ +Examples showing code generation using various tools. + +Also shows how to move variables from CMAKE into source files (configure_file). \ No newline at end of file diff --git a/04-static-analysis/README.md b/04-static-analysis/README.md new file mode 100644 index 0000000..6501caf --- /dev/null +++ b/04-static-analysis/README.md @@ -0,0 +1 @@ +How to call static analysis tools \ No newline at end of file diff --git a/04-static-analysis/cppcheck/README.md b/04-static-analysis/cppcheck/README.md new file mode 100644 index 0000000..cacc114 --- /dev/null +++ b/04-static-analysis/cppcheck/README.md @@ -0,0 +1 @@ +Example of calling the cppcheck tool \ No newline at end of file diff --git a/README.md b/README.md index dae7938..f1949c7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,35 @@ # cmake-examples -This includes some example cmake configurations which I have picked up when exploring it's usage for various projects +This includes some example cmake configurations which I have picked up when exploring it's usage for various projects. + +These examples have been tested on Ubuntu 14.04 but should work under any Linux system that supports cmake. + +## Requirements + +The basic requirements for most examples are: + + * CMake + * A c++ compiler (defaults to gcc) + * make + +The easiest way to install the above on Ubuntu is as follows + +``` +$ sudo apt-get install cmake +$ sudo apt-get install build-essential +``` + +Some specific examples may require other tools including: + + * boost + ``` + $ sudo apt-get libboost-all-dev + ``` + * protobuf + ``` + $ sudo apt-get install libprotobuf-dev + ``` + * cppcheck + ``` + $ sudo apt-get install cppcheck + ``` + diff --git a/cmake-examples.sublime-project b/cmake-examples.sublime-project new file mode 100644 index 0000000..24db303 --- /dev/null +++ b/cmake-examples.sublime-project @@ -0,0 +1,8 @@ +{ + "folders": + [ + { + "path": "." + } + ] +}