aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/commands_import.cpp
blob: 11924b4b25b0d3a0716068fadddd7add29aa84a3 (plain)
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
#include "pch.h"
#include "vcpkg_Commands.h"
#include "Paragraphs.h"
#include "StatusParagraph.h"
#include "vcpkg_Files.h"

namespace vcpkg::Commands::Import
{
    struct Binaries
    {
        std::vector<fs::path> dlls;
        std::vector<fs::path> libs;
    };

    static Binaries find_binaries_in_dir(const fs::path& path)
    {
        Files::check_is_directory(path);

        Binaries binaries;
        binaries.dlls = Files::recursive_find_files_with_extension_in_dir(path, ".dll");
        binaries.libs = Files::recursive_find_files_with_extension_in_dir(path, ".lib");
        return binaries;
    }

    static void copy_files_into_directory(const std::vector<fs::path>& files, const fs::path& destination_folder)
    {
        fs::create_directory(destination_folder);

        for (auto const& src_path : files)
        {
            fs::path dest_path = destination_folder / src_path.filename();
            fs::copy(src_path, dest_path, fs::copy_options::overwrite_existing);
        }
    }

    static void place_library_files_in(const fs::path& include_directory, const fs::path& project_directory, const fs::path& destination_path)
    {
        Files::check_is_directory(include_directory);
        Files::check_is_directory(project_directory);
        Files::check_is_directory(destination_path);
        Binaries debug_binaries = find_binaries_in_dir(project_directory / "Debug");
        Binaries release_binaries = find_binaries_in_dir(project_directory / "Release");

        fs::path destination_include_directory = destination_path / "include";
        fs::copy(include_directory, destination_include_directory, fs::copy_options::recursive | fs::copy_options::overwrite_existing);

        copy_files_into_directory(release_binaries.dlls, destination_path / "bin");
        copy_files_into_directory(release_binaries.libs, destination_path / "lib");

        fs::create_directory(destination_path / "debug");
        copy_files_into_directory(debug_binaries.dlls, destination_path / "debug" / "bin");
        copy_files_into_directory(debug_binaries.libs, destination_path / "debug" / "lib");
    }

    static void do_import(const vcpkg_paths& paths, const fs::path& include_directory, const fs::path& project_directory, const BinaryParagraph& control_file_data)
    {
        fs::path library_destination_path = paths.package_dir(control_file_data.spec);
        fs::create_directory(library_destination_path);
        place_library_files_in(include_directory, project_directory, library_destination_path);

        fs::path control_file_path = library_destination_path / "CONTROL";
        std::ofstream(control_file_path) << control_file_data;
    }

    void perform_and_exit(const vcpkg_cmd_arguments& args, const vcpkg_paths& paths)
    {
        static const std::string example = Commands::Help::create_example_string(R"(import C:\path\to\CONTROLfile C:\path\to\includedir C:\path\to\projectdir)");
        args.check_exact_arg_count(3, example);
        args.check_and_get_optional_command_arguments({});

        const fs::path control_file_path(args.command_arguments[0]);
        const fs::path include_directory(args.command_arguments[1]);
        const fs::path project_directory(args.command_arguments[2]);

        auto pghs = Paragraphs::get_paragraphs(control_file_path);
        Checks::check_exit(pghs.size() == 1, "Invalid control file %s for package", control_file_path.generic_string());

        StatusParagraph spgh;
        spgh.package = BinaryParagraph(pghs[0]);
        auto& control_file_data = spgh.package;

        do_import(paths, include_directory, project_directory, control_file_data);
        exit(EXIT_SUCCESS);
    }
}