<div dir="ltr"><div dir="ltr"><br></div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, 13 Nov 2024 at 12:11, Zoltan Somogyi <<a href="mailto:zoltan.somogyi@runbox.com">zoltan.somogyi@runbox.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><br>
On 2024-11-12 15:54 +11:00 AEDT, "Zoltan Somogyi" <<a href="mailto:zoltan.somogyi@runbox.com" target="_blank">zoltan.somogyi@runbox.com</a>> wrote:<br>
> For review by anyone.<br>
<br>
Does anyone intend to review this, or answer its questions?<br></blockquote><div><br></div><div>> This diff does not include user-facing documentation of the<br>> new options, but it does describe how they are intended to operate<br>> in the code. Once there is agreement on the approach, I will<br>> <br>> - implement the approach to replace the related options, such as<br>>  --search-directories, and<br>> <br>> - add user-facing documentation of the new options, both in<br>>   compiler/options.m and doc/user_guide.texi.<br>> <br>> The questions I am seeking particular feedback on are these.<br>> <br>> First, this diff classifies directories in search paths into three categories:<br>> (a) workspace directories that share the same subdir setting, i.e they use<br>> the same values of --use-subdirs and --use-grade-subdirs, (b) workspace<br>> directories that may use a different subdir setting, and (c) installed library<br>> directories. The current code assumes that all directories in category (a)<br>> come before all directories in categories (b) and (c), and all directories<br>> in category (b) come before all directories in category (c). This is always<br>> true in the compiler and in all the other Mercury programs I have worked on,<br>> but you guys work on a wider variety of programs. Is this assumption<br>> justifiable, or should I switch to an approach that does not make any<br>> such assumptions?<br><br>Every program I work on, other than the Mercury implementation itself, uses<br>either (1) installed libraries or (2) just uses source file mapping to build<br>all of the program from a single build directory.  The main use case I would<br>have for using non-installed libraries like the above is for testing libraries<br>I have written in situ. For that case the above assumptions are justifiable.<br><br>> Second, can anyone think of better names for the new options?<br>> Is the use of "same", "indep" and "install" to describe the above three<br>> categories understandable (once documented), or does anyone<br>> know a better naming scheme?<br><br>Nothing springs to mind.<br><br>> Third, the code of the get_ext_opt_deps and get_plain_trans_opt_deps<br>> predicates in write_deps_file search for source files in directories named<br>> by the --intermodule-directories option, when their caller passes them<br>> look_for_src. I do not see any documentation of what the intention behind<br>> this arrangement is. If and when the code finds the source file, it does nothing<br>> with it; it just stops looking for that module's .opt or .trans_opt file.<br>> This behavior was introduced by Simon in a commit on 6 nov 1996,<br>> but the log message is not informative, and we don't even have mailing list<br>> archives from that far back. So my question is: does anyone have any idea<br>> of what that code is doing or why it is doing it, and what would be the<br>> impact of deleting that search?<br><br>Conceivably, there may have been some notion of finding clauses for intermodule<br>inlining in the source files installed in those directories (i.e. rather than<br>putting them directly in .opt and .trans_opt files).  Regardless, it does not<br>seem to be a useful behaviour *now*.<br><br><br>> Start on search paths for PROPOSED dir structures.<br>> <br>> The new code added by this diff is not yet used.<br><br>...<br><br><br>> @@ -2962,7 +2964,95 @@ handle_directory_options(OpMode, !Globals) :-<br>>              accumulating(SubdirCIncludeDirs), !Globals)<br><br>...<br><br>> +:- pred make_proposed_search_path_gs(subdir_setting::in, dir_name::in,<br>> +    dir_name::in,<br>> +    list(dir_name)::in, list(dir_name)::in, list(dir_name)::in,<br>> +    list(dir_name)::out) is det.<br>> +<br>> +make_proposed_search_path_gs(SubdirSetting, Grade, ExtSubDir,<br>> +        SearchDirsSame, SearchDirsIndep, SearchDirsInstall, Dirs) :-<br>> +    % First, we search SearchDirsSame, which should be the workspace<br>> +    % directories that are guaranteed to share the same subdir_setting<br>> +    % as the currrent workspace directory. In each of these directories,<br><br>s/currrent/current/<br><br><br>> +    % we use SubdirSetting to select the one right subdir.<br>> +    list.map(<br>> +        make_selected_proposed_dir_name_gs(SubdirSetting, Grade, ExtSubDir),<br>> +        SearchDirsSame, DirsSame),<br>> +    % Second, we search SearchDirsIndept, which should be workspace directories<br>> +    % whose subdir_setting is independent of the subdir_setting of this<br>> +    % workspace directory. In these places, we have to be search all three<br>> +    % of the subdis where that independent subdir_setting can put the values<br><br>s/subdis/subdirs/<br><br>> +    % of this extension, searching them in the order grade-specific,<br>> +    % non-grade-specific, and then the current directory ("current" in this<br>> +    % case meaning one of the directories in SearchDirsIndep).<br>> +    list.map(<br>> +        make_all_proposed_dir_names_gs(Grade, ExtSubDir),<br>> +        SearchDirsIndep, DirsListIndep),<br>> +    % Third, we search SearchDirsInstall, which should be a list of library<br>> +    % install directories. In install directories, we look only in the<br>> +    % grade-specific subdir.<br>> +    list.map(<br>> +        make_selected_proposed_dir_name_gs(use_cur_ngs_gs_subdir, Grade,<br>> +            ExtSubDir),<br>> +        SearchDirsInstall, DirsInstall),<br>> +    list.condense(DirsListIndep, DirsIndep),<br>> +    Dirs = DirsSame ++ DirsIndep ++ DirsInstall.<br><br>That looks fine otherwise.</div><div><br></div><div>Julien.<br></div></div></div>