Create a Command Line Tool using CMake on Ubuntu
Contents
Create a Command Line Tool using CMake on Ubuntu#
This topic describes the steps needed to configure a CMake project for C++ Command Line Tool. These steps have been verified to work on Ubuntu 22.04.3 LTS.
Test that you have all tools installed#
C++ Compiler (g++):
g++ --version
CMake:
cmake --version
ninja:
ninja --version
If you don’t have those tools follow the steps in the Setup C++ development environment on Ubuntu post to configure a C++ development environment.
Create the project directory#
mkdir -p ~/primoburner/cmake/enum-devices
Create the CMake project#
Switch to the project directory:
cd ~/primoburner/cmake/enum-devices
Add src/main.cpp:
#include <iostream>
int main() {
std::cout << "Hello PrimoBurner!\n";
}
Add CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)
project(enum-devices)
add_executable(enum-devices src/main.cpp)
Add build.sh:
#!/usr/bin/env bash
mkdir -p ./build/debug
pushd ./build/debug
cmake -G 'Ninja' -DCMAKE_BUILD_TYPE=Debug ../.. && \
ninja
ret=$?
popd
Add .gitignore:
.DS_Store
.cache/
build/
You should end up with the following directory structure:
tree -a -L 2 enum-devices
enum-devices
├── .gitignore
├── CMakeLists.txt
├── build.sh
└── src
└── main.cpp
Test the build#
chmod +x build.sh
./build.sh
Update for PrimoBurner#
Download the 64 bit version of PrimoBurner for C++ (Linux). The file you need will have a name similar to
primoburner-v5.0.1-demo.1-linux.tar.gzexcept for the version number which may be different.Extract the archive in a location of your choice, then copy the
includeandlibdirectories to theprimoburnersubdirectory of the CMake project directory. The CMake project directory is the directory that contains theCMakeLists.txtfile.You should end up with a directory structure similar to the following:
enum-devices ├── .gitignore ├── CMakeLists.txt ├── primoburner │ ├── include │ └── lib ├── build.sh └── src └── main.cpp
Replace the contents of
.gitignorewith this code:.DS_Store .cache/ build/ primoburner/
Replace the contents of
CMakeLists.txtwith this code:cmake_minimum_required(VERSION 3.16) project(enum-devices) set (target enum-devices) add_executable(${target}) # definitions for Debug x64 target_compile_definitions(${target} PUBLIC _DEBUG) # compile options for Debug x64 target_compile_options(${target} PRIVATE -std=c++20 -MMD -MP -MF) target_compile_options(${target} PRIVATE -m64 -fPIC) target_compile_options(${target} PRIVATE -g) # includes target_include_directories(${target} PUBLIC primoburner/include) # libs target_link_directories(${target} PRIVATE ${PROJECT_SOURCE_DIR}/primoburner/lib/x64) target_link_libraries(${target} libPrimoBurner64.so) # sources file(GLOB source "src/*.cpp") target_sources(${target} PRIVATE ${source})
Replace the contents of
main.cppwith this code:// // main.cpp // enum-devices // #include <iostream> #include <primo/burner/pb.h> #include <primo/platform/ustring.h> #include <primo/platform/reference++.h> namespace p = primo; namespace pb = primo::burner; int main(int argc, const char * argv[]) { // Create engine auto engine = p::make_ref(pb::Library::createEngine()); // Initialize engine engine->initialize(); // create device enumerator auto enumerator = p::make_ref(engine->createDeviceEnumerator()); for (int i = 0; i < enumerator->count(); i++) { // create a device; do not ask for exclusive access auto device = p::make_ref(enumerator->createDevice(i, false)); if (device) { using namespace std; auto description = p::ustring(device->description()); cout << "Device : " << i << endl; cout << "Description : " << description.str() << endl; cout << endl; } } // terminate engine engine->shutdown(); return 0; }
Build the project
./build.sh
Run the application#
./build/debug/enum-devices