[ccan] [PATCH v2 08/13] configurator: Add output cflag option and macro
David Gibson
david at gibson.dropbear.id.au
Tue Sep 27 15:17:00 AEST 2016
On Thu, Sep 22, 2016 at 09:33:11PM -0600, Kevin Locke wrote:
> Unfortunately, not all compilers support -o as a command-line option for
> specifying the output file. Visual Studio cl.exe issues warning D9035
> when -o is given, which is detected as a compile warning by the
> configurator.
>
> To support such compilers, add the command-line option -O to
> configurator which can be used to specify the cflag for setting the
> output executable file name. Additionally define the macro
> CCAN_OUTPUT_EXE_CFLAG in config.h and use it when invoking the compiler
> (e.g. from ccanlint).
>
> For reference, the name CCAN_OUTPUT_EXE_CFLAG was chosen to avoid
> potential name conflicts in the future due to cl.exe requiring different
> flags for different types of output[1] (e.g. object files are /Fo:).
>
> 1. https://msdn.microsoft.com/en-us/library/f1cb223a.aspx
>
> Signed-off-by: Kevin Locke <kevin at kevinlocke.name>
Reviewed-by: David Gibson <david at gibson.dropbear.id.au>
This one has some more complex conflicts if applied without the
preceding ones, so I haven't applied it yet.
> ---
> tools/compile.c | 15 ++++++++----
> tools/configurator/configurator.c | 50 +++++++++++++++++++++++++++------------
> tools/tools.h | 6 +++--
> 3 files changed, 49 insertions(+), 22 deletions(-)
>
> diff --git a/tools/compile.c b/tools/compile.c
> index b88c1d8..e796e3f 100644
> --- a/tools/compile.c
> +++ b/tools/compile.c
> @@ -7,8 +7,12 @@
> #ifndef CCAN_CFLAGS
> #define CCAN_CFLAGS DEFAULT_CCAN_CFLAGS
> #endif
> +#ifndef CCAN_OUTPUT_EXE_CFLAG
> +#define CCAN_OUTPUT_EXE_CFLAG DEFAULT_CCAN_OUTPUT_EXE_CFLAG
> +#endif
> const char *compiler = CCAN_COMPILER;
> const char *cflags = CCAN_CFLAGS;
> +const char *outexecflag = CCAN_OUTPUT_EXE_CFLAG;
>
> bool compile_verbose = false;
>
> @@ -37,8 +41,9 @@ bool compile_object(const void *ctx, const char *cfile, const char *ccandir,
> if (compile_verbose)
> printf("Compiling %s\n", outfile);
> return run_command(ctx, NULL, output,
> - "%s %s -I%s -c -o %s %s",
> - compiler, cflags, ccandir, outfile, cfile);
> + "%s %s -I%s -c %s%s %s",
> + compiler, cflags, ccandir,
> + outexecflag, outfile, cfile);
> }
>
> /* Compile and link single C file, with object files.
> @@ -51,7 +56,7 @@ bool compile_and_link(const void *ctx, const char *cfile, const char *ccandir,
> if (compile_verbose)
> printf("Compiling and linking %s\n", outfile);
> return run_command(ctx, NULL, output,
> - "%s %s -I%s -o %s %s %s %s",
> - compiler, cflags,
> - ccandir, outfile, cfile, objs, libs);
> + "%s %s -I%s %s%s %s %s %s",
> + compiler, cflags, ccandir,
> + outexecflag, outfile, cfile, objs, libs);
> }
> diff --git a/tools/configurator/configurator.c b/tools/configurator/configurator.c
> index acf6cc0..d81f878 100644
> --- a/tools/configurator/configurator.c
> +++ b/tools/configurator/configurator.c
> @@ -40,6 +40,7 @@
>
> #define DEFAULT_COMPILER "cc"
> #define DEFAULT_FLAGS "-g3 -ggdb -Wall -Wundef -Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes -Wold-style-definition"
> +#define DEFAULT_OUTPUT_EXE_FLAG "-o"
>
> #define OUTPUT_FILE "configurator.out"
> #define INPUT_FILE "configuratortest.c"
> @@ -517,10 +518,12 @@ static char *run(const char *cmd, int *exitstatus)
> return ret;
> }
>
> -static char *connect_args(const char *argv[], const char *extra)
> +static char *connect_args(const char *argv[], const char *outflag,
> + const char *files)
> {
> - unsigned int i, len = strlen(extra) + 1;
> + unsigned int i;
> char *ret;
> + size_t len = strlen(outflag) + strlen(files) + 1;
>
> for (i = 1; argv[i]; i++)
> len += 1 + strlen(argv[i]);
> @@ -530,10 +533,12 @@ static char *connect_args(const char *argv[], const char *extra)
> for (i = 1; argv[i]; i++) {
> strcpy(ret + len, argv[i]);
> len += strlen(argv[i]);
> - if (argv[i+1])
> + if (argv[i+1] || *outflag)
> ret[len++] = ' ';
> }
> - strcpy(ret + len, extra);
> + strcpy(ret + len, outflag);
> + len += strlen(outflag);
> + strcpy(ret + len, files);
> return ret;
> }
>
> @@ -702,33 +707,47 @@ int main(int argc, const char *argv[])
> unsigned int i;
> const char *default_args[]
> = { "", DEFAULT_COMPILER, DEFAULT_FLAGS, NULL };
> + const char *outflag = DEFAULT_OUTPUT_EXE_FLAG;
>
> if (argc > 0)
> progname = argv[0];
>
> - if (argc > 1) {
> + while (argc > 1) {
> if (strcmp(argv[1], "--help") == 0) {
> - printf("Usage: configurator [-v] [<compiler> <flags>...]\n"
> - " <compiler> <flags> will have \"-o <outfile> <infile.c>\" appended\n"
> - "Default: %s %s\n",
> - DEFAULT_COMPILER, DEFAULT_FLAGS);
> + printf("Usage: configurator [-v] [-O<outflag>] [<compiler> <flags>...]\n"
> + " <compiler> <flags> will have \"<outflag> <outfile> <infile.c>\" appended\n"
> + "Default: %s %s %s\n",
> + DEFAULT_COMPILER, DEFAULT_FLAGS,
> + DEFAULT_OUTPUT_EXE_FLAG);
> exit(0);
> }
> - if (strcmp(argv[1], "-v") == 0) {
> + if (strncmp(argv[1], "-O", 2) == 0) {
> argc--;
> argv++;
> - verbose = 1;
> + outflag = argv[1] + 2;
> + if (!*outflag) {
> + fprintf(stderr,
> + "%s: option requires an argument -- O\n",
> + argv[0]);
> + exit(1);
> + }
> + } else if (strcmp(argv[1], "-v") == 0) {
> + argc--;
> + argv++;
> + verbose++;
> } else if (strcmp(argv[1], "-vv") == 0) {
> argc--;
> argv++;
> - verbose = 2;
> + verbose += 2;
> + } else {
> + break;
> }
> }
>
> if (argc == 1)
> argv = default_args;
>
> - cmd = connect_args(argv, " -o " OUTPUT_FILE " " INPUT_FILE);
> + cmd = connect_args(argv, outflag, OUTPUT_FILE " " INPUT_FILE);
> for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
> run_test(cmd, &tests[i]);
> free(cmd);
> @@ -743,9 +762,10 @@ int main(int argc, const char *argv[])
> printf("#define _GNU_SOURCE /* Always use GNU extensions. */\n");
> printf("#endif\n");
> printf("#define CCAN_COMPILER \"%s\"\n", argv[1]);
> - cmd = connect_args(argv+1, "");
> - printf("#define CCAN_CFLAGS \"%s\"\n\n", cmd);
> + cmd = connect_args(argv + 1, "", "");
> + printf("#define CCAN_CFLAGS \"%s\"\n", cmd);
> free(cmd);
> + printf("#define CCAN_OUTPUT_EXE_CFLAG \"%s\"\n\n", outflag);
> /* This one implies "#include <ccan/..." works, eg. for tdb2.h */
> printf("#define HAVE_CCAN 1\n");
> for (i = 0; i < sizeof(tests)/sizeof(tests[0]); i++)
> diff --git a/tools/tools.h b/tools/tools.h
> index 3b5c4be..668c91a 100644
> --- a/tools/tools.h
> +++ b/tools/tools.h
> @@ -11,6 +11,7 @@
> /* These are the defaults. */
> #define DEFAULT_CCAN_COMPILER "cc"
> #define DEFAULT_CCAN_CFLAGS "-g"
> +#define DEFAULT_CCAN_OUTPUT_EXE_CFLAG "-o"
>
> #define IDENT_CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
> "abcdefghijklmnopqrstuvwxyz" \
> @@ -20,8 +21,9 @@
>
> #define COVERAGE_CFLAGS "-fprofile-arcs -ftest-coverage"
>
> -/* Actual compiler and cflags (defaults to CCAN_COMPILER and CCAN_CFLAGS). */
> -extern const char *compiler, *cflags;
> +/* Actual compiler and cflags
> + * (defaults to CCAN_COMPILER, CCAN_CFLAGS, CCAN_OUTPUT_EXE_CFLAG). */
> +extern const char *compiler, *cflags, *outexecflag;
>
> /* This compiles up the _info file into a temporary. */
> char *compile_info(const void *ctx, const char *dir);
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/ccan/attachments/20160927/9da26b5b/attachment-0001.sig>
More information about the ccan
mailing list