# Compilation and Building Overview
- [Basic Concepts](#section175012297491)
- [Usage Guidelines](#section193961322175011)
- [Limitations and Constraints](#section2029921310472)
The compilation and building subsystem is a building framework based on Generate Ninja \(GN\) and Ninja, which supports component-based OpenHarmony development. This subsystem can be used to:
- Build existing products.
- Build chipset source code independently.
- Build a single component independently.
## Basic Concepts
It is considered best practice to learn the following basic concepts before you start development and building:
- **Component**
A component is a reusable software unit that can contain source code, configuration files, resource files, and compilation scripts.
- **GN**
GN is short for Generate Ninja, which is used to generate Ninja files.
- **Ninja**
Ninja is a small high-speed building system.
## Usage Guidelines
1. **Building Process**
[Figure 1](#fig9744112715161) shows the building process.
**Figure 1** Building process

1. **hb set**: Set the OpenHarmony source code directory and the product to build.
2. **hb build**: Build the product, development board, or component. The process to build the solution is as follows:
- **Reading configuration**: Read the development board configuration, which covers the toolchain, linking commands, and compilation options.
- **Running gn**: Run the **gn gen** command to read the product configuration \(related to the development board, kernel, and system components\) and generate the **out** directory and **ninja** files for the solution.
- **Running Ninja**: Run **ninja -C out/company/product** to start compilation.
- **Packaging**: Package the compilation result to create a file system image.
2. **Building Commands**
1. **hb set**
```
hb set -h
usage: hb set [-h] [-root [ROOT_PATH]] [-p]
optional arguments:
-h, --help show this help message and exit
-root [ROOT_PATH], --root_path [ROOT_PATH]
Set OHOS root path
-p, --product Set OHOS board and kernel
```
- If you run **hb set** with no argument, the default setting process starts.
- You can run **hb set -root** _dir_ to set the root directory of the source code.
- **hb set -p** is used to set the product to compile.
2. **hb env**
View the current configuration.
```
hb env
[OHOS INFO] root path: xxx
[OHOS INFO] board: hispark_taurus
[OHOS INFO] kernel: liteos
[OHOS INFO] product: ipcamera
[OHOS INFO] product path: xxx/vendor/hisilicon/ipcamera
[OHOS INFO] device path: xxx/device/hisilicon/hispark_taurus/sdk_linux_4.19
```
3. **hb build**
```
hb build -h
usage: hb build [-h] [-b BUILD_TYPE] [-c COMPILER] [-t [TEST [TEST ...]]]
[--dmverity] [-p PRODUCT] [-f] [-n]
[component [component ...]]
positional arguments:
component name of the component
optional arguments:
-h, --help show this help message and exit
-b BUILD_TYPE, --build_type BUILD_TYPE
release or debug version
-c COMPILER, --compiler COMPILER
specify compiler
-t [TEST [TEST ...]], --test [TEST [TEST ...]]
compile test suite
--dmverity Enable dmverity
-p PRODUCT, --product PRODUCT
build a specified product with
{product_name}@{company}, eg: ipcamera@hisilcon
-f, --full full code compilation
```
- If you run **hb build** with no argument, the previously configured code directory, product, and options are used for the compilation. The **-f** option will delete all products to be compiled, which is equivalent to running **hb clean** and **hb build**.
- You can run **hb build** _\{component\_name\}_ to compile product components separately based on the development board and kernel set for the product, for example, **hb build kv\_store**.
- You can run **hb build -p ipcamera@hisilicon** to skip the setting step and compile the product directly.
- You can run **hb build** in **device/device\_company/board** to select the kernel and start compilation based on the current development board and the selected kernel to generate an image that contains the kernel and driver only.
4. **hb clean**
Clear the compilation result of the product in the **out** directory, and retain the **args.gn** and **build.log** files only. To clear files in a specified directory, add the directory parameter to the command, for example, **hb clean** _xxx_**/out/**_xxx_.
```
hb clean
usage: hb clean [-h] [out_path]
positional arguments:
out_path clean a specified path.
optional arguments:
-h, --help show this help message and exit
```
## Limitations and Constraints
Ensure that the development environment has GN and Ninja, Python 3.7.4 and later, and hb commands. You must download the complete code before you start.