1 /* Subroutines for the gcc driver.
2 Copyright (C) 2009-2017 Free Software Foundation, Inc.
3 Contributed by Georg-Johann Lay <avr@gjlay.de>
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #define IN_TARGET_CODE 1
25 #include "coretypes.h"
26 #include "diagnostic.h"
29 // Remove -nodevicelib from the command line if not needed
30 #define X_NODEVLIB "%<nodevicelib"
32 static const char dir_separator_str
[] = { DIR_SEPARATOR
, 0 };
35 /* Implement spec function `device-specs-fileĀ“.
37 Validate mcu name given with -mmcu option. Compose
38 -specs=<specs-file-name>%s. If everything went well then argv[0] is the
39 inflated (absolute) first device-specs directory and argv[1] is a device
40 or core name as supplied by -mmcu=*. When building GCC the path might be
44 avr_devicespecs_file (int argc
, const char **argv
)
46 const char *mmcu
= NULL
;
50 fnotice (stderr
, "Running spec function '%s' with %d args\n\n",
57 fatal_error (input_location
,
58 "bad usage of spec function %qs", "device-specs-file");
62 if (strcmp ("device-specs", argv
[0]) == 0)
64 /* FIXME: This means "device-specs%s" from avr.h:DRIVER_SELF_SPECS
65 has not been resolved to a path. That case can occur when the
66 c++ testsuite is run from the build directory. DejaGNU's
67 libgloss.exp:get_multilibs runs $compiler without -B, i.e.runs
68 xgcc without specifying a prefix. Without any prefix, there is
69 no means to find out where the specs files might be located.
70 get_multilibs runs xgcc --print-multi-lib, hence we don't actually
71 need information form a specs file and may skip it here. */
75 mmcu
= AVR_MMCU_DEFAULT
;
81 // Allow specifying the same MCU more than once.
83 for (int i
= 2; i
< argc
; i
++)
84 if (strcmp (mmcu
, argv
[i
]) != 0)
86 error ("specified option %qs more than once", "-mmcu");
93 // Filter out silly -mmcu= arguments like "foo bar".
95 for (const char *s
= mmcu
; *s
; s
++)
100 error ("strange device name %qs after %qs: bad character %qc",
105 return concat ("-specs=device-specs", dir_separator_str
, "specs-",
107 #if defined (WITH_AVRLIBC)
108 " %{mmcu=avr*:" X_NODEVLIB
"} %{!mmcu=*:" X_NODEVLIB
"}",