[PATCH] D24933: Enable configuration files in clang

Hal Finkel via cfe-commits cfe-commits at lists.llvm.org
Sat Aug 5 16:43:04 PDT 2017


On 07/24/2017 10:18 AM, Serge Pavlov wrote:
> I am thinking about reducing the patch further to leave only the 
> ability to include config file when clang is called as 
> `target-clang-drivermode`. It is still useful for cross compilation 
> tasks because:
> - It is a convenient way to switch between supported targets,
> - SDK producer can ship compiler with a set of appropriate options or 
> prepare them during installation.
> In this case if clang is called as `target-clang-drivermode`, it first 
> tries to find file `target-drivermode.cfg` or `target.cfg` in a set of 
> well-known directories, which in minimal case includes the directory 
> where clang executable resides. If such file is found, options are 
>  read from it, otherwise only option --target is added as clang does 
> it now.
>
> This solution has obvious drawbacks:
> - User cannot specify config file in command line in the same way as 
> he can choose a target: `clang --target <target>`,
> - On Windows symlinks are implemented as file copy, the solution looks 
> awkward.
> So more or less complete solution needs to allow specifying config 
> file in command line.

I'd rather not reduce the patch in this way, and you didn't describe why 
you're considering reducing the patch. Can you please elaborate?

>
> Using `@file` has some problems. Config file is merely a set of 
> options, just as file included by `@file`. Different include file 
> search is only a convenience and could be sacrificed. Comments and 
> unused option warning suppression could be extended for all files 
> included with `@file`. The real problem is the search path. To be 
> useful, config files must be searched for in well-known directories, 
> so that meaning of `clang @config_fille` does not depend on the 
> current directory. So clang must have some rule to distinguish between 
> config file and traditional use of `@file`. For instance, if file name 
> ends with `.cfg` and there is a file with this name in config search 
> directories, this is a config file and it is interpreted a bit 
> differently. Of course, the file may be specified with full path, but 
> this way is inconvenient.

I see no reason why we can't unify the processing but have different 
search-path rules for @file vs. --config file.

>
> Another possible solution is to extend meaning of `--target` so that 
> it fully matches with the use of `target-clang-drivermode`, that is 
> the option `--target=hexagon` causes clang first to look for the file 
> `hexagon.cfg` in well-known directories and use it if found. In this 
> case treatment of `--target` is different if the option is specified 
> in command line or in the content of config file (in the latter case 
> it is processed as target name only), it may be confusing. Besides, 
> use of config files is not restricted to the choice of target.

I think we should do this, so long as the implementation is reasonable, 
and the special case doesn't bother me in this regard. I don't view this 
as a replacement for '--config file', however, because, as you mention, 
the config files need not be restricted to target triples.

Thanks again,
Hal

>
> Using special option for config files does not bring risk of 
> compatibility breakage and does not change meaning of existing options.
>
>
> Thanks,
> --Serge
>
> 2017-05-10 11:25 GMT+07:00 Serge Pavlov <sepavloff at gmail.com 
> <mailto:sepavloff at gmail.com>>:
>
>     2017-05-10 3:46 GMT+07:00 Richard Smith <richard at metafoo.co.uk
>     <mailto:richard at metafoo.co.uk>>:
>
>         On 1 March 2017 at 02:50, Serge Pavlov via Phabricator
>         <reviews at reviews.llvm.org <mailto:reviews at reviews.llvm.org>>
>         wrote:
>
>
>             Format of configuration file is similar to file used in
>             the construct `@file`, it is a set of options.
>             Configuration file have advantage over this construct:
>
>             - it is searched for in well-known places rather than in
>             current directory,
>
>
>         This (and suppressing unused-argument warnings) might well be
>         sufficient to justify a different command-line syntax rather
>         than @file...
>
>
>     Construct `@file` in this implementation is used only to read
>     parts of config file inside containing file. Driver knows that it
>     processes config file and can adjust treatment of `@file`. On the
>     other hand, driver might parse config files in a more complicated
>     way, for instance, it could treat line `# include(file_name)` as a
>     command to include another file.
>
>             - it may contain comments, long options may be split
>             between lines using trailing backslashes,
>             - other files may be included by `@file` and they will be
>             resolved relative to the including file,
>
>
>         ... but I think we should just add these extensions to our
>         @file handling, and then use the exact same syntax and code to
>         handle config files and @file files. That is, the difference
>         between @ and --config would be that the latter looks in a
>         different directory and suppresses "unused argument" warnings,
>         but they would otherwise be identical.
>
>
>     Changing treatment of `@file` can cause compatibility issues, in
>     particular, both libiberty and cl resolves file name relative to
>     current directory. So driver must deduce that `@file` is used to
>     load config file rather than merely to organize arguments. Another
>     difference is that `@file` inserts its content in the place where
>     it occurs, while `--config` always puts arguments before user
>     specified options. The following invocations:
>
>         clang --config a.cfg -opt1 -opt2 file1.cpp
>         clang -opt1 -opt2 file1.cpp --config a.cfg
>
>     are equivalent, but variants with `@file` can have different effect.
>
>
>             - the file may be encoded in executable name,
>             - unused options from configuration file do not produce
>             warnings.
>
>
>             https://reviews.llvm.org/D24933
>             <https://reviews.llvm.org/D24933>
>
>
>
>
>
>

-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170805/69cfae11/attachment-0001.html>


More information about the cfe-commits mailing list