Create a Command Line Tool using CMake on macOS
Contents
Create a Command Line Tool using CMake on macOS#
This topic describes the steps needed to configure a CMake project for C++ Command Line Tool. These steps have been verified to work with Xcode 15.0.1, on macOS Ventura 13.5.2.
Test that you have all tools installed#
C++ Compiler (clang):
clang --version
CMake:
cmake --version
ninja:
ninja --version
If you don’t have those tools follow the steps in the Setup C++ development environment on macOS post to configure a C++ development environment.
Create the project directory#
mkdir -p ~/avblocks/cmake/simple-converter
Create the CMake project#
Switch to the project directory:
cd ~/avblocks/cmake/simple-converter
Add src/main.cpp:
#include <iostream>
int main() {
std::cout << "Hello AVBlocks!\n";
}
Add CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)
project(simple-converter)
add_executable(simple-converter 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 simple-converter
simple-converter
├── .gitignore
├── CMakeLists.txt
├── build.sh
└── src
└── main.cpp
Test the build#
chmod +x build.sh
./build.sh
Update for AVBlocks#
Download the 64 bit version of AVBlocks for C++ (macOS). The file you need will have a name similar to
avblocks-v3.1.0-demo.1-darwin.zipexcept for the version number which may be different.Extract the ZIP archive in a location of your choice, then copy the
includeandlibdirectories to theavblockssubdirectory 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:
simple-converter ├── .gitignore ├── CMakeLists.txt ├── avblocks │ ├── include │ └── lib ├── build.sh └── src └── main.cpp
Replace the contents of
.gitignorewith this code:.DS_Store .cache/ build/ avblocks/
Replace the contents of
CMakeLists.txtwith this code:cmake_minimum_required(VERSION 3.16) project(simple-converter) set (target simple-converter) 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++17 -stdlib=libc++) target_compile_options(${target} PRIVATE -m64 -fPIC) target_compile_options(${target} PRIVATE -g) # includes target_include_directories(${target} PUBLIC avblocks/include) # libs target_link_directories(${target} PRIVATE ${PROJECT_SOURCE_DIR}/avblocks/lib/x64) target_link_libraries(${target} libAVBlocks.dylib "-framework CoreFoundation" "-framework AppKit") # sources file(GLOB source "src/*.cpp" "src/*.mm") target_sources(${target} PRIVATE ${source})
Replace the contents of
main.cppwith this code:// // main.cpp // simple-converter // #include <primo/avblocks/avb.h> #include <primo/platform/reference++.h> #include <primo/platform/ustring.h> using namespace primo; using namespace primo::codecs; using namespace primo::avblocks; int main(int argc, const char *argv[]) { Library::initialize(); auto inputFile = primo::ustring(L"AAP.m4v"); auto outputFile = primo::ustring(L"AAP.mp4"); auto inputInfo = primo::make_ref(Library::createMediaInfo()); inputInfo->inputs()->at(0)->setFile(inputFile.u16()); if (inputInfo->open()) { auto inputSocket = primo::make_ref(Library::createMediaSocket(inputInfo.get())); auto outputSocket = primo::make_ref(Library::createMediaSocket(Preset::Video::Generic::MP4::Base_H264_AAC)); outputSocket->setFile(outputFile.u16()); auto transcoder = primo::make_ref(Library::createTranscoder()); transcoder->inputs()->add(inputSocket.get()); transcoder->outputs()->add(outputSocket.get()); if (transcoder->open()) { transcoder->run(); transcoder->close(); } } Library::shutdown(); return 0; }
Build the project
./build.sh
Run the application#
Download the
AAP.m4vHD movie from the Internet Archive and save it in the project directory.Run the application:
./build/debug/simple-converter
Wait for the Transcoder to finish - it will take a few minutes. The converted file
AAP.mp4will be in the project directory.
Troubleshooting#
transcoder->open()may fail if there is already a fileAAP.mp4in the project directory. DeleteAAP.mp4to solve that.