# Example project - CMake Emscripten Project Template
A cross-platform C++ project template using CMake and Emscripten for building native desktop applications and WebAssembly applications that run in web browsers.
## Features
- **Cross-platform**: Builds for both native platforms (Linux, Windows, macOS) and WebAssembly
- **Modern C++**: Uses C++26 standard
- **SDL3**: Graphics and multimedia library for cross-platform development
- **vcpkg**: Package manager for C++ dependencies
- **Emscripten**: Compile C++ to WebAssembly for web deployment
- **Testing**: Integrated with Catch2 testing framework
- **Asset Pipeline**: Automatic data folder preloading for web builds
## Prerequisites
### Required Tools
- **CMake** (version 4.0 or higher)
- **vcpkg** package manager
- **Emscripten SDK** (for WebAssembly builds)
- **C++ Compiler** supporting C++26:
- GCC 14+ or Clang 18+ (Linux/macOS)
- MSVC 2022 (Windows)
### Setup vcpkg
```bash
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh # On Windows: .\bootstrap-vcpkg.bat
```
### Setup Emscripten
```bash
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install latest
./emsdk activate latest
source ./emsdk_env.sh # On Windows: emsdk_env.bat
```
## Project Structure
```
manater/
├── CMakeLists.txt # Main CMake configuration
├── vcpkg.json # Package dependencies
├── serve.py # Development web server
├── src/ # Source code
│ ├── main.cpp # Application entry point
│ └── util/ # Utility modules
├── data/ # Game assets (preloaded in web builds)
│ └── test.txt # Example data file
├── tests/ # Unit tests
└── cmake-build-debug/ # Build output directory
```
## Building
### Native Build (Desktop)
```bash
# Configure with vcpkg
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=[path-to-vcpkg]/scripts/buildsystems/vcpkg.cmake
# Build
cmake --build build
# Run
./build/manater
```
### WebAssembly Build
```bash
# Configure with Emscripten toolchain
emcmake cmake -B build-web -S . -DCMAKE_TOOLCHAIN_FILE=[path-to-vcpkg]/scripts/buildsystems/vcpkg.cmake
# Build
cmake --build build-web
# Serve locally
cd build-web
python3 ../serve.py
```
Then open your browser to `http://localhost:8000`
## Development
### Adding Dependencies
Add new dependencies to `vcpkg.json`:
```json
{
"dependencies": [
"sdl3",
"catch2",
"your-new-dependency"
]
}
```
### Asset Management
- Place game assets in the `data/` folder
- Files in `data/` are automatically preloaded in WebAssembly builds
- Access files using relative paths from the root (e.g., `"test.txt"`)
### Testing
```bash
# Build and run tests
cmake --build build --target tests_manater
./build/tests_manater
```
## Configuration
### Compiler Flags
The project is configured with strict warning levels:
- **MSVC**: `/W4 /WX` (treat warnings as errors)
- **GCC/Clang**: `-Wall -Wextra -Wpedantic -Werror`
### Emscripten Settings
- Output format: HTML with embedded JavaScript and WebAssembly
- Data preloading: Automatically includes `data/` folder
- SDL3 integration: Configured for web compatibility
## Customization
### Project Name
1. Update the `project()` name in `CMakeLists.txt`
2. Update the `name` field in `vcpkg.json`
3. Rename the project folder if desired
### Adding Source Files
Add new source files to the `${PROJECT_NAME}_src` variable in `CMakeLists.txt`:
```cmake
set(${PROJECT_NAME}_src
src/main.cpp
src/your_new_file.cpp
src/util/helper.cpp
)
```
## Troubleshooting
### Common Issues
**vcpkg not found**: Set the `VCPKG_ROOT` environment variable or specify the toolchain file manually.
**Emscripten build fails**: Ensure the Emscripten SDK is properly activated in your shell.
**SDL3 linking errors**: Make sure vcpkg has installed SDL3 for your target platform.
### Web Deployment
For production deployment:
1. Build with release configuration: `-DCMAKE_BUILD_TYPE=Release`
2. Copy the generated `.html`, `.js`, `.wasm`, and `.data` files to your web server
3. Ensure proper MIME types are configured for `.wasm` files
## License
This template is provided as-is for educational and development purposes.
## Contributing
This is a template project. Fork and modify as needed for your specific use case.