# Packing Programs {#pack-programs}

Xmake mainly provides the following three packaging methods for distributing the target program externally:

## Generate local package {#local-package}

Through the `xmake package` command, we can generate a local package with an xmake.lua configuration file, which contains all the target program binaries and can be introduced and used through the `add_requires` package management interface.

The package directory structure is as follows:

```sh
tree build/packages/f/foo/
build/packages/f/foo/
├── macosx
│   └── x86_64
│   └── release
│   ├── include
│   │   └── foo.h
│   └── lib
│   └── libfoo.a
└── xmake.lua
```

This is generally used to distribute binary libraries and for local integration. For more detailed introduction, please refer to the document: [Using Local Packages](/guide/package-management/using-local-packages).

In addition, this method can be used with [built-in macro plugins](/guide/extensions/builtin-plugins#builtin-macros) to achieve universal binary packaging for iOS.

```sh
$ xmake macro package -p iphoneos -a "arm64,x86_64"
$ tree ./build/foo.pkg/
./build/foo.pkg/
├── iphoneos
│   ├── arm64
│   │   └── lib
│   │   └── release
│   │   └── libfoo.a
│   ├── universal
│   │   └── lib
│   │   └── release
│   │   └── libfoo.a
│   └── x86_64
│   └── lib
│   └── release
│   └── libfoo.a
└── xmake.lua
```

## Generate remote package {#remote-package}

We can also use the `xmake package -f` command to generate a remote package for submission to the repository for distribution. This package is similar to a local package and also has an xmake.lua configuration file, but the difference is that it does not directly store binary libraries, but only has a configuration file.

We can submit this package configuration file to the [xmake-repo](https://github.com/xmake-io/xmake-repo) official repository for distribution, or submit it to a self-built private repository.

However, the generated configuration file may not be directly usable. It only generates a rough template. The user still needs to edit and modify it to adjust the corresponding installation and test logic.

For specific details, see the document: [Generate Remote Package](/guide/package-management/package-distribution#generate-package-configuration).

## Generate installation package (XPack) {#xpack}

The last packaging method is the most powerful, implemented through the `xmake pack` plugin command. It is comparable to CMake's CPack packaging and can provide packaging for various system installation packages to achieve the distribution of target programs.

- Windows NSIS binary installation package
- Windows WIX binary installation package
- runself (shell) self-compiled installation package
- zip/tar.gz binary package
- zip/tar.gz source package
- RPM binary installation package
- SRPM source installation package
- DEB binary installation package

It provides a complete packaging configuration mechanism, which can write flexible configuration scripts and generate more customized installation packages—not only binary packages, but also source packages, self-compiled installation packages, and archive packages.

For example, generate Windows NSIS installation packages.

```sh
$ xmake pack -f nsis
```

![](/assets/img/manual/nsis_3.png)

For more details, please refer to the document: [XPack Packaging](/guide/extensions/builtin-plugins#generate-installation-package-xpack).
