# Build and Pave Quickstart

This document captures the common-case workflow for building and deploying
Fuchsia onto a device using `fx` development commands. Most such commands
have options for less common situations; see `fx help <command>` for details.

## Initial Build and Deploy

The initial build and deploy workflow using `fx` is as follows:

1.  `fx set core.x64`
    Configures the build to build the "core" product on a generic x64 board.
    See `fx list-products` and `fx list-boards` for lists of available products
    and boards, respectively.
1.  `fx build`
    Builds Zircon, then the rest of Fuchsia.
1.  `fx mkzedboot <usb_drive_device_path>`
    Builds the Zedboot media and installs to the USB drive target. See below
    for notes on obtaining the USB drive device path.
1.  `fx pave`
    Starts the bootserver.
1.  Attach Zedboot USB to device and reboot.
    Zedboot will connect to the host, download the pave image, and pave the
    device.

### USB drive device path

Instructions for determining the correct path to your USB drive are as follows,
depending on the host OS. In either case, you can run the command once with the
USB drive disconnected, then run again with it connected, to see the
difference.

* Linux users:
  - `sudo fdisk -l`
    Drives are usually of the form /dev/sd[x], e.g. '/dev/sdc'. Select
    the drive rather than a specific partition.
* Mac users:
  - `diskutil list | grep external`
    Drives are usually of the form /dev/disk[n], e.g. '/dev/disk2'.
  - If you see 'ERROR: Can't open /dev/disk[n]: Resource busy'
    then you will have to unmount the usb drive.
    For this run `hdiutil unmount /dev/disk[n]`.
    If this does not fix the error, try reformating the drive:
    `diskutil eraseDisk JHFSX <name_of_the_usb_stick> /dev/disk[n]`.

## Subsequent Build and Deploy

The workflow for re-building and re-deploying using `fx` is slightly different:

1.  Check the [build dashboard](https://luci-milo.appspot.com/p/fuchsia).
    Helps ensure that HEAD is in a good state to pull.
1.  `jiri update`
    Fetches the latest code.
1.  `fx build`
    Builds Zircon, then the rest of Fuchsia.
1.  `fx setup-macos` Sets up firewall rules (Mac users ONLY)
1.  `fx serve`
    Starts a development package server on the host.
1.  Boot the device *without* Zedboot USB attached.
    Boots the device into its last-paved state.
1.  `fx ota`
    Pushes updated packages to the device.

NOTE: If desired, the device can be re-paved using Zedboot USB as per steps 4-5
in the previous section. This is slower, but may be necessary in some cases
where the system handles the OTA less than gracefully.

## Troubleshooting

1.  Having '.' in your PATH may cause `fx build` to fail.  The script will
    change the working directory such that it may create conflicts between the
    commands it uses (e.g. `touch`) and the binaries in the working directory.
