1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use std::path::{Path, PathBuf};

#[derive(Debug, Clone)]
pub struct Probe {
    pub prefix: PathBuf,
    pub include_dirs: IncludeDirs,
    pub lib_dirs: LibDirs,
}

#[derive(Debug, Clone)]
pub struct IncludeDirs {
    pub carla_source: PathBuf,
    pub carla_third_party: PathBuf,
    pub recast: PathBuf,
    pub rpclib: PathBuf,
    pub boost: PathBuf,
    pub libpng: PathBuf,
}

#[derive(Debug, Clone)]
pub struct LibDirs {
    pub recast: PathBuf,
    pub rpclib: PathBuf,
    pub boost: PathBuf,
    pub libpng: PathBuf,
    pub libcarla_client: PathBuf,
}

impl IncludeDirs {
    pub fn into_vec(self) -> Vec<PathBuf> {
        let Self {
            recast,
            rpclib,
            boost,
            libpng,
            carla_source,
            carla_third_party,
        } = self;
        vec![
            recast,
            rpclib,
            libpng,
            boost,
            carla_source,
            carla_third_party,
        ]
    }
}

impl LibDirs {
    pub fn into_vec(self) -> Vec<PathBuf> {
        let Self {
            recast,
            rpclib,
            boost,
            libpng,
            libcarla_client,
        } = self;
        vec![recast, rpclib, libpng, boost, libcarla_client]
    }
}

pub fn probe(carla_src_dir: &Path) -> Probe {
    let carla_source_dir = carla_src_dir.join("LibCarla").join("source");
    let carla_third_party_dir = carla_source_dir.join("third-party");
    let build_dir = carla_src_dir.join("Build");
    let recast_dir = build_dir.join("recast-0b13b0-c10-install");
    let rpclib_dir = build_dir.join("rpclib-v2.2.1_c5-c10-libstdcxx-install");
    let boost_dir = build_dir.join("boost-1.80.0-c10-install");
    let libpng_dir = build_dir.join("libpng-1.6.37-install");
    let libcarla_client_lib_dir = build_dir
        .join("libcarla-client-build.release")
        .join("LibCarla")
        .join("cmake")
        .join("client");

    let include_dirs = IncludeDirs {
        carla_source: carla_source_dir,
        carla_third_party: carla_third_party_dir,
        recast: recast_dir.join("include"),
        rpclib: rpclib_dir.join("include"),
        boost: boost_dir.join("include"),
        libpng: libpng_dir.join("include"),
    };
    let lib_dirs = LibDirs {
        recast: recast_dir.join("lib"),
        rpclib: rpclib_dir.join("lib"),
        boost: boost_dir.join("lib"),
        libpng: libpng_dir.join("lib"),
        libcarla_client: libcarla_client_lib_dir,
    };

    Probe {
        prefix: carla_src_dir.to_path_buf(),
        include_dirs,
        lib_dirs,
    }
}