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