xref: /DADK/src/main.rs (revision 34fff79f1e6be14560fbe107b4766d68e17c987a)
1 //! # DADK - DragonOS Application Development Kit
2 //! # DragonOS 应用开发工具
3 //!
4 //! ## 简介
5 //!
6 //! DADK是一个用于开发DragonOS应用的工具包,设计目的是为了让开发者能够更加方便的开发DragonOS应用。
7 //!
8 //! ### DADK做什么?
9 //!
10 //! - 自动配置libc等编译用户程序所需的环境
11 //! - 自动处理软件库的依赖关系
12 //! - 自动处理软件库的编译
13 //! - 一键将软件库安装到DragonOS系统中
14 //!
15 //! ### DADK不做什么?
16 //!
17 //! - DADK不会帮助开发者编写代码
18 //! - DADK不提供任何开发DragonOS应用所需的API。这部分工作由libc等库来完成
19 //!
20 //! ## License
21 //!
22 //! DADK is licensed under the [GPLv2 License](LICENSE).
23 
24 #![feature(io_error_more)]
25 
26 #[macro_use]
27 extern crate lazy_static;
28 extern crate log;
29 extern crate serde;
30 extern crate serde_json;
31 extern crate simple_logger;
32 
33 use std::{fs, path::PathBuf, process::exit};
34 
35 use clap::Parser;
36 use executor::source::GitSource;
37 use log::{error, info};
38 use parser::task::{
39     BuildConfig, CleanConfig, CodeSource, DADKTask, Dependency, InstallConfig, TaskType,
40 };
41 use simple_logger::SimpleLogger;
42 
43 use crate::{console::CommandLineArgs, executor::cache::cache_root_init, scheduler::Scheduler};
44 
45 mod console;
46 mod executor;
47 mod parser;
48 mod scheduler;
49 mod utils;
50 
51 fn main() {
52     SimpleLogger::new().init().unwrap();
53     // generate_tmp_dadk();
54     info!("DADK Starting...");
55     let args = CommandLineArgs::parse();
56 
57     info!("DADK run with args: {:?}", &args);
58     // DragonOS sysroot在主机上的路径
59     let dragonos_dir = args.dragonos_dir.as_ref();
60     let config_dir = args.config_dir.as_ref();
61     let action = args.action;
62     info!(
63         "DragonOS sysroot dir: {}",
64         dragonos_dir
65             .as_ref()
66             .map_or_else(|| "None".to_string(), |d| d.display().to_string())
67     );
68     info!(
69         "Config dir: {}",
70         config_dir
71             .as_ref()
72             .map_or_else(|| "None".to_string(), |d| d.display().to_string())
73     );
74     info!("Action: {:?}", action);
75 
76     // 初始化缓存目录
77     let r = cache_root_init(args.cache_dir);
78     if r.is_err() {
79         error!("Failed to init cache root: {:?}", r.unwrap_err());
80         exit(1);
81     }
82 
83     let config_dir = args.config_dir.unwrap_or_else(|| {
84         error!("Config dir not specified");
85         exit(1);
86     });
87 
88     let dragonos_dir = args.dragonos_dir.unwrap_or_else(|| {
89         error!("DragonOS sysroot dir not specified");
90         exit(1);
91     });
92 
93     let mut parser = parser::Parser::new(config_dir);
94     let r = parser.parse();
95     if r.is_err() {
96         exit(1);
97     }
98     let tasks: Vec<(PathBuf, DADKTask)> = r.unwrap();
99     // info!("Parsed tasks: {:?}", tasks);
100 
101     let scheduler = Scheduler::new(dragonos_dir, action, tasks);
102     if scheduler.is_err() {
103         exit(1);
104     }
105 
106     let r = scheduler.unwrap().run();
107     if r.is_err() {
108         exit(1);
109     }
110 }
111 
112 #[allow(dead_code)]
113 fn generate_tmp_dadk() {
114     let x = DADKTask {
115         name: "test".to_string(),
116         version: "0.1.0".to_string(),
117         build: BuildConfig {
118             build_command: Some("echo test".to_string()),
119         },
120         install: InstallConfig {
121             in_dragonos_path: PathBuf::from("/bin"),
122         },
123         clean: CleanConfig::new(None),
124         depends: vec![Dependency {
125             name: "test".to_string(),
126             version: "0.1.0".to_string(),
127         }],
128         description: "test".to_string(),
129         // task_type: TaskType::BuildFromSource(CodeSource::Archive(ArchiveSource::new(
130         //     "123".to_string(),
131         // ))),
132         task_type: TaskType::BuildFromSource(CodeSource::Git(GitSource::new(
133             "123".to_string(),
134             Some("master".to_string()),
135             None,
136         ))),
137         envs: None,
138     };
139     let x = serde_json::to_string(&x).unwrap();
140     fs::write("test.json", x).unwrap();
141 }
142