Sources
GPBT uses a convention-based directory layout to discover source files automatically. In most cases you do not need to call any source management API at all: the build tool finds everything it needs from the structure of the target's directory.
Directory layout convention
Each target's directory is expected to follow this structure:
my-module/
CMakeLists.txt
public/ <- headers exposed to dependents (PUBLIC)
internal/ <- headers shared across modules (INTERNAL)
private/ <- implementation sources and private headers
GPBT automatically globs for .cpp, .c, .cc, and .cxx files in private/ and internal/ and adds them as sources. Header files (.h, .hpp, .hxx) in public/, internal/, and private/ are also discovered and included in the IDE's file list for navigation.
See Include Directories for how these directories affect which include paths are exposed to dependents.
Automatic discovery behaviour
Source file discovery uses CMake's file(GLOB_RECURSE ...) internally. By default, GPBT_CONFIGURE_DEPENDS=ON instructs CMake to re-run the configure step when files are added to or removed from a globbed directory.
Keep GPBT_CONFIGURE_DEPENDS=ON during development. Disable it in CI environments where the source tree does not change between configure and build, since filesystem polling adds latency to the configure step.
Adding sources explicitly
When you need to include a file that is not in the standard layout, use gpAddSourceFile():
gpStartModule("platform/win32")
gpAddSourceFile(private/Win32.cpp)
gpAddSourceFile(${CMAKE_CURRENT_LIST_DIR}/generated/Bindings.cpp)
gpEndModule()
Paths are relative to the target directory (the directory containing the CMakeLists.txt) unless they are absolute.
Adding a source directory
To add all sources in a directory recursively:
gpStartModule("core")
gpAddSourceDirectory(extra-sources)
gpEndModule()
Adding sources by pattern
To add files matching a glob pattern:
gpStartModule("audio")
gpAddSourcePattern("private/**/*.gen.cpp")
gpEndModule()
Excluding sources
To remove a file from the automatically discovered set, use the corresponding gpExclude* macro:
gpStartModule("renderer")
gpExcludeSourceFile(private/LegacyPath.cpp)
gpExcludeSourceDirectory(private/deprecated)
gpExcludeSourcePattern("private/**/*.old.cpp")
gpEndModule()
Exclusions apply after auto-discovery. They have no effect on files added explicitly with gpAddSourceFile().
API summary
| Macro | Description |
|---|---|
gpAddSourceFile(files...) | Add specific files by path |
gpAddSourceDirectory(dirs...) | Add all sources found recursively under a directory |
gpAddSourcePattern(patterns...) | Add sources matching a glob pattern |
gpExcludeSourceFile(files...) | Remove specific files from the discovered set |
gpExcludeSourceDirectory(dirs...) | Remove all sources under a directory |
gpExcludeSourcePattern(patterns...) | Remove sources matching a glob pattern |