A cross-platform C++ build system designed to simplify and accelerate multi-platform development.
- π Fast cross-platform C++ builds for Android, iOS, macOS, Windows, Linux, and OpenHarmony (OHOS)
- ποΈ Kotlin Multiplatform (KMP) support
- π¦ Conan C/C++ package manager integration
- π§ͺ Integrated testing with GoogleTest
- π Benchmarking support with Google Benchmark
- π Documentation generation
- π οΈ Project scaffolding from templates
- β Environment dependency checking
- π§Ή Smart build artifact cleaning
# Install from PyPI
pip3 install ccgo
# Or install from source in development mode
cd ccgo
pip3 install -e .# Create a new C++ library project
ccgo new my-awesome-lib
# Navigate to the project directory
cd my-awesome-lib/<project_relative_path>
# Build for Android
ccgo build android
# Run tests
ccgo test
# Build documentation
ccgo doc --openCreate a new library project in a new directory.
ccgo new <project-name> [options]Options:
--template-url <url>- Custom template repository URL--data <key>=<value>- Template variables (repeatable)--defaults- Use default values for all prompts
Examples:
# Create with interactive prompts
ccgo new my-project
# Create with all defaults
ccgo new my-project --defaults
# Use custom template
ccgo new my-project --template-url https://github.com/user/template.git
ccgo new my-project --template-url /path/to/user/template
# Set template variables
ccgo new my-project --data cpy_project_version=2.0.0Initialize a library project in the current directory.
ccgo init [options]Options:
--template-url <url>- Custom template repository URL--data <key>=<value>- Template variables (repeatable)--defaults- Use default values for all prompts--force- Skip confirmation prompt
Examples:
ccgo init
ccgo init --defaults --forceBuild your library for specific platforms.
ccgo build <target> [options]Targets:
android- Build for Android (supports--arch)ios- Build for iOSmacos- Build for macOSwindows- Build for Windowslinux- Build for Linuxohos- Build for OpenHarmony (supports--arch)kmp- Build Kotlin Multiplatform libraryconan- Build Conan C/C++ packageinclude- Build include headers
Options:
--arch <architectures>- Comma-separated architecture list (Android/OHOS only)- Android:
armeabi-v7a,arm64-v8a,x86_64 - OHOS:
armeabi-v7a,arm64-v8a,x86_64
- Android:
--link-type <type>- Library link type:static,shared, orboth(default:both)--toolchain <toolchain>- Windows toolchain:auto,msvc, ormingw(default:auto)--ide-project- Generate IDE project files--docker- Build using Docker (cross-platform builds)
Examples:
# Build for Android with specific architectures
ccgo build android --arch armeabi-v7a,arm64-v8a
# Build for OHOS with all architectures
ccgo build ohos --arch armeabi-v7a,arm64-v8a,x86_64
# Build for iOS
ccgo build ios
# Build for macOS
ccgo build macos
# Build for Windows
ccgo build windows
# Build for Windows with specific toolchain
ccgo build windows --toolchain msvc
ccgo build windows --toolchain mingw
# Build for Linux
ccgo build linux
# Build static libraries only
ccgo build linux --link-type static
# Build shared libraries only
ccgo build macos --link-type shared
# Build both static and shared libraries (default)
ccgo build ios --link-type both
# Build Kotlin Multiplatform library
ccgo build kmp
# Build Conan C/C++ package
ccgo build conan
# Generate IDE project for Android
ccgo build android --ide-project
# Cross-platform build using Docker
ccgo build linux --docker
ccgo build windows --dockerBuild and run GoogleTest-based unit tests.
ccgo test [options]Options:
--build-only- Only build tests without running--run-only- Only run tests (assumes already built)--filter <pattern>- GoogleTest filter (e.g., 'MyTest*')--ide-project- Generate IDE project for tests--gtest-args <args>- Additional GoogleTest arguments
Examples:
# Build and run all tests
ccgo test
# Only build tests
ccgo test --build-only
# Run specific tests
ccgo test --filter "MyTest*"
# Run tests multiple times
ccgo test --gtest-args "--gtest_repeat=3"
# Generate IDE project for debugging tests
ccgo test --ide-projectBuild and run Google Benchmark-based performance benchmarks.
ccgo bench [options]Options:
--build-only- Only build benchmarks without running--run-only- Only run benchmarks (assumes already built)--filter <pattern>- Google Benchmark filter (e.g., 'BM_Sort*')--ide-project- Generate IDE project for benchmarks--benchmark-args <args>- Additional Google Benchmark arguments--format <format>- Output format:console,json,csv(default: console)
Examples:
# Build and run all benchmarks
ccgo bench
# Only build benchmarks
ccgo bench --build-only
# Run specific benchmarks
ccgo bench --filter "BM_Sort*"
# Output results as JSON
ccgo bench --format json
# Output results as CSV
ccgo bench --format csvGenerate project documentation (typically using Doxygen).
ccgo doc [options]Options:
--open- Open documentation in browser after building--serve- Start local web server to view documentation--port <port>- Port for web server (default: 8000)--clean- Clean build before generating
Examples:
# Build documentation
ccgo doc
# Build and open in browser
ccgo doc --open
# Build and serve on localhost:8000
ccgo doc --serve
# Serve on custom port
ccgo doc --serve --port 3000
# Clean build
ccgo doc --cleanPublish your library to package repositories.
ccgo publish <target>Targets:
android- Publish to Maven repositoryohos- Publish to OHPM repositorykmp- Publish KMP library to Maven (local or remote)
Examples:
# Publish Android library to Maven
ccgo publish android
# Publish OHOS library to OHPM
ccgo publish ohos
# Publish Kotlin Multiplatform library
ccgo publish kmpVerify that platform-specific development dependencies are installed.
ccgo check [target] [options]Targets:
all- Check all platforms (default)android- Check Android development environmentios- Check iOS development environmentmacos- Check macOS development environmentwindows- Check Windows development environmentlinux- Check Linux development environmentohos- Check OpenHarmony development environment
Options:
--verbose- Show detailed information
Examples:
# Check all platforms
ccgo check
# Check Android environment
ccgo check android
# Check with verbose output
ccgo check ios --verboseRemove build artifacts and caches.
ccgo clean [target] [options]Targets:
all- Clean all platforms (default)android- Clean Android build cachesios- Clean iOS build cachesmacos- Clean macOS build cachesohos- Clean OpenHarmony build cacheskmp- Clean Kotlin Multiplatform build cachesexamples- Clean examples build caches
Options:
--native-only- Clean onlycmake_build/(native CMake builds)--dry-run- Show what would be cleaned without deleting-y, --yes- Skip confirmation prompts
Examples:
# Clean all (with confirmation)
ccgo clean
# Clean only Android
ccgo clean android
# Preview what will be deleted
ccgo clean --dry-run
# Clean all without confirmation
ccgo clean -y
# Clean only native CMake builds
ccgo clean --native-onlyDisplay comprehensive help information.
ccgo help
# Or get help for specific command
ccgo <command> --helpANDROID_HOME- Android SDK locationANDROID_NDK_HOME- Android NDK locationJAVA_HOME- Java Development Kit location
OHOS_SDK_HOMEorHOS_SDK_HOME- OHOS Native SDK location
- Requires Xcode and command-line tools
Projects created with ccgo follow this structure:
my-project/
βββ CCGO.toml # CCGO project config
βββ CMakeLists.txt # Root CMake configuration
βββ src/ # Source code
βββ include/ # Public headers
βββ docs/ # docs files
βββ tests/ # GoogleTest unit tests
βββ benches/ # Benchmark tests
βββ android/ # Android-specific files (Gradle)
βββ ohos/ # OHOS-specific files (hvigor)
βββ kmp/ # Kotlin Multiplatform files (Gradle)
When you run ccgo build <target>, the output is placed in target/{debug|release}/<platform>/ with a unified archive structure.
{PROJECT}_{PLATFORM}_SDK-{version}[-{suffix}].zip # Main SDK archive
{PROJECT}_{PLATFORM}_SDK-{version}[-{suffix}]-SYMBOLS.zip # Debug symbols archive
Examples:
MYLIB_ANDROID_SDK-1.0.0-release.zipMYLIB_IOS_SDK-1.0.0-beta.5-dirty.zipMYLIB_LINUX_SDK-2.1.0-SYMBOLS.zip
All platforms follow the same archive structure:
{PROJECT}_{PLATFORM}_SDK-{version}.zip
βββ lib/{platform}/
β βββ static/ # Static libraries (.a, .lib)
β β βββ [{arch}/] # Architecture subdirectory (if multi-arch)
β β βββ lib{name}.a
β βββ shared/ # Shared libraries (.so, .dylib, .dll)
β βββ [{arch}/]
β βββ lib{name}.so
βββ include/{project}/ # Public header files
β βββ **/*.h
βββ haars/{platform}/ # Platform packages (Android AAR / OHOS HAR)
β βββ {PROJECT}_{PLATFORM}_SDK-{version}.aar
βββ meta/{platform}/ # Metadata files
βββ build_info.json # Build information
βββ archive_info.json # Archive file listing
ccgo build android [--arch armeabi-v7a,arm64-v8a,x86_64]Output: target/{debug|release}/android/
| File | Description |
|---|---|
MYLIB_ANDROID_SDK-{version}.zip |
Main SDK archive |
MYLIB_ANDROID_SDK-{version}-SYMBOLS.zip |
Debug symbols (unstripped .so) |
MYLIB_ANDROID_SDK-{version}.aar |
Android Archive (standalone) |
SDK Contents:
βββ lib/android/static/{arch}/lib{name}.a
βββ lib/android/shared/{arch}/lib{name}.so
βββ include/{project}/**/*.h
βββ haars/android/*.aar
βββ meta/android/build_info.json
ccgo build iosOutput: target/{debug|release}/ios/
| File | Description |
|---|---|
MYLIB_IOS_SDK-{version}.zip |
Main SDK archive |
MYLIB_IOS_SDK-{version}-SYMBOLS.zip |
Debug symbols (dSYM) |
SDK Contents:
βββ lib/ios/static/{name}.xcframework/
βββ lib/ios/shared/{name}.xcframework/
βββ include/{project}/**/*.h
βββ meta/ios/build_info.json
Architectures: arm64 (device), arm64-simulator, x86_64-simulator
ccgo build macosOutput: target/{debug|release}/macos/
| File | Description |
|---|---|
MYLIB_MACOS_SDK-{version}.zip |
Main SDK archive |
MYLIB_MACOS_SDK-{version}-SYMBOLS.zip |
Debug symbols (dSYM) |
SDK Contents:
βββ lib/macos/static/{name}.xcframework/
βββ lib/macos/shared/{name}.xcframework/
βββ include/{project}/**/*.h
βββ meta/macos/build_info.json
Architectures: Universal binary (arm64 + x86_64)
ccgo build tvosOutput: target/{debug|release}/tvos/
SDK Contents:
βββ lib/tvos/static/{name}.xcframework/
βββ lib/tvos/shared/{name}.xcframework/
βββ include/{project}/**/*.h
βββ meta/tvos/build_info.json
Architectures: arm64 (device), arm64-simulator
ccgo build watchosOutput: target/{debug|release}/watchos/
SDK Contents:
βββ lib/watchos/static/{name}.xcframework/
βββ lib/watchos/shared/{name}.xcframework/
βββ include/{project}/**/*.h
βββ meta/watchos/build_info.json
Architectures: arm64_32, armv7k (device), arm64-simulator
ccgo build linuxOutput: target/{debug|release}/linux/
| File | Description |
|---|---|
MYLIB_LINUX_SDK-{version}.zip |
Main SDK archive |
MYLIB_LINUX_SDK-{version}-SYMBOLS.zip |
Debug symbols (unstripped .so) |
SDK Contents:
βββ lib/linux/static/lib{name}.a
βββ lib/linux/shared/lib{name}.so
βββ include/{project}/**/*.h
βββ meta/linux/build_info.json
Architecture: x86_64
ccgo build windows [--toolchain auto|msvc|mingw]Output: target/{debug|release}/windows/
| File | Description |
|---|---|
MYLIB_WINDOWS_SDK-{version}.zip |
Main SDK archive |
SDK Contents (MinGW):
βββ lib/windows/static/lib{name}.a
βββ lib/windows/shared/{name}.dll
βββ lib/windows/shared/lib{name}.dll.a # Import library
βββ include/{project}/**/*.h
βββ meta/windows/build_info.json
SDK Contents (MSVC):
βββ lib/windows/static/{name}.lib
βββ lib/windows/shared/{name}.dll
βββ lib/windows/shared/{name}.lib # Import library
βββ include/{project}/**/*.h
βββ meta/windows/build_info.json
Architecture: x86_64
ccgo build ohos [--arch armeabi-v7a,arm64-v8a,x86_64]Output: target/{debug|release}/ohos/
| File | Description |
|---|---|
MYLIB_OHOS_SDK-{version}.zip |
Main SDK archive |
MYLIB_OHOS_SDK-{version}-SYMBOLS.zip |
Debug symbols (unstripped .so) |
MYLIB_OHOS_SDK-{version}.har |
Harmony Archive (standalone) |
SDK Contents:
βββ lib/ohos/static/{arch}/lib{name}.a
βββ lib/ohos/shared/{arch}/lib{name}.so
βββ include/{project}/**/*.h
βββ haars/ohos/*.har
βββ meta/ohos/build_info.json
ccgo build conanOutput: target/{debug|release}/conan/
SDK Contents:
βββ lib/conan/static/lib{name}.a
βββ lib/conan/shared/lib{name}.so
βββ include/{project}/**/*.h
βββ meta/conan/build_info.json
Contains build metadata:
{
"project": "mylib",
"platform": "android",
"version": "1.0.0",
"link_type": "both",
"build_time": "2024-01-15T10:30:00.123456",
"build_host": "Darwin",
"architectures": ["arm64-v8a", "armeabi-v7a", "x86_64"],
"git_commit": "abc1234",
"git_branch": "main"
}Contains file listing with sizes:
{
"archive_metadata": {
"version": "1.0",
"generated_at": "2024-01-15T10:30:00Z",
"archive_name": "MYLIB_ANDROID_SDK-1.0.0.zip",
"archive_size": 1234567
},
"files": [
{"path": "lib/android/shared/arm64-v8a/libmylib.so", "size": 123456}
],
"summary": {
"total_files": 10,
"total_size": 500000,
"library_count": 6,
"platforms": ["android"],
"architectures": ["arm64-v8a", "armeabi-v7a", "x86_64"]
}
}The following files are automatically excluded from archives:
CPPLINT.cfg.clang-format.clang-tidy
You can create projects from custom templates:
# From GitHub repository
ccgo new my-project --template-url=https://github.com/user/my-template.git
# From local directory
ccgo new my-project --template-url=/path/to/local/templateThe generated build.py script supports CI/CD workflows with environment variables:
CI_IS_RELEASE- Build as release vs betaCI_BUILD_<PLATFORM>- Enable/disable platform builds
Example:
export CI_IS_RELEASE=1
export CI_BUILD_ANDROID=1
export CI_BUILD_IOS=1
python3 build.pyBuild for multiple architectures simultaneously:
# Android: build for 32-bit ARM, 64-bit ARM, and x86_64
ccgo build android --arch armeabi-v7a,arm64-v8a,x86_64
# OHOS: build for all supported architectures
ccgo build ohos --arch armeabi-v7a,arm64-v8a,x86_64-
"Command not found" after installation
- Ensure
pip3install directory is in your PATH - Try
python3 -m ccgoinstead ofccgo
- Ensure
-
Android build fails
- Verify
ANDROID_HOME,ANDROID_NDK_HOME, andJAVA_HOMEare set - Run
ccgo check android --verboseto diagnose
- Verify
-
OHOS build fails
- Verify
OHOS_SDK_HOMEorHOS_SDK_HOMEis set - Run
ccgo check ohos --verboseto diagnose
- Verify
-
iOS/macOS build fails
- Ensure Xcode and command-line tools are installed
- Run
xcode-select --installif needed
Contributions are welcome! Please feel free to submit a Pull Request.
ccgo is available under the MIT license. See the LICENSE file for the full license text.