| 
				
			 | 
			
			 | 
			@@ -573,6 +573,113 @@ struct cli_sdist { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void load_project_deps(dds::builder&                bd, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                       const dds::package_manifest& man, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                       dds::path_ref                cat_path, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                       dds::path_ref                repo_path) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    auto cat = dds::catalog::open(cat_path); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    // Build the dependencies | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    dds::repository::with_repository(  // | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        repo_path, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        dds::repo_flags::write_lock | dds::repo_flags::create_if_absent, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        [&](dds::repository repo) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            // Download dependencies | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            auto deps = repo.solve(man.dependencies, cat); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            dds::get_all(deps, repo, cat); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            for (const dds::package_id& pk : deps) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                auto sdist_ptr = repo.find(pk); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                assert(sdist_ptr); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                dds::sdist_build_params deps_params; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                deps_params.subdir | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    = dds::fs::path("_deps") / sdist_ptr->manifest.pkg_id.to_string(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                bd.add(*sdist_ptr, deps_params); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			dds::builder create_project_builder(dds::path_ref                  pr_dir, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                    dds::path_ref                  cat_path, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                    dds::path_ref                  repo_path, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                    bool                           load_deps, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                    const dds::sdist_build_params& project_params) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    auto man = dds::package_manifest::load_from_directory(pr_dir).value_or(dds::package_manifest{}); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    dds::builder builder; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    if (load_deps) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        load_project_deps(builder, man, cat_path, repo_path); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    builder.add(dds::sdist{std::move(man), pr_dir}, project_params); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return builder; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			/* | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 ######   #######  ##     ## ########  #### ##       ######## | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			##    ## ##     ## ###   ### ##     ##  ##  ##       ## | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			##       ##     ## #### #### ##     ##  ##  ##       ## | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			##       ##     ## ## ### ## ########   ##  ##       ###### | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			##       ##     ## ##     ## ##         ##  ##       ## | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			##    ## ##     ## ##     ## ##         ##  ##       ## | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			 ######   #######  ##     ## ##        #### ######## ######## | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			*/ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			struct cli_compile_file { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_base&     base; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    args::Command cmd{base.cmd_group, "compile-file", "Compile a single file"}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    common_flags _flags{cmd}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    common_project_flags project{cmd}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    catalog_path_flag cat_path{cmd}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    repo_path_flag    repo_path{cmd}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    args::Flag     no_warnings{cmd, "no-warnings", "Disable compiler warnings", {"no-warnings"}}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    toolchain_flag tc_filepath{cmd}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    path_flag | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        lm_index{cmd, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 "lm_index", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 "Path to an existing libman index from which to load deps (usually INDEX.lmi)", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 {"lm-index", 'I'}}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    num_jobs_flag n_jobs{cmd}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    path_flag out{cmd, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                  "out", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                  "The root build directory", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                  {"out"}, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                  dds::fs::current_path() / "_build"}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    args::PositionalList<dds::fs::path> source_files{cmd, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                                     "source-files", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                                     "One or more source files to compile"}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int run() { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        dds::sdist_build_params main_params = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .subdir          = "", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .build_tests     = true, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .build_apps      = true, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .enable_warnings = !no_warnings.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        auto bd = create_project_builder(project.root.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                         cat_path.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                         repo_path.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                         /* load_deps = */ !lm_index, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                         main_params); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        bd.compile_files(source_files.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                         { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                             .out_root = out.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                             .existing_lm_index | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                             = lm_index ? std::make_optional(lm_index.Get()) : std::nullopt, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                             .emit_lmi      = {}, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                             .toolchain     = tc_filepath.get_toolchain(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                             .parallel_jobs = n_jobs.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                         }); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			/* | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			########  ##     ## #### ##       ######## | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			##     ## ##     ##  ##  ##       ##     ## | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -614,45 +721,26 @@ struct cli_build { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                  dds::fs::current_path() / "_build"}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    int run() { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        dds::build_params params; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        params.out_root      = out.Get(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        params.toolchain     = tc_filepath.get_toolchain(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        params.parallel_jobs = n_jobs.Get(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        auto man = dds::package_manifest::load_from_directory(project.root.Get()) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                       .value_or(dds::package_manifest{}); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        dds::builder            bd; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        dds::sdist_build_params main_params; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        main_params.build_apps      = !no_apps.Get(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        main_params.enable_warnings = !no_warnings.Get(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        main_params.run_tests = main_params.build_tests = !no_tests.Get(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        bd.add(dds::sdist{man, project.root.Get()}, main_params); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (lm_index) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            params.existing_lm_index = lm_index.Get(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } else { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            // Download and build dependencies | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            // Build the dependencies | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            auto cat = cat_path.open(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            dds::repository::with_repository(  // | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                this->repo_path.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                dds::repo_flags::write_lock | dds::repo_flags::create_if_absent, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                [&](dds::repository repo) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    // Download dependencies | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    auto deps = repo.solve(man.dependencies, cat); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    dds::get_all(deps, repo, cat); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    for (const dds::package_id& pk : deps) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                        auto sdist_ptr = repo.find(pk); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                        assert(sdist_ptr); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                        dds::sdist_build_params deps_params; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                        deps_params.subdir | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                            = dds::fs::path("_deps") / sdist_ptr->manifest.pkg_id.to_string(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                        bd.add(*sdist_ptr, deps_params); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                }); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        bd.build(params); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        dds::sdist_build_params main_params = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .subdir          = "", | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .build_tests     = !no_tests.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .run_tests       = !no_tests.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .build_apps      = !no_apps.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .enable_warnings = !no_warnings.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        auto bd = create_project_builder(project.root.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                         cat_path.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                         repo_path.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                         /* load_deps = */ !lm_index, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                         main_params); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        bd.build({ | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .out_root          = out.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .existing_lm_index = lm_index ? std::make_optional(lm_index.Get()) : std::nullopt, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .emit_lmi          = {}, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .toolchain         = tc_filepath.get_toolchain(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            .parallel_jobs     = n_jobs.Get(), | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        return 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    } | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			}; | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -760,12 +848,13 @@ int main(int argc, char** argv) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    spdlog::set_pattern("[%H:%M:%S] [%^%-5l%$] %v"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    args::ArgumentParser parser("DDS - The drop-dead-simple library manager"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_base       cli{parser}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_build      build{cli}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_sdist      sdist{cli}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_repo       repo{cli}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_catalog    catalog{cli}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_build_deps build_deps{cli}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_base         cli{parser}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_compile_file compile_file{cli}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_build        build{cli}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_sdist        sdist{cli}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_repo         repo{cli}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_catalog      catalog{cli}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    cli_build_deps   build_deps{cli}; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    try { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        parser.ParseCLI(argc, argv); | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -785,6 +874,8 @@ int main(int argc, char** argv) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        if (cli._verify_ident) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            std::cout << "yes\n"; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return 0; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } else if (compile_file.cmd) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return compile_file.run(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } else if (build.cmd) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            return build.run(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        } else if (sdist.cmd) { |