1 /* C/ObjC/C++ command line option handling.
2 Copyright (C) 2002, 2003 Free Software Foundation, Inc.
3 Contributed by Neil Booth.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
24 #include "coretypes.h"
31 #include "langhooks.h"
32 #include "tree-inline.h"
33 #include "diagnostic.h"
35 #include "cppdefault.h"
36 #include "c-incpath.h"
37 #include "debug.h" /* For debug_hooks. */
41 #ifndef DOLLARS_IN_IDENTIFIERS
42 # define DOLLARS_IN_IDENTIFIERS true
45 #ifndef TARGET_SYSTEM_ROOT
46 # define TARGET_SYSTEM_ROOT NULL
49 static int saved_lineno;
52 static cpp_options *cpp_opts;
55 static const char **in_fnames;
56 unsigned num_in_fnames;
57 static const char *this_input_filename;
59 /* Filename and stream for preprocessed output. */
60 static const char *out_fname;
61 static FILE *out_stream;
63 /* Append dependencies to deps_file. */
64 static bool deps_append;
66 /* If dependency switches (-MF etc.) have been given. */
67 static bool deps_seen;
72 /* Dependency output file. */
73 static const char *deps_file;
75 /* The prefix given by -iprefix, if any. */
76 static const char *iprefix;
78 /* The system root, if any. Overridden by -isysroot. */
79 static const char *sysroot = TARGET_SYSTEM_ROOT;
81 /* Zero disables all standard directories for headers. */
82 static bool std_inc = true;
84 /* Zero disables the C++-specific standard directories for headers. */
85 static bool std_cxx_inc = true;
87 /* If the quote chain has been split by -I-. */
88 static bool quote_chain_split;
90 /* If -Wunused-macros. */
91 static bool warn_unused_macros;
93 /* Number of deferred options. */
94 static size_t deferred_count;
96 /* Number of deferred options scanned for -include. */
97 static size_t include_cursor;
99 /* Permit Fotran front-end options. */
100 static bool permit_fortran_options;
102 static void set_Wimplicit (int);
103 static void handle_OPT_d (const char *);
104 static void set_std_cxx98 (int);
105 static void set_std_c89 (int, int);
106 static void set_std_c99 (int);
107 static void check_deps_environment_vars (void);
108 static void handle_deferred_opts (void);
109 static void sanitize_cpp_opts (void);
110 static void add_prefixed_path (const char *, size_t);
111 static void push_command_line_include (void);
112 static void cb_file_change (cpp_reader *, const struct line_map *);
113 static void finish_options (const char *);
115 #ifndef STDC_0_IN_SYSTEM_HEADERS
116 #define STDC_0_IN_SYSTEM_HEADERS 0
119 /* Holds switches parsed by c_common_handle_option (), but whose
120 handling is deferred to c_common_post_options (). */
121 static void defer_opt (enum opt_code, const char *);
122 static struct deferred_opt
128 /* Complain that switch CODE expects an argument but none was
129 provided. OPT was the command-line option. Return FALSE to get
130 the default message in opts.c, TRUE if we provide a specialized
133 c_common_missing_argument (const char *opt, size_t code)
138 /* Pick up the default message. */
141 case OPT_fconstant_string_class_:
142 error ("no class name specified with \"%s\"", opt);
146 error ("assertion missing after \"%s\"", opt);
151 error ("macro name missing after \"%s\"", opt);
158 error ("missing path after \"%s\"", opt);
167 error ("missing filename after \"%s\"", opt);
172 error ("missing makefile target after \"%s\"", opt);
179 /* Defer option CODE with argument ARG. */
181 defer_opt (enum opt_code code, const char *arg)
183 deferred_opts[deferred_count].code = code;
184 deferred_opts[deferred_count].arg = arg;
188 /* Common initialization before parsing options. */
190 c_common_init_options (unsigned int argc, const char **argv ATTRIBUTE_UNUSED)
192 static const unsigned int lang_flags[] = {CL_C, CL_ObjC, CL_CXX, CL_ObjCXX};
195 /* This is conditionalized only because that is the way the front
196 ends used to do it. Maybe this should be unconditional? */
197 if (c_dialect_cxx ())
199 /* By default wrap lines at 80 characters. Is getenv
200 ("COLUMNS") preferable? */
201 diagnostic_line_cutoff (global_dc) = 80;
202 /* By default, emit location information once for every
203 diagnostic message. */
204 diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
207 parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
210 cpp_opts = cpp_get_options (parse_in);
211 cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
212 cpp_opts->objc = c_dialect_objc ();
214 /* Reset to avoid warnings on internal definitions. We set it just
215 before passing on command-line options to cpplib. */
216 cpp_opts->warn_dollars = 0;
218 flag_const_strings = c_dialect_cxx ();
219 flag_exceptions = c_dialect_cxx ();
220 warn_pointer_arith = c_dialect_cxx ();
222 deferred_opts = xmalloc (argc * sizeof (struct deferred_opt));
224 result = lang_flags[c_language];
226 /* If potentially preprocessing Fortran we have to accept its front
227 end options since the driver passes most of them through. */
229 if (c_language == clk_c && argc > 2
230 && !strcmp (argv[2], "-traditional-cpp" ))
232 permit_fortran_options = true;
240 /* Handle switch SCODE with argument ARG. ON is true, unless no-
241 form of an -f or -W option was given. Returns 0 if the switch was
242 invalid, a negative number to prevent language-independent
243 processing in toplev.c (a hack necessary for the short-term). */
245 c_common_handle_option (size_t scode, const char *arg, int value)
247 const struct cl_option *option = &cl_options[scode];
248 enum opt_code code = (enum opt_code) scode;
254 result = permit_fortran_options;
257 case OPT__output_pch_:
262 defer_opt (code, arg);
266 cpp_opts->discard_comments = 0;
270 cpp_opts->discard_comments = 0;
271 cpp_opts->discard_comments_in_macro_exp = 0;
275 defer_opt (code, arg);
279 flag_preprocess_only = 1;
283 cpp_opts->print_include_names = 1;
287 if (strcmp (arg, "-"))
288 add_path (xstrdup (arg), BRACKET, 0);
291 if (quote_chain_split)
292 error ("-I- specified twice");
293 quote_chain_split = true;
294 split_quote_chain ();
300 /* When doing dependencies with -M or -MM, suppress normal
301 preprocessed output, but still do -dM etc. as software
302 depends on this. Preprocessed output does occur if -MD, -MMD
303 or environment var dependency generation is used. */
304 cpp_opts->deps.style = (code == OPT_M ? DEPS_SYSTEM: DEPS_USER);
306 cpp_opts->inhibit_warnings = 1;
311 cpp_opts->deps.style = (code == OPT_MD ? DEPS_SYSTEM: DEPS_USER);
322 cpp_opts->deps.missing_files = true;
327 cpp_opts->deps.phony_targets = true;
333 defer_opt (code, arg);
337 flag_no_line_commands = 1;
341 defer_opt (code, arg);
351 set_Wimplicit (value);
352 warn_char_subscripts = value;
353 warn_missing_braces = value;
354 warn_parentheses = value;
355 warn_return_type = value;
356 warn_sequence_point = value; /* Was C only. */
357 if (c_dialect_cxx ())
358 warn_sign_compare = value;
360 warn_strict_aliasing = value;
362 /* Only warn about unknown pragmas that are not in system
364 warn_unknown_pragmas = value;
366 /* We save the value of warn_uninitialized, since if they put
367 -Wuninitialized on the command line, we need to generate a
368 warning about not using it without also specifying -O. */
369 if (warn_uninitialized != 1)
370 warn_uninitialized = (value ? 2 : 0);
372 if (!c_dialect_cxx ())
373 /* We set this to 2 here, but 1 in -Wmain, so -ffreestanding
374 can turn it off only if it's not explicit. */
375 warn_main = value * 2;
378 /* C++-specific warnings. */
379 warn_nonvdtor = value;
380 warn_reorder = value;
381 warn_nontemplate_friend = value;
384 cpp_opts->warn_trigraphs = value;
385 cpp_opts->warn_comments = value;
386 cpp_opts->warn_num_sign_change = value;
387 cpp_opts->warn_multichar = value; /* Was C++ only. */
390 case OPT_Wbad_function_cast:
391 warn_bad_function_cast = value;
395 warn_cast_qual = value;
398 case OPT_Wchar_subscripts:
399 warn_char_subscripts = value;
404 cpp_opts->warn_comments = value;
407 case OPT_Wconversion:
408 warn_conversion = value;
411 case OPT_Wctor_dtor_privacy:
412 warn_ctor_dtor_privacy = value;
415 case OPT_Wdeclaration_after_statement:
416 warn_declaration_after_statement = value;
419 case OPT_Wdeprecated:
420 warn_deprecated = value;
421 cpp_opts->warn_deprecated = value;
424 case OPT_Wdiv_by_zero:
425 warn_div_by_zero = value;
432 case OPT_Wendif_labels:
433 cpp_opts->warn_endif_labels = value;
437 cpp_opts->warnings_are_errors = value;
440 case OPT_Werror_implicit_function_declaration:
441 mesg_implicit_function_declaration = 2;
444 case OPT_Wfloat_equal:
445 warn_float_equal = value;
453 set_Wformat (atoi (arg));
456 case OPT_Wformat_extra_args:
457 warn_format_extra_args = value;
460 case OPT_Wformat_nonliteral:
461 warn_format_nonliteral = value;
464 case OPT_Wformat_security:
465 warn_format_security = value;
468 case OPT_Wformat_y2k:
469 warn_format_y2k = value;
472 case OPT_Wformat_zero_length:
473 warn_format_zero_length = value;
477 set_Wimplicit (value);
480 case OPT_Wimplicit_function_declaration:
481 mesg_implicit_function_declaration = value;
484 case OPT_Wimplicit_int:
485 warn_implicit_int = value;
489 cpp_opts->warn_import = value;
492 case OPT_Winvalid_offsetof:
493 warn_invalid_offsetof = value;
496 case OPT_Winvalid_pch:
497 cpp_opts->warn_invalid_pch = value;
501 warn_long_long = value;
511 case OPT_Wmissing_braces:
512 warn_missing_braces = value;
515 case OPT_Wmissing_declarations:
516 warn_missing_declarations = value;
519 case OPT_Wmissing_format_attribute:
520 warn_missing_format_attribute = value;
523 case OPT_Wmissing_prototypes:
524 warn_missing_prototypes = value;
528 cpp_opts->warn_multichar = value;
531 case OPT_Wnested_externs:
532 warn_nested_externs = value;
535 case OPT_Wnon_template_friend:
536 warn_nontemplate_friend = value;
539 case OPT_Wnon_virtual_dtor:
540 warn_nonvdtor = value;
544 warn_nonnull = value;
547 case OPT_Wold_style_cast:
548 warn_old_style_cast = value;
551 case OPT_Woverloaded_virtual:
552 warn_overloaded_virtual = value;
555 case OPT_Wparentheses:
556 warn_parentheses = value;
559 case OPT_Wpmf_conversions:
560 warn_pmf2ptr = value;
563 case OPT_Wpointer_arith:
564 warn_pointer_arith = value;
568 warn_protocol = value;
572 warn_selector = value;
575 case OPT_Wredundant_decls:
576 warn_redundant_decls = value;
580 warn_reorder = value;
583 case OPT_Wreturn_type:
584 warn_return_type = value;
587 case OPT_Wsequence_point:
588 warn_sequence_point = value;
591 case OPT_Wsign_compare:
592 warn_sign_compare = value;
595 case OPT_Wsign_promo:
596 warn_sign_promo = value;
599 case OPT_Wstrict_prototypes:
600 warn_strict_prototypes = value;
607 case OPT_Wsystem_headers:
608 cpp_opts->warn_system_headers = value;
611 case OPT_Wtraditional:
612 warn_traditional = value;
613 cpp_opts->warn_traditional = value;
617 cpp_opts->warn_trigraphs = value;
620 case OPT_Wundeclared_selector:
621 warn_undeclared_selector = value;
625 cpp_opts->warn_undef = value;
628 case OPT_Wunknown_pragmas:
629 /* Set to greater than 1, so that even unknown pragmas in
630 system headers will be warned about. */
631 warn_unknown_pragmas = value * 2;
634 case OPT_Wunused_macros:
635 warn_unused_macros = value;
638 case OPT_Wwrite_strings:
639 if (!c_dialect_cxx ())
640 flag_const_strings = value;
642 warn_write_strings = value;
646 if (!c_dialect_cxx ())
647 set_std_c89 (false, true);
649 set_std_cxx98 (true);
656 case OPT_fcond_mismatch:
657 if (!c_dialect_cxx ())
659 flag_cond_mismatch = value;
664 case OPT_fall_virtual:
665 case OPT_fenum_int_equiv:
666 case OPT_fguiding_decls:
668 case OPT_fhuge_objects:
670 case OPT_fname_mangling_version_:
672 case OPT_fnonnull_objects:
674 case OPT_fstrict_prototype:
675 case OPT_fthis_is_variable:
676 case OPT_fvtable_thunks:
679 warning ("switch \"%s\" is no longer supported", option->opt_text);
682 case OPT_fabi_version_:
683 flag_abi_version = value;
686 case OPT_faccess_control:
687 flag_access_control = value;
690 case OPT_falt_external_templates:
691 flag_alt_external_templates = value;
693 flag_external_templates = true;
695 warning ("switch \"%s\" is deprecated, please see documentation "
696 "for details", option->opt_text);
700 flag_no_asm = !value;
704 flag_no_builtin = !value;
711 disable_builtin_function (arg);
714 case OPT_fdollars_in_identifiers:
715 cpp_opts->dollars_in_ident = value;
719 if (!dump_switch_p (arg))
723 case OPT_ffreestanding:
725 /* Fall through.... */
728 flag_no_builtin = !value;
729 /* warn_main will be 2 if set by -Wall, 1 if set by -Wmain */
730 if (!value && warn_main == 2)
734 case OPT_fshort_double:
735 flag_short_double = value;
738 case OPT_fshort_enums:
739 flag_short_enums = value;
742 case OPT_fshort_wchar:
743 flag_short_wchar = value;
746 case OPT_fsigned_bitfields:
747 flag_signed_bitfields = value;
748 explicit_flag_signed_bitfields = 1;
751 case OPT_fsigned_char:
752 flag_signed_char = value;
755 case OPT_funsigned_bitfields:
756 flag_signed_bitfields = !value;
757 explicit_flag_signed_bitfields = 1;
760 case OPT_funsigned_char:
761 flag_signed_char = !value;
765 flag_check_new = value;
768 case OPT_fconserve_space:
769 flag_conserve_space = value;
772 case OPT_fconst_strings:
773 flag_const_strings = value;
776 case OPT_fconstant_string_class_:
777 constant_string_class_name = arg;
780 case OPT_fdefault_inline:
781 flag_default_inline = value;
784 case OPT_felide_constructors:
785 flag_elide_constructors = value;
788 case OPT_fenforce_eh_specs:
789 flag_enforce_eh_specs = value;
792 case OPT_fexternal_templates:
793 flag_external_templates = value;
796 case OPT_ffixed_form:
797 case OPT_ffixed_line_length_:
798 /* Fortran front end options ignored when preprocessing only. */
799 if (!flag_preprocess_only)
804 flag_new_for_scope = value;
807 case OPT_fgnu_keywords:
808 flag_no_gnu_keywords = !value;
811 case OPT_fgnu_runtime:
812 flag_next_runtime = !value;
815 case OPT_fhandle_exceptions:
816 warning ("-fhandle-exceptions has been renamed -fexceptions (and is now on by default)");
817 flag_exceptions = value;
820 case OPT_fimplement_inlines:
821 flag_implement_inlines = value;
824 case OPT_fimplicit_inline_templates:
825 flag_implicit_inline_templates = value;
828 case OPT_fimplicit_templates:
829 flag_implicit_templates = value;
832 case OPT_fms_extensions:
833 flag_ms_extensions = value;
836 case OPT_fnext_runtime:
837 flag_next_runtime = value;
840 case OPT_fnonansi_builtins:
841 flag_no_nonansi_builtin = !value;
844 case OPT_foperator_names:
845 cpp_opts->operator_names = value;
848 case OPT_foptional_diags:
849 flag_optional_diags = value;
853 cpp_opts->restore_pch_deps = value;
856 case OPT_fpermissive:
857 flag_permissive = value;
860 case OPT_fpreprocessed:
861 cpp_opts->preprocessed = value;
865 flag_use_repository = value;
867 flag_implicit_templates = 0;
874 case OPT_fshow_column:
875 cpp_opts->show_column = value;
879 flag_detailed_statistics = value;
883 /* It is documented that we silently ignore silly values. */
884 if (value >= 1 && value <= 100)
885 cpp_opts->tabstop = value;
888 case OPT_fexec_charset_:
889 cpp_opts->narrow_charset = arg;
892 case OPT_fwide_exec_charset_:
893 cpp_opts->wide_charset = arg;
896 case OPT_ftemplate_depth_:
897 max_tinst_depth = value;
900 case OPT_fuse_cxa_atexit:
901 flag_use_cxa_atexit = value;
909 flag_gen_declaration = 1;
913 add_path (xstrdup (arg), AFTER, 0);
918 defer_opt (code, arg);
930 add_path (xstrdup (arg), SYSTEM, 0);
933 case OPT_iwithprefix:
934 add_prefixed_path (arg, SYSTEM);
937 case OPT_iwithprefixbefore:
938 add_prefixed_path (arg, BRACKET);
942 cpp_set_lang (parse_in, CLK_ASM);
943 cpp_opts->dollars_in_ident = false;
962 error ("output filename specified twice");
965 /* We need to handle the -pedantic switches here, rather than in
966 c_common_post_options, so that a subsequent -Wno-endif-labels
967 is not overridden. */
968 case OPT_pedantic_errors:
969 cpp_opts->pedantic_errors = 1;
972 cpp_opts->pedantic = 1;
973 cpp_opts->warn_endif_labels = 1;
976 case OPT_print_objc_runtime_info:
977 print_struct_values = 1;
985 case OPT_std_gnu__98:
986 set_std_cxx98 (code == OPT_std_c__98 /* ISO */);
990 case OPT_std_iso9899_1990:
991 case OPT_std_iso9899_199409:
992 set_std_c89 (code == OPT_std_iso9899_199409 /* c94 */, true /* ISO */);
996 set_std_c89 (false /* c94 */, false /* ISO */);
1001 case OPT_std_iso9899_1999:
1002 case OPT_std_iso9899_199x:
1003 set_std_c99 (true /* ISO */);
1008 set_std_c99 (false /* ISO */);
1012 cpp_opts->trigraphs = 1;
1015 case OPT_traditional_cpp:
1016 cpp_opts->traditional = 1;
1024 cpp_opts->inhibit_warnings = 1;
1035 /* Handle FILENAME from the command line. */
1037 c_common_handle_filename (const char *filename)
1040 in_fnames = xrealloc (in_fnames, num_in_fnames * sizeof (in_fnames[0]));
1041 in_fnames[num_in_fnames - 1] = filename;
1044 /* Post-switch processing. */
1046 c_common_post_options (const char **pfilename)
1048 /* Canonicalize the input and output filenames. */
1049 if (in_fnames == NULL)
1051 in_fnames = xmalloc (sizeof (in_fnames[0]));
1054 else if (strcmp (in_fnames[0], "-") == 0)
1057 if (out_fname == NULL || !strcmp (out_fname, "-"))
1060 if (cpp_opts->deps.style == DEPS_NONE)
1061 check_deps_environment_vars ();
1063 handle_deferred_opts ();
1065 sanitize_cpp_opts ();
1067 register_include_chains (parse_in, sysroot, iprefix,
1068 std_inc, std_cxx_inc && c_dialect_cxx (), verbose);
1070 flag_inline_trees = 1;
1072 /* Use tree inlining if possible. Function instrumentation is only
1073 done in the RTL level, so we disable tree inlining. */
1074 if (! flag_instrument_function_entry_exit)
1076 if (!flag_no_inline)
1078 if (flag_inline_functions)
1080 flag_inline_trees = 2;
1081 flag_inline_functions = 0;
1085 /* -Wextra implies -Wsign-compare, but not if explicitly
1087 if (warn_sign_compare == -1)
1088 warn_sign_compare = extra_warnings;
1090 /* Special format checking options don't work without -Wformat; warn if
1092 if (warn_format_y2k && !warn_format)
1093 warning ("-Wformat-y2k ignored without -Wformat");
1094 if (warn_format_extra_args && !warn_format)
1095 warning ("-Wformat-extra-args ignored without -Wformat");
1096 if (warn_format_zero_length && !warn_format)
1097 warning ("-Wformat-zero-length ignored without -Wformat");
1098 if (warn_format_nonliteral && !warn_format)
1099 warning ("-Wformat-nonliteral ignored without -Wformat");
1100 if (warn_format_security && !warn_format)
1101 warning ("-Wformat-security ignored without -Wformat");
1102 if (warn_missing_format_attribute && !warn_format)
1103 warning ("-Wmissing-format-attribute ignored without -Wformat");
1105 if (flag_preprocess_only)
1107 /* Open the output now. We must do so even if flag_no_output is
1108 on, because there may be other output than from the actual
1109 preprocessing (e.g. from -dM). */
1110 if (out_fname[0] == '\0')
1111 out_stream = stdout;
1113 out_stream = fopen (out_fname, "w");
1115 if (out_stream == NULL)
1117 fatal_error ("opening output file %s: %m", out_fname);
1121 if (num_in_fnames > 1)
1122 error ("too many filenames given. Type %s --help for usage",
1125 init_pp_output (out_stream);
1131 /* Yuk. WTF is this? I do know ObjC relies on it somewhere. */
1135 cpp_get_callbacks (parse_in)->file_change = cb_file_change;
1137 /* NOTE: we use in_fname here, not the one supplied. */
1138 *pfilename = cpp_read_main_file (parse_in, in_fnames[0]);
1140 saved_lineno = input_line;
1143 /* If an error has occurred in cpplib, note it so we fail
1145 errorcount += cpp_errors (parse_in);
1147 return flag_preprocess_only;
1150 /* Front end initialization common to C, ObjC and C++. */
1152 c_common_init (void)
1154 input_line = saved_lineno;
1156 /* Set up preprocessor arithmetic. Must be done after call to
1157 c_common_nodes_and_builtins for type nodes to be good. */
1158 cpp_opts->precision = TYPE_PRECISION (intmax_type_node);
1159 cpp_opts->char_precision = TYPE_PRECISION (char_type_node);
1160 cpp_opts->int_precision = TYPE_PRECISION (integer_type_node);
1161 cpp_opts->wchar_precision = TYPE_PRECISION (wchar_type_node);
1162 cpp_opts->unsigned_wchar = TREE_UNSIGNED (wchar_type_node);
1163 cpp_opts->bytes_big_endian = BYTES_BIG_ENDIAN;
1165 /* This can't happen until after wchar_precision and bytes_big_endian
1167 cpp_init_iconv (parse_in);
1169 if (flag_preprocess_only)
1171 finish_options (in_fnames[0]);
1172 preprocess_file (parse_in);
1176 /* Has to wait until now so that cpplib has its hash table. */
1182 /* Initialize the integrated preprocessor after debug output has been
1183 initialized; loop over each input file. */
1185 c_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
1187 unsigned file_index;
1190 yydebug = set_yydebug;
1192 warning ("YYDEBUG not defined");
1201 /* Reset the state of the parser. */
1204 /* Reset cpplib's macros and start a new file. */
1205 cpp_undef_all (parse_in);
1206 cpp_stack_file (parse_in, in_fnames[file_index]);
1209 finish_options(in_fnames[file_index]);
1210 if (file_index == 0)
1215 } while (file_index < num_in_fnames);
1217 free_parser_stacks ();
1221 /* Common finish hook for the C, ObjC and C++ front ends. */
1223 c_common_finish (void)
1225 FILE *deps_stream = NULL;
1227 if (cpp_opts->deps.style != DEPS_NONE)
1229 /* If -M or -MM was seen without -MF, default output to the
1232 deps_stream = out_stream;
1235 deps_stream = fopen (deps_file, deps_append ? "a": "w");
1237 fatal_error ("opening dependency file %s: %m", deps_file);
1241 /* For performance, avoid tearing down cpplib's internal structures
1242 with cpp_destroy (). */
1243 errorcount += cpp_finish (parse_in, deps_stream);
1245 if (deps_stream && deps_stream != out_stream
1246 && (ferror (deps_stream) || fclose (deps_stream)))
1247 fatal_error ("closing dependency file %s: %m", deps_file);
1249 if (out_stream && (ferror (out_stream) || fclose (out_stream)))
1250 fatal_error ("when writing output to %s: %m", out_fname);
1253 /* Either of two environment variables can specify output of
1254 dependencies. Their value is either "OUTPUT_FILE" or "OUTPUT_FILE
1255 DEPS_TARGET", where OUTPUT_FILE is the file to write deps info to
1256 and DEPS_TARGET is the target to mention in the deps. They also
1257 result in dependency information being appended to the output file
1258 rather than overwriting it, and like Sun's compiler
1259 SUNPRO_DEPENDENCIES suppresses the dependency on the main file. */
1261 check_deps_environment_vars (void)
1265 GET_ENVIRONMENT (spec, "DEPENDENCIES_OUTPUT");
1267 cpp_opts->deps.style = DEPS_USER;
1270 GET_ENVIRONMENT (spec, "SUNPRO_DEPENDENCIES");
1273 cpp_opts->deps.style = DEPS_SYSTEM;
1274 cpp_opts->deps.ignore_main_file = true;
1280 /* Find the space before the DEPS_TARGET, if there is one. */
1281 char *s = strchr (spec, ' ');
1284 /* Let the caller perform MAKE quoting. */
1285 defer_opt (OPT_MT, s + 1);
1289 /* Command line -MF overrides environment variables and default. */
1297 /* Handle deferred command line switches. */
1299 handle_deferred_opts (void)
1303 for (i = 0; i < deferred_count; i++)
1305 struct deferred_opt *opt = &deferred_opts[i];
1307 if (opt->code == OPT_MT || opt->code == OPT_MQ)
1308 cpp_add_dependency_target (parse_in, opt->arg, opt->code == OPT_MQ);
1312 /* These settings are appropriate for GCC, but not necessarily so for
1313 cpplib as a library. */
1315 sanitize_cpp_opts (void)
1317 /* If we don't know what style of dependencies to output, complain
1318 if any other dependency switches have been given. */
1319 if (deps_seen && cpp_opts->deps.style == DEPS_NONE)
1320 error ("to generate dependencies you must specify either -M or -MM");
1322 /* -dM and dependencies suppress normal output; do it here so that
1323 the last -d[MDN] switch overrides earlier ones. */
1324 if (flag_dump_macros == 'M')
1327 /* Disable -dD, -dN and -dI if normal output is suppressed. Allow
1328 -dM since at least glibc relies on -M -dM to work. */
1331 if (flag_dump_macros != 'M')
1332 flag_dump_macros = 0;
1333 flag_dump_includes = 0;
1336 cpp_opts->unsigned_char = !flag_signed_char;
1337 cpp_opts->stdc_0_in_system_headers = STDC_0_IN_SYSTEM_HEADERS;
1339 /* We want -Wno-long-long to override -pedantic -std=non-c99
1340 and/or -Wtraditional, whatever the ordering. */
1341 cpp_opts->warn_long_long
1342 = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
1345 /* Add include path with a prefix at the front of its name. */
1347 add_prefixed_path (const char *suffix, size_t chain)
1351 size_t prefix_len, suffix_len;
1353 suffix_len = strlen (suffix);
1354 prefix = iprefix ? iprefix : cpp_GCC_INCLUDE_DIR;
1355 prefix_len = iprefix ? strlen (iprefix) : cpp_GCC_INCLUDE_DIR_len;
1357 path = xmalloc (prefix_len + suffix_len + 1);
1358 memcpy (path, prefix, prefix_len);
1359 memcpy (path + prefix_len, suffix, suffix_len);
1360 path[prefix_len + suffix_len] = '\0';
1362 add_path (path, chain, 0);
1365 /* Handle -D, -U, -A, -imacros, and the first -include.
1366 TIF is the input file to which we will return after processing all
1369 finish_options (const char *tif)
1371 if (!cpp_opts->preprocessed)
1375 cpp_change_file (parse_in, LC_RENAME, _("<built-in>"));
1376 cpp_init_builtins (parse_in, flag_hosted);
1377 c_cpp_builtins (parse_in);
1379 /* We're about to send user input to cpplib, so make it warn for
1380 things that we previously (when we sent it internal definitions)
1381 told it to not warn.
1383 C99 permits implementation-defined characters in identifiers.
1384 The documented meaning of -std= is to turn off extensions that
1385 conflict with the specified standard, and since a strictly
1386 conforming program cannot contain a '$', we do not condition
1387 their acceptance on the -std= setting. */
1388 cpp_opts->warn_dollars = (cpp_opts->pedantic && !cpp_opts->c99);
1390 cpp_change_file (parse_in, LC_RENAME, _("<command line>"));
1391 for (i = 0; i < deferred_count; i++)
1393 struct deferred_opt *opt = &deferred_opts[i];
1395 if (opt->code == OPT_D)
1396 cpp_define (parse_in, opt->arg);
1397 else if (opt->code == OPT_U)
1398 cpp_undef (parse_in, opt->arg);
1399 else if (opt->code == OPT_A)
1401 if (opt->arg[0] == '-')
1402 cpp_unassert (parse_in, opt->arg + 1);
1404 cpp_assert (parse_in, opt->arg);
1408 /* Handle -imacros after -D and -U. */
1409 for (i = 0; i < deferred_count; i++)
1411 struct deferred_opt *opt = &deferred_opts[i];
1413 if (opt->code == OPT_imacros
1414 && cpp_push_include (parse_in, opt->arg))
1415 cpp_scan_nooutput (parse_in);
1420 this_input_filename = tif;
1421 push_command_line_include ();
1424 /* Give CPP the next file given by -include, if any. */
1426 push_command_line_include (void)
1428 if (cpp_opts->preprocessed)
1431 while (include_cursor < deferred_count)
1433 struct deferred_opt *opt = &deferred_opts[include_cursor++];
1435 if (opt->code == OPT_include && cpp_push_include (parse_in, opt->arg))
1439 if (include_cursor == deferred_count)
1441 /* Restore the line map from <command line>. */
1442 cpp_change_file (parse_in, LC_RENAME, this_input_filename);
1443 /* -Wunused-macros should only warn about macros defined hereafter. */
1444 cpp_opts->warn_unused_macros = warn_unused_macros;
1449 /* File change callback. Has to handle -include files. */
1451 cb_file_change (cpp_reader *pfile ATTRIBUTE_UNUSED,
1452 const struct line_map *new_map)
1454 if (flag_preprocess_only)
1455 pp_file_change (new_map);
1457 fe_file_change (new_map);
1459 if (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map))
1460 push_command_line_include ();
1463 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
1464 extensions if ISO). There is no concept of gnu94. */
1466 set_std_c89 (int c94, int iso)
1468 cpp_set_lang (parse_in, c94 ? CLK_STDC94: iso ? CLK_STDC89: CLK_GNUC89);
1471 flag_no_gnu_keywords = iso;
1472 flag_no_nonansi_builtin = iso;
1473 flag_noniso_default_format_attributes = !iso;
1476 flag_writable_strings = 0;
1479 /* Set the C 99 standard (without GNU extensions if ISO). */
1481 set_std_c99 (int iso)
1483 cpp_set_lang (parse_in, iso ? CLK_STDC99: CLK_GNUC99);
1485 flag_no_nonansi_builtin = iso;
1486 flag_noniso_default_format_attributes = !iso;
1490 flag_writable_strings = 0;
1493 /* Set the C++ 98 standard (without GNU extensions if ISO). */
1495 set_std_cxx98 (int iso)
1497 cpp_set_lang (parse_in, iso ? CLK_CXX98: CLK_GNUCXX);
1498 flag_no_gnu_keywords = iso;
1499 flag_no_nonansi_builtin = iso;
1500 flag_noniso_default_format_attributes = !iso;
1504 /* Handle setting implicit to ON. */
1506 set_Wimplicit (int on)
1509 warn_implicit_int = on;
1512 if (mesg_implicit_function_declaration != 2)
1513 mesg_implicit_function_declaration = 1;
1516 mesg_implicit_function_declaration = 0;
1519 /* Args to -d specify what to dump. Silently ignore
1520 unrecognized options; they may be aimed at toplev.c. */
1522 handle_OPT_d (const char *arg)
1526 while ((c = *arg++) != '\0')
1529 case 'M': /* Dump macros only. */
1530 case 'N': /* Dump names. */
1531 case 'D': /* Dump definitions. */
1532 flag_dump_macros = c;
1536 flag_dump_includes = 1;