The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 1 | |
| 2 | #include "options.h" |
| 3 | |
| 4 | #include <stdio.h> |
| 5 | #include <stdlib.h> |
| 6 | #include <string.h> |
| 7 | |
| 8 | static int |
| 9 | usage() |
| 10 | { |
| 11 | fprintf(stderr, |
| 12 | "usage: aidl OPTIONS INPUT [OUTPUT]\n" |
| 13 | " aidl --preprocess OUTPUT INPUT...\n" |
| 14 | "\n" |
| 15 | "OPTIONS:\n" |
The Android Open Source Project | ba87e3e | 2009-03-13 13:04:22 -0700 | [diff] [blame] | 16 | " -I<DIR> search path for import statements.\n" |
| 17 | " -d<FILE> generate dependency file.\n" |
Xavier Ducrohet | 18fff11 | 2011-08-25 11:58:17 -0700 | [diff] [blame] | 18 | " -a generate dependency file next to the output file with the name based on the input file.\n" |
The Android Open Source Project | ba87e3e | 2009-03-13 13:04:22 -0700 | [diff] [blame] | 19 | " -p<FILE> file created by --preprocess to import.\n" |
| 20 | " -o<FOLDER> base output folder for generated files.\n" |
| 21 | " -b fail when trying to compile a parcelable.\n" |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 22 | "\n" |
| 23 | "INPUT:\n" |
| 24 | " An aidl interface file.\n" |
| 25 | "\n" |
| 26 | "OUTPUT:\n" |
The Android Open Source Project | ba87e3e | 2009-03-13 13:04:22 -0700 | [diff] [blame] | 27 | " The generated interface files.\n" |
| 28 | " If omitted and the -o option is not used, the input filename is used, with the .aidl extension changed to a .java extension.\n" |
| 29 | " If the -o option is used, the generated files will be placed in the base output folder, under their package folder\n" |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 30 | ); |
| 31 | return 1; |
| 32 | } |
| 33 | |
| 34 | int |
| 35 | parse_options(int argc, const char* const* argv, Options *options) |
| 36 | { |
| 37 | int i = 1; |
| 38 | |
| 39 | if (argc >= 2 && 0 == strcmp(argv[1], "--preprocess")) { |
| 40 | if (argc < 4) { |
| 41 | return usage(); |
| 42 | } |
| 43 | options->outputFileName = argv[2]; |
| 44 | for (int i=3; i<argc; i++) { |
| 45 | options->filesToPreprocess.push_back(argv[i]); |
| 46 | } |
| 47 | options->task = PREPROCESS_AIDL; |
| 48 | return 0; |
| 49 | } |
| 50 | |
| 51 | options->task = COMPILE_AIDL; |
| 52 | options->failOnParcelable = false; |
Xavier Ducrohet | 18fff11 | 2011-08-25 11:58:17 -0700 | [diff] [blame] | 53 | options->autoDepFile = false; |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 54 | |
| 55 | // OPTIONS |
| 56 | while (i < argc) { |
| 57 | const char* s = argv[i]; |
| 58 | int len = strlen(s); |
| 59 | if (s[0] == '-') { |
| 60 | if (len > 1) { |
| 61 | // -I<system-import-path> |
| 62 | if (s[1] == 'I') { |
| 63 | if (len > 2) { |
| 64 | options->importPaths.push_back(s+2); |
| 65 | } else { |
| 66 | fprintf(stderr, "-I option (%d) requires a path.\n", i); |
| 67 | return usage(); |
| 68 | } |
| 69 | } |
| 70 | else if (s[1] == 'd') { |
| 71 | if (len > 2) { |
| 72 | options->depFileName = s+2; |
| 73 | } else { |
| 74 | fprintf(stderr, "-d option (%d) requires a file.\n", i); |
| 75 | return usage(); |
| 76 | } |
| 77 | } |
Xavier Ducrohet | 18fff11 | 2011-08-25 11:58:17 -0700 | [diff] [blame] | 78 | else if (s[1] == 'a') { |
| 79 | options->autoDepFile = true; |
| 80 | } |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 81 | else if (s[1] == 'p') { |
| 82 | if (len > 2) { |
| 83 | options->preprocessedFiles.push_back(s+2); |
| 84 | } else { |
| 85 | fprintf(stderr, "-p option (%d) requires a file.\n", i); |
| 86 | return usage(); |
| 87 | } |
| 88 | } |
The Android Open Source Project | ba87e3e | 2009-03-13 13:04:22 -0700 | [diff] [blame] | 89 | else if (s[1] == 'o') { |
| 90 | if (len > 2) { |
| 91 | options->outputBaseFolder = s+2; |
| 92 | } else { |
| 93 | fprintf(stderr, "-o option (%d) requires a path.\n", i); |
| 94 | return usage(); |
| 95 | } |
| 96 | } |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 97 | else if (len == 2 && s[1] == 'b') { |
| 98 | options->failOnParcelable = true; |
| 99 | } |
| 100 | else { |
| 101 | // s[1] is not known |
| 102 | fprintf(stderr, "unknown option (%d): %s\n", i, s); |
| 103 | return usage(); |
| 104 | } |
| 105 | } else { |
| 106 | // len <= 1 |
| 107 | fprintf(stderr, "unknown option (%d): %s\n", i, s); |
| 108 | return usage(); |
| 109 | } |
| 110 | } else { |
| 111 | // s[0] != '-' |
| 112 | break; |
| 113 | } |
| 114 | i++; |
| 115 | } |
| 116 | |
| 117 | // INPUT |
| 118 | if (i < argc) { |
| 119 | options->inputFileName = argv[i]; |
| 120 | i++; |
| 121 | } else { |
| 122 | fprintf(stderr, "INPUT required\n"); |
| 123 | return usage(); |
| 124 | } |
| 125 | |
| 126 | // OUTPUT |
| 127 | if (i < argc) { |
| 128 | options->outputFileName = argv[i]; |
| 129 | i++; |
The Android Open Source Project | ba87e3e | 2009-03-13 13:04:22 -0700 | [diff] [blame] | 130 | } else if (options->outputBaseFolder.length() == 0) { |
The Android Open Source Project | 9066cfe | 2009-03-03 19:31:44 -0800 | [diff] [blame] | 131 | // copy input into output and change the extension from .aidl to .java |
| 132 | options->outputFileName = options->inputFileName; |
| 133 | string::size_type pos = options->outputFileName.size()-5; |
| 134 | if (options->outputFileName.compare(pos, 5, ".aidl") == 0) { // 5 = strlen(".aidl") |
| 135 | options->outputFileName.replace(pos, 5, ".java"); // 5 = strlen(".aidl") |
| 136 | } else { |
| 137 | fprintf(stderr, "INPUT is not an .aidl file.\n"); |
| 138 | return usage(); |
| 139 | } |
| 140 | } |
| 141 | |
| 142 | // anything remaining? |
| 143 | if (i != argc) { |
| 144 | fprintf(stderr, "unknown option%s:", (i==argc-1?(const char*)"":(const char*)"s")); |
| 145 | for (; i<argc-1; i++) { |
| 146 | fprintf(stderr, " %s", argv[i]); |
| 147 | } |
| 148 | fprintf(stderr, "\n"); |
| 149 | return usage(); |
| 150 | } |
| 151 | |
| 152 | return 0; |
| 153 | } |
| 154 | |