Changeset 2489 in kBuild
- Timestamp:
- Jul 22, 2011 11:12:06 AM (14 years ago)
- Location:
- trunk/src/kmk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/Makefile.am
r2266 r2489 129 129 -DCONFIG_WITHOUT_THREADS \ 130 130 -DCONFIG_WITH_VALUE_LENGTH \ 131 \ 132 -DCONFIG_WITH_ABSPATHEX \ 133 -DCONFIG_WITH_COMMANDS_FUNC \ 134 -DCONFIG_WITH_DATE \ 135 -DCONFIG_WITH_DEFINED_FUNCTIONS \ 136 -DCONFIG_WITH_EVALPLUS \ 137 -DCONFIG_WITH_FILE_SIZE \ 138 -DCONFIG_WITH_LOOP_FUNCTIONS \ 139 -DCONFIG_WITH_MATH \ 140 -DCONFIG_WITH_NANOTS \ 141 -DCONFIG_WITH_ROOT_FUNC \ 131 142 -DCONFIG_WITH_RSORT \ 132 -DCONFIG_WITH_ABSPATHEX \ 143 -DCONFIG_WITH_STACK \ 144 -DCONFIG_WITH_STRING_FUNCTIONS \ 145 -DCONFIG_WITH_WHICH \ 146 -DCONFIG_WITH_XARGS \ 147 \ 133 148 -DCONFIG_WITH_COMPARE \ 134 -DCONFIG_WITH_STACK \135 -DCONFIG_WITH_MATH \136 -DCONFIG_WITH_XARGS \137 -DCONFIG_WITH_NANOTS \138 149 -DCONFIG_WITH_SET_CONDITIONALS \ 139 150 -DCONFIG_WITH_IF_CONDITIONALS \ 140 -DCONFIG_WITH_DATE \141 -DCONFIG_WITH_FILE_SIZE \142 -DCONFIG_WITH_WHICH \143 151 -DCONFIG_WITH_PRINTF \ 144 -DCONFIG_WITH_EVALPLUS \145 152 -DCONFIG_WITH_MINIMAL_STATS \ 146 -DCONFIG_WITH_COMMANDS_FUNC \147 -DCONFIG_WITH_STRING_FUNCTIONS \148 -DCONFIG_WITH_LOOP_FUNCTIONS \149 -DCONFIG_WITH_ROOT_FUNC \150 153 -DCONFIG_PRETTY_COMMAND_PRINTING \ 151 154 -DCONFIG_WITH_PRINT_STATS_SWITCH \ -
trunk/src/kmk/Makefile.kmk
r2462 r2489 154 154 CONFIG_NO_DEFAULT_SUFFIX_RULES \ 155 155 CONFIG_NO_DEFAULT_VARIABLES \ 156 \ 157 CONFIG_WITH_ABSPATHEX \ 158 CONFIG_WITH_COMMANDS_FUNC \ 159 CONFIG_WITH_DATE \ 160 CONFIG_WITH_DEFINED_FUNCTIONS \ 161 CONFIG_WITH_EVALPLUS \ 162 CONFIG_WITH_FILE_SIZE \ 163 CONFIG_WITH_LOOP_FUNCTIONS \ 164 CONFIG_WITH_MATH \ 165 CONFIG_WITH_NANOTS \ 166 CONFIG_WITH_ROOT_FUNC \ 167 CONFIG_WITH_RSORT \ 168 CONFIG_WITH_STACK \ 169 CONFIG_WITH_STRING_FUNCTIONS \ 170 CONFIG_WITH_WHICH \ 171 CONFIG_WITH_XARGS \ 172 \ 156 173 CONFIG_WITH_EXTENDED_NOTPARALLEL \ 157 174 CONFIG_WITH_INCLUDEDEP \ 158 175 CONFIG_WITH_VALUE_LENGTH \ 159 CONFIG_WITH_RSORT \160 CONFIG_WITH_ABSPATHEX \161 176 CONFIG_WITH_COMPARE \ 162 CONFIG_WITH_STACK \163 CONFIG_WITH_MATH \164 CONFIG_WITH_XARGS \165 CONFIG_WITH_NANOTS \166 177 CONFIG_WITH_SET_CONDITIONALS \ 167 178 CONFIG_WITH_IF_CONDITIONALS \ 168 CONFIG_WITH_DATE \169 CONFIG_WITH_FILE_SIZE \170 CONFIG_WITH_WHICH \171 179 CONFIG_WITH_PRINTF \ 172 CONFIG_WITH_EVALPLUS \173 180 CONFIG_WITH_MINIMAL_STATS \ 174 CONFIG_WITH_COMMANDS_FUNC \ 175 CONFIG_WITH_PRINTF \ 176 CONFIG_WITH_STRING_FUNCTIONS \ 177 CONFIG_WITH_LOOP_FUNCTIONS \ 178 CONFIG_WITH_ROOT_FUNC \ 181 \ 179 182 CONFIG_PRETTY_COMMAND_PRINTING \ 180 183 CONFIG_WITH_PRINT_STATS_SWITCH \ … … 219 222 version.c \ 220 223 vpath.c \ 221 remote-stub.c 224 remote-stub.c 222 225 223 226 kmk_DEFS.freebsd.x86 = CONFIG_WITHOUT_THREADS … … 408 411 CONFIG_WITH_TOUPPER_TOLOWER \ 409 412 EXPERIMENTAL 410 # NO_ARCHIVES 413 # NO_ARCHIVES 411 414 412 415 kmk_gmake_SOURCES = \ -
trunk/src/kmk/function.c
r2462 r2489 1021 1021 } 1022 1022 1023 #ifdef CONFIG_WITH_DEFINED_FUNCTIONS 1024 1025 /* Used by func_firstdefined and func_lastdefined to parse the optional last 1026 argument. Returns 0 if the variable name is to be returned and 1 if it's 1027 the variable value value. */ 1028 static int 1029 parse_value_name_argument (const char *arg1, const char *funcname) 1030 { 1031 const char *end; 1032 int rc; 1033 1034 if (arg1 == NULL) 1035 return 0; 1036 1037 end = strchr (arg1, '\0'); 1038 strip_whitespace (&arg1, &end); 1039 1040 if (!strncmp (arg1, "name", end - arg1)) 1041 rc = 0; 1042 else if (!strncmp (arg1, "value", end - arg1)) 1043 rc = 1; 1044 else 1045 { 1046 #if 0 /* FIXME: later */ 1047 /* check the expanded form */ 1048 char *exp = expand_argument (arg1, strchr (arg1, '\0')); 1049 arg1 = exp; 1050 end = strchr (arg1, '\0'); 1051 strip_whitespace (&arg1, &end); 1052 1053 if (!strncmp (arg1, "name", end - arg1)) 1054 rc = 0; 1055 else if (!strncmp (arg1, "value", end - arg1)) 1056 rc = 1; 1057 else 1058 #endif 1059 fatal (*expanding_var, 1060 _("second argument to `%s' function must be `name' or `value', not `%s'"), 1061 funcname, exp); 1062 #if 0 1063 free (exp); 1064 #endif 1065 } 1066 1067 return rc; 1068 } 1069 1070 /* Given a list of variable names (ARGV[0]), returned the first variable which 1071 is defined (i.e. value is not empty). ARGV[1] indicates whether to return 1072 the variable name or its value. */ 1073 static char * 1074 func_firstdefined (char *o, char **argv, const char *funcname) 1075 { 1076 unsigned int i; 1077 const char *words = argv[0]; /* Use a temp variable for find_next_token */ 1078 const char *p; 1079 int ret_value = parse_value_name_argument (argv[1], funcname); 1080 1081 /* FIXME: Optimize by not expanding the arguments, but instead expand them 1082 one by one here. This will require a find_next_token variant which 1083 takes `$(' and `)' into account. */ 1084 while ((p = find_next_token (&words, &i)) != NULL) 1085 { 1086 struct variable *v = lookup_variable (p, i); 1087 if (v && v->value_length) 1088 { 1089 if (ret_value) 1090 variable_expand_string_2 (o, v->value, v->value_length, &o); 1091 else 1092 o = variable_buffer_output (o, p, i); 1093 break; 1094 } 1095 } 1096 1097 return o; 1098 } 1099 1100 /* Given a list of variable names (ARGV[0]), returned the last variable which 1101 is defined (i.e. value is not empty). ARGV[1] indicates whether to return 1102 the variable name or its value. */ 1103 static char * 1104 func_lastdefined (char *o, char **argv, const char *funcname) 1105 { 1106 struct variable *last_v = NULL; 1107 unsigned int i; 1108 const char *words = argv[0]; /* Use a temp variable for find_next_token */ 1109 const char *p; 1110 int ret_value = parse_value_name_argument (argv[1], funcname); 1111 1112 /* FIXME: Optimize this. Walk from the end on unexpanded arguments. */ 1113 while ((p = find_next_token (&words, &i)) != NULL) 1114 { 1115 struct variable *v = lookup_variable (p, i); 1116 if (v && v->value_length) 1117 { 1118 last_v = v; 1119 break; 1120 } 1121 } 1122 1123 if (last_v != NULL) 1124 { 1125 if (ret_value) 1126 variable_expand_string_2 (o, last_v->value, last_v->value_length, &o); 1127 else 1128 o = variable_buffer_output (o, last_v->name, last_v->length); 1129 } 1130 return o; 1131 } 1132 1133 #endif /* CONFIG_WITH_DEFINED_FUNCTIONS */ 1023 1134 1024 1135 static char * … … 5154 5265 { STRING_SIZE_TUPLE("filter-out"), 2, 2, 1, func_filter_filterout}, 5155 5266 { STRING_SIZE_TUPLE("findstring"), 2, 2, 1, func_findstring}, 5267 #ifdef CONFIG_WITH_DEFINED_FUNCTIONS 5268 { STRING_SIZE_TUPLE("firstdefined"), 0, 2, 1, func_firstdefined}, 5269 #endif 5156 5270 { STRING_SIZE_TUPLE("firstword"), 0, 1, 1, func_firstword}, 5157 5271 { STRING_SIZE_TUPLE("flavor"), 0, 1, 1, func_flavor}, 5158 5272 { STRING_SIZE_TUPLE("join"), 2, 2, 1, func_join}, 5273 #ifdef CONFIG_WITH_DEFINED_FUNCTIONS 5274 { STRING_SIZE_TUPLE("lastdefined"), 0, 2, 1, func_lastdefined}, 5275 #endif 5159 5276 { STRING_SIZE_TUPLE("lastword"), 0, 1, 1, func_lastword}, 5160 5277 { STRING_SIZE_TUPLE("patsubst"), 3, 3, 1, func_patsubst}, -
trunk/src/kmk/variable.c
r2480 r2489 1297 1297 && defined (CONFIG_WITH_ROOT_FUNC) \ 1298 1298 && defined (CONFIG_WITH_STRING_FUNCTIONS) \ 1299 && defined (CONFIG_WITH_DEFINED_FUNCTIONS) \ 1299 1300 && defined (KMK_HELPERS) 1300 1301 (void) define_variable ("KMK_FEATURES", 12, … … 1324 1325 " length insert pos lastpos substr translate" 1325 1326 " kb-src-tool kb-obj-base kb-obj-suff kb-src-prop kb-src-one kb-exp-tmpl " 1327 " firstdefined lastdefined " 1326 1328 , o_default, 0); 1327 1329 # else /* MSC can't deal with strings mixed with #if/#endif, thus the slow way. */ … … 1397 1399 strcat (buf, " length insert pos lastpos substr translate"); 1398 1400 # endif 1401 # if defined (CONFIG_WITH_DEFINED_FUNCTIONS) 1402 strcat (buf, " firstdefined lastdefined"); 1403 # endif 1399 1404 # if defined (KMK_HELPERS) 1400 1405 strcat (buf, " kb-src-tool kb-obj-base kb-obj-suff kb-src-prop kb-src-one kb-exp-tmpl");
Note:
See TracChangeset
for help on using the changeset viewer.