# Frequently Asked Questions
## Build System and CMake Configuration
### How do I add a new file to CMake?
If you forget to add a new file to the CMake configuration, you may end up with
undefined symbol errors at link time.
There should be a `CMakeLists.txt` in the directory where you added the new
file, which has the list of different .h/.cpp files to be included in the build.
Add your new file to that list.
### How do I speed up iterating on changes to the build system?
The general idea is to build as little as you can.
- [Use `sccache`](/docs/HowToGuides/GettingStarted.md) or `ccache` if you
aren't doing so already.
- Use `build-script`'s various `--skip-*` flags to skip configuring for
platforms that you do not care about.
- If you're on macOS, use `--swift-darwin-supported-archs "$(uname -m)"`.
- Build the release variant without assertions (`--release --no-assertions`).
While debug info and assertions are valuable to enable when working on the
toolchain itself, they are not so useful if you are working only on changes
to the build system.
## Using a Locally Built Toolchain
### How do I use a locally built compiler to build X?
You can use the `SWIFT_EXEC` environment variable to use a locally
built compiler to compile both packages and Xcode projects.
1. For SwiftPM packages, pass the environment variable when invoking SwiftPM.
```sh
# Assuming the current working directory contains the package, build the
# package using a custom compiler.
SWIFT_EXEC=/path/to/swiftc swift build
```
2. For Xcode projects, select the project in the Project Navigator. In the
Build Settings tab, click '+' and then 'Add User-Defined Setting'.
Create a build setting `SWIFT_EXEC` with the value set to `/path/to/swiftc`.
If you now do a clean build, your locally built compiler will be used.
At the time of writing, in the latest Xcode 12.2 beta 3, `SWIFT_EXEC` does not
work for SwiftPM integration inside Xcode, so this will not work for Xcode
projects that depend on SwiftPM packages.
**Note:** Even thought the variable says 'SWIFT', it needs to point to
'swift**c**', not 'swift'. The extra 'c' is not a typo.
## Testing and CI
### How do I reproduce/fix a test that fails in CI but passes for me locally?
TODO: Write some tips here, point to Testing.md for simulator setup.
## Documentation
### Where can I find documentation on X?
This very depends on what X is, but some broad guidelines are:
1. Do a case-insensitive recursive string search.
- Use a specialized tool like [ripgrep](https://github.com/BurntSushi/ripgrep)
or [ag](https://github.com/ggreer/the_silver_searcher).
- Use `git grep --ignore-case "mypattern"`. `git grep` also supports helpful
flags which provide more context:
- `--show-function`: Tries to print the function name that a match was
found in.
- `--function-context`: Tries to print the entire surrounding function
containing the match.
- Use 'Find in Workspace' in Xcode (⌘+⇧+F).
- Use `grep --ignore-case --recursive "mypattern" .`.
2. Go through the [Documentation Index](/docs/README.md).
### How do I build the documentation as HTML?
You can build the ReST formatted documentation as HTML using Sphinx. Follow
[Sphinx's installation instructions][] and check that `sphinx-build` is
available on your `PATH`:
[Sphinx's installation instructions]: https://www.sphinx-doc.org/en/master/usage/installation.html
```sh
sphinx-build --version
```
If that succeeds, you can build the documentation using `make`
```sh
make -C docs
```
(Tested with `sphinx-build` version 3.2.1.)
This compiles the `.rst` files in the `docs` directory into HTML in the
`docs/_build/html` directory.
For the Markdown documentation, you can view the rendered HTML directly on
GitHub. For example, this file is rendered on GitHub at
https://github.com/apple/swift/tree/main/docs/HowToGuides/FAQ.md .
HTML documentation for the standard library on Darwin platforms is hosted on the
[Apple Developer website](https://developer.apple.com/documentation/swift/swift_standard_library).
## Pull Request Workflow
### How do I format my changes?
First, install `clang-format` using your system's package manager. This should
also install the `git-clang-format` script (try `git-clang-format --help`).
In case it doesn't, you can replace `git-clang-format` in the following
commands with `../llvm-project/clang/tools/clang-format/git-clang-format`.
Start out at the tip of the branch where you want to reformat the commits.
```
# If there is only one commit that needs to be reformatted.
git-clang-format HEAD~1
git add .
git commit --amend --no-edit
# Say the last N commits need to be reformatted.
# Mark them as 'edit' instead of 'pick'.
git rebase -i HEAD~N
# Re-run N times, reformatting each commit.
git-clang-format HEAD~1
git add .
git commit --amend --no-edit
git rebase --continue
```
### How do I clean up my git history?
TODO: Link to a beginner-friendly external resource, or (less preferably)
describe basic usage of rebase here.