#pragma once #include #include #include #include #include #include #include #include #include #include #include #include namespace vcpkg::Build { namespace Command { void perform_and_exit_ex(const FullPackageSpec& full_spec, const SourceControlFileLocation& scfl, const ParsedArguments& options, const VcpkgPaths& paths); void perform_and_exit(const VcpkgCmdArguments& args, const VcpkgPaths& paths, const Triplet& default_triplet); } enum class UseHeadVersion { NO = 0, YES }; enum class AllowDownloads { NO = 0, YES }; enum class CleanBuildtrees { NO = 0, YES }; enum class CleanPackages { NO = 0, YES }; enum class CleanDownloads { NO = 0, YES }; enum class ConfigurationType { DEBUG, RELEASE, }; enum class DownloadTool { BUILT_IN, ARIA2, }; const std::string& to_string(DownloadTool tool); enum class BinaryCaching { NO = 0, YES }; enum class FailOnTombstone { NO = 0, YES }; struct BuildPackageOptions { UseHeadVersion use_head_version; AllowDownloads allow_downloads; CleanBuildtrees clean_buildtrees; CleanPackages clean_packages; CleanDownloads clean_downloads; DownloadTool download_tool; BinaryCaching binary_caching; FailOnTombstone fail_on_tombstone; }; enum class BuildResult { NULLVALUE = 0, SUCCEEDED, BUILD_FAILED, POST_BUILD_CHECKS_FAILED, FILE_CONFLICTS, CASCADED_DUE_TO_MISSING_DEPENDENCIES, EXCLUDED, }; static constexpr std::array BUILD_RESULT_VALUES = { BuildResult::SUCCEEDED, BuildResult::BUILD_FAILED, BuildResult::POST_BUILD_CHECKS_FAILED, BuildResult::FILE_CONFLICTS, BuildResult::CASCADED_DUE_TO_MISSING_DEPENDENCIES, BuildResult::EXCLUDED}; const std::string& to_string(const BuildResult build_result); std::string create_error_message(const BuildResult build_result, const PackageSpec& spec); std::string create_user_troubleshooting_message(const PackageSpec& spec); /// /// Settings from the triplet file which impact the build environment and post-build checks /// struct PreBuildInfo { /// /// Runs the triplet file in a "capture" mode to create a PreBuildInfo /// static PreBuildInfo from_triplet_file(const VcpkgPaths& paths, const Triplet& triplet, Optional port = nullopt); std::string triplet_abi_tag; std::string target_architecture; std::string cmake_system_name; std::string cmake_system_version; Optional platform_toolset; Optional visual_studio_path; Optional external_toolchain_file; Optional build_type; Optional public_abi_override; Optional port; std::vector passthrough_env_vars; }; std::string make_build_env_cmd(const PreBuildInfo& pre_build_info, const Toolset& toolset); enum class VcpkgTripletVar { TARGET_ARCHITECTURE = 0, CMAKE_SYSTEM_NAME, CMAKE_SYSTEM_VERSION, PLATFORM_TOOLSET, VISUAL_STUDIO_PATH, CHAINLOAD_TOOLCHAIN_FILE, BUILD_TYPE, ENV_PASSTHROUGH, PUBLIC_ABI_OVERRIDE, }; const std::unordered_map VCPKG_OPTIONS = { {"VCPKG_TARGET_ARCHITECTURE", VcpkgTripletVar::TARGET_ARCHITECTURE}, {"VCPKG_CMAKE_SYSTEM_NAME", VcpkgTripletVar::CMAKE_SYSTEM_NAME}, {"VCPKG_CMAKE_SYSTEM_VERSION", VcpkgTripletVar::CMAKE_SYSTEM_VERSION}, {"VCPKG_PLATFORM_TOOLSET", VcpkgTripletVar::PLATFORM_TOOLSET}, {"VCPKG_VISUAL_STUDIO_PATH", VcpkgTripletVar::VISUAL_STUDIO_PATH}, {"VCPKG_CHAINLOAD_TOOLCHAIN_FILE", VcpkgTripletVar::CHAINLOAD_TOOLCHAIN_FILE}, {"VCPKG_BUILD_TYPE", VcpkgTripletVar::BUILD_TYPE}, {"VCPKG_ENV_PASSTHROUGH", VcpkgTripletVar::ENV_PASSTHROUGH}, {"VCPKG_PUBLIC_ABI_OVERRIDE", VcpkgTripletVar::PUBLIC_ABI_OVERRIDE}, }; struct ExtendedBuildResult { ExtendedBuildResult(BuildResult code); ExtendedBuildResult(BuildResult code, std::vector&& unmet_deps); ExtendedBuildResult(BuildResult code, std::unique_ptr&& bcf); BuildResult code; std::vector unmet_dependencies; std::unique_ptr binary_control_file; }; struct BuildPackageConfig { BuildPackageConfig(const SourceControlFileLocation& scfl, const Triplet& triplet, const BuildPackageOptions& build_package_options, const std::set& feature_list) : scfl(scfl) , scf(*scfl.source_control_file) , triplet(triplet) , port_dir(scfl.source_location) , build_package_options(build_package_options) , feature_list(feature_list) { } const SourceControlFileLocation& scfl; const SourceControlFile& scf; const Triplet& triplet; fs::path port_dir; const BuildPackageOptions& build_package_options; const std::set& feature_list; }; ExtendedBuildResult build_package(const VcpkgPaths& paths, const BuildPackageConfig& config, const StatusParagraphs& status_db); enum class BuildPolicy { EMPTY_PACKAGE, DLLS_WITHOUT_LIBS, ONLY_RELEASE_CRT, EMPTY_INCLUDE_FOLDER, ALLOW_OBSOLETE_MSVCRT, // Must be last COUNT, }; constexpr std::array G_ALL_POLICIES = { BuildPolicy::EMPTY_PACKAGE, BuildPolicy::DLLS_WITHOUT_LIBS, BuildPolicy::ONLY_RELEASE_CRT, BuildPolicy::EMPTY_INCLUDE_FOLDER, BuildPolicy::ALLOW_OBSOLETE_MSVCRT, }; const std::string& to_string(BuildPolicy policy); CStringView to_cmake_variable(BuildPolicy policy); struct BuildPolicies { BuildPolicies() = default; BuildPolicies(std::map&& map) : m_policies(std::move(map)) {} bool is_enabled(BuildPolicy policy) const { const auto it = m_policies.find(policy); if (it != m_policies.cend()) return it->second; return false; } private: std::map m_policies; }; enum class LinkageType : char { DYNAMIC, STATIC, }; Optional to_linkage_type(const std::string& str); struct BuildInfo { LinkageType crt_linkage = LinkageType::DYNAMIC; LinkageType library_linkage = LinkageType::DYNAMIC; Optional version; BuildPolicies policies; }; BuildInfo read_build_info(const Files::Filesystem& fs, const fs::path& filepath); struct AbiEntry { std::string key; std::string value; bool operator<(const AbiEntry& other) const { return key < other.key || (key == other.key && value < other.value); } }; struct AbiTagAndFile { std::string tag; fs::path tag_file; }; Optional compute_abi_tag(const VcpkgPaths& paths, const BuildPackageConfig& config, const PreBuildInfo& pre_build_info, Span dependency_abis); }