---
title: Creating C language targets
framework: swift-package-manager
role: article
role_heading: Article
path: swift-package-manager/documentation/packagemanagerdocs/creatingclanguagetargets
---

# Creating C language targets

Include C language code as a target in your Swift package.

## Overview

Overview C language targets are structured similarly to Swift targets, with the additional of a directory, commonly named include, to hold public header files. If you use a directory other than include for public headers, declare it using the publicHeadersPath parameter on target. Swift Package manager allows only one valid C language main file for executable targets. For example, it is invalid to have main.c and main.cpp in the same target. Exposing C functions to Swift Swift Package Manager automatically generates a module map for each C language library target for these use cases: If include/Foo/Foo.h exists, Foo is the only directory under the include directory, and the include directory contains no header files, then Swift package manager uses include/Foo/Foo.h as the umbrella header. If include/Foo.h exists and include contains no other subdirectory, then Swift package manager uses include/Foo.h as the umbrella header for the module map. Otherwise, Swift package manager uses the include directory as an umbrella directory; all headers under it are included in the module. In case of complicated include layouts or headers that are not compatible with modules, provide a module.modulemap in the include directory.

## See Also

### Guides

- [Creating a Swift package](swift-package-manager/documentation/packagemanagerdocs/creatingswiftpackage.md)
- [Setting the Swift tools version](swift-package-manager/documentation/packagemanagerdocs/settingswifttoolsversion.md)
- [Adding dependencies to a Swift package](swift-package-manager/documentation/packagemanagerdocs/addingdependencies.md)
- [Resolving and updating dependencies](swift-package-manager/documentation/packagemanagerdocs/resolvingpackageversions.md)
- [Using build configurations](swift-package-manager/documentation/packagemanagerdocs/usingbuildconfigurations.md)
- [Packaging based on the version of Swift](swift-package-manager/documentation/packagemanagerdocs/swiftversionspecificpackaging.md)
- [Bundling resources with a Swift package](swift-package-manager/documentation/packagemanagerdocs/bundlingresources.md)
- [Releasing and publishing a Swift package](swift-package-manager/documentation/packagemanagerdocs/releasingpublishingapackage.md)
- [Generating Software Bill of Materials (SBOM)](swift-package-manager/documentation/packagemanagerdocs/generatingsboms.md)
- [Continuous Integration Workflows](swift-package-manager/documentation/packagemanagerdocs/continuousintegration.md)
- [Plugins](swift-package-manager/documentation/packagemanagerdocs/plugins.md)
- [Module Aliasing](swift-package-manager/documentation/packagemanagerdocs/modulealiasing.md)
- [Using a package registry](swift-package-manager/documentation/packagemanagerdocs/usingswiftpackageregistry.md)
- [Package Collections](swift-package-manager/documentation/packagemanagerdocs/packagecollections.md)
- [Using shell completion scripts](swift-package-manager/documentation/packagemanagerdocs/usingshellcompletion.md)
