mirror of
https://github.com/dexoron/dcr.git
synced 2026-10-21 11:38:30 +00:00
- Updated all relevant source files to include the new license header. - Changed the default license in the configuration from MIT to GPL-3.0-or-later.
95 lines
3.0 KiB
Rust
95 lines
3.0 KiB
Rust
// DCR — Cargo-like C/C++ project manager.
|
|
//
|
|
// Copyright (C) 2026 Dexoron (Bezotechestvo Vladimir) <main@dexoron.su>
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
pub mod common;
|
|
pub mod gas;
|
|
pub mod msvc;
|
|
pub mod nasm;
|
|
pub mod unix_cc;
|
|
|
|
pub struct BuildContext<'a> {
|
|
pub profile: &'a str,
|
|
pub project_name: &'a str,
|
|
pub compiler: &'a str,
|
|
pub language: &'a str,
|
|
pub standard: &'a str,
|
|
#[allow(dead_code)]
|
|
pub target: Option<&'a str>,
|
|
pub target_dir: Option<&'a str>,
|
|
pub kind: &'a str,
|
|
pub platform: Option<&'a str>,
|
|
pub linker: Option<&'a str>,
|
|
pub archiver: Option<&'a str>,
|
|
pub package_type: Option<&'a str>,
|
|
pub source_roots: &'a [std::path::PathBuf],
|
|
pub exclude_dirs: &'a [std::path::PathBuf],
|
|
pub include_paths: &'a [String],
|
|
pub include_dirs: &'a [String],
|
|
pub lib_dirs: &'a [String],
|
|
pub libs: &'a [String],
|
|
pub cflags: &'a [String],
|
|
pub ldflags: &'a [String],
|
|
pub output_filename: Option<&'a str>,
|
|
pub output_extension: Option<&'a str>,
|
|
pub verbose: bool,
|
|
}
|
|
|
|
pub fn build(ctx: &BuildContext) -> Result<f64, String> {
|
|
let compiler = ctx.compiler.to_lowercase();
|
|
if !check_compiler_exists(ctx.compiler) {
|
|
return Err(format!(
|
|
"Compiler not found: {}. Make sure it is installed and available in PATH.",
|
|
ctx.compiler
|
|
));
|
|
}
|
|
if compiler.contains("clang-cl") {
|
|
return msvc::build(ctx);
|
|
}
|
|
if compiler == "as" || compiler.contains("gas") {
|
|
return gas::build(ctx);
|
|
}
|
|
if compiler.contains("nasm") {
|
|
return nasm::build(ctx);
|
|
}
|
|
if compiler == "cl" || compiler.contains("msvc") {
|
|
return msvc::build(ctx);
|
|
}
|
|
unix_cc::build(ctx)
|
|
}
|
|
|
|
fn check_compiler_exists(compiler: &str) -> bool {
|
|
let name = if compiler.is_empty() { "cc" } else { compiler };
|
|
std::process::Command::new(name)
|
|
.arg("--version")
|
|
.output()
|
|
.is_ok()
|
|
}
|
|
|
|
pub fn collect_sources(ctx: &BuildContext) -> Result<Vec<String>, String> {
|
|
let compiler = ctx.compiler.to_lowercase();
|
|
if compiler.contains("clang-cl") || compiler == "cl" || compiler.contains("msvc") {
|
|
return msvc::collect_sources(ctx);
|
|
}
|
|
if compiler == "as" || compiler.contains("gas") {
|
|
return gas::collect_sources(ctx);
|
|
}
|
|
if compiler.contains("nasm") {
|
|
return nasm::collect_sources(ctx);
|
|
}
|
|
unix_cc::collect_sources(ctx)
|
|
}
|