You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
5.2 KiB
159 lines
5.2 KiB
/* |
|
* Copyright 2016 The Android Open Source Project |
|
* |
|
* 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 <dirent.h> |
|
#include <stdlib.h> |
|
#include <string.h> |
|
#include <sys/stat.h> |
|
#include <unistd.h> |
|
|
|
#include <iostream> |
|
|
|
#include <android-base/logging.h> |
|
#include "VtsCompilerUtils.h" |
|
#include "code_gen/CodeGenBase.h" |
|
|
|
using namespace std; |
|
|
|
// To generate both header and source files, |
|
// Usage: vtsc -mDRIVER | -mPROFILER <.vts input file path> \ |
|
// <header output dir> <C/C++ source output file path> |
|
// To generate only a header file, |
|
// Usage: vtsc -mDRIVER | -mPROFILER -tHEADER -b<base path> \ |
|
// <.vts input file or dir path> <header output file or dir path> |
|
// To generate only a source file, |
|
// Usage: vtsc -mDRIVER | -mPROFILER -tSOURCE -b<base path> \ |
|
// <.vts input file or dir path> \ |
|
// <C/C++ source output file or dir path> |
|
// where <base path> is a base path of where .vts input file or dir is |
|
// stored but should be excluded when computing the package path of generated |
|
// source or header output file(s). |
|
|
|
int main(int argc, char* argv[]) { |
|
#ifdef VTS_DEBUG |
|
cout << "Android VTS Compiler (AVTSC)" << endl; |
|
#endif |
|
int opt_count = 0; |
|
android::vts::VtsCompileMode mode = android::vts::kDriver; |
|
android::vts::VtsCompileFileType type = android::vts::VtsCompileFileType::kBoth; |
|
string vts_base_dir; |
|
for (int i = 0; i < argc; i++) { |
|
#ifdef VTS_DEBUG |
|
cout << "- args[" << i << "] " << argv[i] << endl; |
|
#endif |
|
if (argv[i] && strlen(argv[i]) > 1 && argv[i][0] == '-') { |
|
opt_count++; |
|
if (argv[i][1] == 'm') { |
|
if (!strcmp(&argv[i][2], "PROFILER")) { |
|
mode = android::vts::kProfiler; |
|
#ifdef VTS_DEBUG |
|
cout << "- mode: PROFILER" << endl; |
|
#endif |
|
} else if (!strcmp(&argv[i][2], "FUZZER")) { |
|
mode = android::vts::kFuzzer; |
|
#ifdef VTS_DEBUG |
|
cout << "- mode: FUZZER" << endl; |
|
#endif |
|
} |
|
} |
|
if (argv[i][1] == 't') { |
|
if (!strcmp(&argv[i][2], "HEADER")) { |
|
type = android::vts::kHeader; |
|
#ifdef VTS_DEBUG |
|
cout << "- type: HEADER" << endl; |
|
#endif |
|
} else if (!strcmp(&argv[i][2], "SOURCE")) { |
|
type = android::vts::kSource; |
|
#ifdef VTS_DEBUG |
|
cout << "- type: SOURCE" << endl; |
|
#endif |
|
} |
|
} |
|
if (argv[i][1] == 'b') { |
|
vts_base_dir = &argv[i][2]; |
|
#ifdef VTS_DEBUG |
|
cout << "- VTS base dir: " << vts_base_dir << endl; |
|
#endif |
|
} |
|
} |
|
} |
|
if (argc < 5) { |
|
cerr << "argc " << argc << " < 5" << endl; |
|
return -1; |
|
} |
|
switch (type) { |
|
case android::vts::kBoth: |
|
android::vts::Translate( |
|
mode, argv[opt_count + 1], argv[opt_count + 2], argv[opt_count + 3]); |
|
break; |
|
case android::vts::kHeader: |
|
case android::vts::kSource: { |
|
struct stat s; |
|
bool is_dir = false; |
|
if (vts_base_dir.length() > 0) { |
|
if (chdir(vts_base_dir.c_str())) { |
|
cerr << __func__ << " can't chdir to " << vts_base_dir << endl; |
|
exit(-1); |
|
} |
|
} |
|
if (stat(argv[opt_count + 1], &s) == 0) { |
|
if (s.st_mode & S_IFDIR) { |
|
is_dir = true; |
|
} |
|
} |
|
if (!is_dir) { |
|
android::vts::TranslateToFile( |
|
mode, argv[opt_count + 1], argv[opt_count + 2], type); |
|
} else { |
|
DIR* input_dir; |
|
struct dirent* ent; |
|
if ((input_dir = opendir(argv[opt_count + 1])) != NULL) { |
|
// argv[opt_count + 2] should be a directory. if that dir does not exist, |
|
// that dir is created as part of the translation operation. |
|
while ((ent = readdir(input_dir)) != NULL) { |
|
if (!strncmp(&ent->d_name[strlen(ent->d_name)-4], ".vts", 4)) { |
|
string src_file = android::vts::RemoveBaseDir( |
|
android::vts::PathJoin( |
|
argv[opt_count + 1], ent->d_name), vts_base_dir); |
|
string dst_file = android::vts::RemoveBaseDir( |
|
android::vts::PathJoin( |
|
argv[opt_count + 2], ent->d_name), vts_base_dir); |
|
if (type == android::vts::kHeader) { |
|
dst_file = android::vts::PathJoin(dst_file.c_str(), ".h"); |
|
} else { |
|
dst_file = android::vts::PathJoin(dst_file.c_str(), ".cpp"); |
|
} |
|
#ifdef VTS_DEBUG |
|
cout << ent->d_name << endl; |
|
cout << "<- " << src_file.c_str() << endl; |
|
cout << "-> " << dst_file.c_str() << endl; |
|
#endif |
|
android::vts::TranslateToFile( |
|
mode, src_file.c_str(), dst_file.c_str(), type); |
|
} |
|
} |
|
closedir(input_dir); |
|
} else { |
|
cerr << __func__ << " can't open the given input dir, " |
|
<< argv[opt_count + 1] << "." << endl; |
|
exit(-1); |
|
} |
|
} |
|
break; |
|
} |
|
} |
|
return 0; |
|
}
|
|
|