| @@ -2,7 +2,7 @@ | |||
| #include <dds/build/plan/archive.hpp> | |||
| #include <dds/build/plan/exe.hpp> | |||
| #include <dds/library.hpp> | |||
| #include <dds/library/library.hpp> | |||
| #include <dds/usage_reqs.hpp> | |||
| #include <dds/util/fs.hpp> | |||
| @@ -12,6 +12,17 @@ | |||
| namespace dds { | |||
| struct library_build_params { | |||
| fs::path out_subdir; | |||
| bool build_tests = false; | |||
| bool build_apps = false; | |||
| bool enable_warnings = false; | |||
| // Extras for compiling tests: | |||
| std::vector<fs::path> test_include_dirs; | |||
| std::vector<fs::path> test_link_files; | |||
| }; | |||
| class library_plan { | |||
| std::string _name; | |||
| fs::path _source_root; | |||
| @@ -1,56 +0,0 @@ | |||
| #pragma once | |||
| #include <dds/build/plan/compile_file.hpp> | |||
| #include <dds/build/source_dir.hpp> | |||
| #include <dds/library_manifest.hpp> | |||
| #include <dds/source.hpp> | |||
| #include <string> | |||
| namespace dds { | |||
| struct library_ident { | |||
| std::string namespace_; | |||
| std::string name; | |||
| }; | |||
| class library { | |||
| fs::path _path; | |||
| source_list _sources; | |||
| library_manifest _man; | |||
| library(path_ref dir, source_list&& src, library_manifest&& man) | |||
| : _path(dir) | |||
| , _sources(std::move(src)) | |||
| , _man(std::move(man)) {} | |||
| public: | |||
| static library from_directory(path_ref); | |||
| auto& manifest() const noexcept { return _man; } | |||
| source_directory src_dir() const noexcept { return source_directory{path() / "src"}; } | |||
| source_directory include_dir() const noexcept { return source_directory{path() / "include"}; } | |||
| path_ref path() const noexcept { return _path; } | |||
| fs::path public_include_dir() const noexcept; | |||
| fs::path private_include_dir() const noexcept; | |||
| const source_list& all_sources() const noexcept { return _sources; } | |||
| shared_compile_file_rules base_compile_rules() const noexcept; | |||
| }; | |||
| struct library_build_params { | |||
| fs::path out_subdir; | |||
| bool build_tests = false; | |||
| bool build_apps = false; | |||
| bool enable_warnings = false; | |||
| // Extras for compiling tests: | |||
| std::vector<fs::path> test_include_dirs; | |||
| std::vector<fs::path> test_link_files; | |||
| }; | |||
| std::vector<library> collect_libraries(path_ref where); | |||
| } // namespace dds | |||
| @@ -1,4 +1,4 @@ | |||
| #include <dds/library.hpp> | |||
| #include <dds/library/library.hpp> | |||
| #include <dds/build/plan/compile_file.hpp> | |||
| #include <dds/build/source_dir.hpp> | |||
| @@ -0,0 +1,92 @@ | |||
| #pragma once | |||
| #include <dds/build/plan/compile_file.hpp> | |||
| #include <dds/build/source_dir.hpp> | |||
| #include <dds/library/manifest.hpp> | |||
| #include <dds/source.hpp> | |||
| #include <string> | |||
| namespace dds { | |||
| /** | |||
| * Represents a library that exists on the filesystem | |||
| */ | |||
| class library { | |||
| // The path containing the source directories for this library | |||
| fs::path _path; | |||
| // The sources that are part of this library | |||
| source_list _sources; | |||
| // The library manifest associated with this library (may be generated) | |||
| library_manifest _man; | |||
| // Private constructor. Use named constructor `from_directory`, which will build | |||
| // the construct arguments approperiately | |||
| library(path_ref dir, source_list&& src, library_manifest&& man) | |||
| : _path(dir) | |||
| , _sources(std::move(src)) | |||
| , _man(std::move(man)) {} | |||
| public: | |||
| /** | |||
| * Create a library object that refers to the library contained at the given | |||
| * directory path. This will load the sources and manifest properly and | |||
| * return the resulting library object. | |||
| */ | |||
| static library from_directory(path_ref); | |||
| /** | |||
| * Obtain the manifest for this library | |||
| */ | |||
| const library_manifest& manifest() const noexcept { return _man; } | |||
| /** | |||
| * The `src/` directory for this library. | |||
| */ | |||
| source_directory src_dir() const noexcept { return source_directory{path() / "src"}; } | |||
| /** | |||
| * The `include/` directory for this library | |||
| */ | |||
| source_directory include_dir() const noexcept { return source_directory{path() / "include"}; } | |||
| /** | |||
| * The root path for this library (parent of `src/` and `include/`, if present) | |||
| */ | |||
| path_ref path() const noexcept { return _path; } | |||
| /** | |||
| * The directory that should be considered the "public" include directory. | |||
| * Dependees that want to use this library should add this to their #include | |||
| * search path. | |||
| */ | |||
| fs::path public_include_dir() const noexcept; | |||
| /** | |||
| * The directory that contains the "private" heders for this libary. This | |||
| * directory should be added to the search path of the library when it is | |||
| * being built, but NOT to the search path of the dependees. | |||
| */ | |||
| fs::path private_include_dir() const noexcept; | |||
| /** | |||
| * Get the sources that this library contains | |||
| */ | |||
| const source_list& all_sources() const noexcept { return _sources; } | |||
| /** | |||
| * Generate a compile rules object that should be used when compiling | |||
| * this library. | |||
| */ | |||
| shared_compile_file_rules base_compile_rules() const noexcept; | |||
| }; | |||
| /** | |||
| * Given the root source directory of a project/package/sdist, collect all of | |||
| * the libraries that it contains. There may be a library directly in `where`, | |||
| * but there might also be libraries in `where/libs`. This function will find | |||
| * them all. | |||
| */ | |||
| std::vector<library> collect_libraries(path_ref where); | |||
| } // namespace dds | |||
| @@ -1,4 +1,4 @@ | |||
| #include "./library_manifest.hpp" | |||
| #include "./manifest.hpp" | |||
| #include <dds/util/algo.hpp> | |||
| #include <range/v3/view/transform.hpp> | |||
| @@ -0,0 +1,30 @@ | |||
| #pragma once | |||
| #include <dds/util/fs.hpp> | |||
| #include <libman/library.hpp> | |||
| #include <vector> | |||
| namespace dds { | |||
| /** | |||
| * Represents the contents of a `library.dds`. This is somewhat a stripped-down | |||
| * version of lm::library, to only represent exactly the parts that we want to | |||
| * offer via `library.dds`. | |||
| */ | |||
| struct library_manifest { | |||
| /// The name of the library | |||
| std::string name; | |||
| /// The libraries that the owning library "uses" | |||
| std::vector<lm::usage> uses; | |||
| /// The libraries that the owning library must be linked with | |||
| std::vector<lm::usage> links; | |||
| /** | |||
| * Load the library manifest from an existing file | |||
| */ | |||
| static library_manifest load_from_file(const fs::path&); | |||
| }; | |||
| } // namespace dds | |||
| @@ -1,19 +0,0 @@ | |||
| #pragma once | |||
| #include <dds/util/fs.hpp> | |||
| #include <libman/library.hpp> | |||
| #include <vector> | |||
| namespace dds { | |||
| struct library_manifest { | |||
| std::string name; | |||
| std::vector<lm::usage> uses; | |||
| std::vector<lm::usage> links; | |||
| static library_manifest load_from_file(const fs::path&); | |||
| }; | |||
| } // namespace dds | |||