Search code examples
rustrust-cargo

How can I build multiple binaries with Cargo?


I'd like to make a project with a daemon and a client, connecting through a unix socket.

A client and a daemon requires two binaries, so how do I tell Cargo to build two targets from two different sources?

To add a bit of fantasy, I'd like to have a library for the main part of the daemon, and just have a binary to wrap around it and communicate through sockets.

So, we have this kind of tree architecture:

├── Cargo.toml
├── target
|   └── debug
|       ├── daemon
│       └── client
└── src
    ├── daemon
    │   ├── bin
    │   │   └── main.rs
    │   └── lib
    │       └── lib.rs
    └── client
        └── bin
            └── main.rs

I could make one executable which manages both concerns, but that's not what I want to do, unless it's very good practice.


Solution

  • You can specify multiple binaries using [[bin]], as mentioned in the Cargo Book

    [[bin]]
    name = "daemon"
    path = "src/daemon/bin/main.rs"
    
    [[bin]]
    name = "client"
    path = "src/client/bin/main.rs"
    

    You can run individual binaries with the cargo run command with the --bin <bin-name> option.

    Tip: If you instead put these files in src/bin/daemon.rs and src/bin/client.rs, you'll get two executables named daemon and client as Cargo compiles all files in src/bin into executables with the same name automatically. You need to specify names and paths like in the snippet above only if you don't follow this convention.