/** * Copyright 2021 Huawei Technologies Co., Ltd * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "coder/utils/dir_utils.h" #include #if defined(_WIN32) || defined(_WIN64) #include #endif #include #include #include #include "include/errorcode.h" #include "src/common/log_adapter.h" namespace mindspore::lite::micro { #if defined(_WIN32) || defined(_WIN64) #ifdef _MSC_VER constexpr unsigned int kMicroDirMode = 511; #else constexpr _mode_t kMicroDirMode = 0777; #endif #else constexpr __mode_t kMicroDirMode = 0777; #endif static std::array kWorkDirs = {"src", "benchmark"}; bool DirExists(const std::string &dir_path) { struct stat file_info; if (stat(dir_path.c_str(), &file_info) != 0) { return false; } return (file_info.st_mode & S_IFDIR) != 0; } bool FileExists(const std::string &path) { std::ifstream file(path); return file.good(); } static int MkMicroDir(const std::string ¤tDir) { #if defined(_WIN32) || defined(_WIN64) std::ofstream currentFile; std::string readMeFile = currentDir + "\\readMe.txt"; currentFile.open(readMeFile); currentFile << "This is a directory for generating coding files. Do not edit !!!\n"; if (!currentFile.is_open()) { if (_mkdir(currentDir.c_str()) != 0) { MS_LOG(ERROR) << currentDir << ": mkdir failed, please check filePath!!!"; currentFile.close(); return RET_ERROR; } } currentFile.close(); #else std::ifstream currentFile; currentFile.open(currentDir); if (!currentFile.is_open()) { if (mkdir(currentDir.c_str(), kMicroDirMode) != 0) { MS_LOG(ERROR) << currentDir << ": mkdir failed, please check filePath!!!"; currentFile.close(); return RET_ERROR; } } currentFile.close(); #endif return RET_OK; } int InitProjDirs(const std::string &project_root_dir, const std::string &proj_name) { #if defined(_WIN32) || defined(_WIN64) std::ofstream pro_file; std::string read_me_file = project_root_dir + "\\readMe.txt"; pro_file.open(read_me_file.c_str()); pro_file << "This is a directory for generating coding files. Do not edit !!!\n"; #else std::ifstream pro_file; pro_file.open(project_root_dir.c_str()); #endif if (!pro_file.is_open()) { MS_LOG(ERROR) << project_root_dir << ": model's root dir not exists or have no access to open, please check it!!!"; pro_file.close(); return RET_ERROR; } // check other dirs && make them if not exists // 1. coderDir 2.WorkRootDir 3. WorkChildDir std::string current_dir; std::string slashCh = std::string(kSlash); if (project_root_dir.back() != slashCh.back()) { current_dir = project_root_dir + slashCh; } current_dir += proj_name; std::string work_dir = current_dir; STATUS ret = MkMicroDir(current_dir); if (ret == RET_ERROR) { pro_file.close(); return ret; } for (const auto &work : kWorkDirs) { current_dir = work_dir + slashCh + work; ret = MkMicroDir(current_dir); if (ret == RET_ERROR) { pro_file.close(); return ret; } } pro_file.close(); return RET_OK; } } // namespace mindspore::lite::micro