Hi Bob

note that the sed -i does not work on Darwin’s BDS-derived sed without also
using ‘-e’ to inroduce the scripts… so I am looking for a solution we all like 
too.

> On 28 Mar 2025, at 16:40, Robert Dubner <rdub...@symas.com> wrote:
> 
> I am not fully following what's going on.
> 
> The way this grew is because Jim and I once had a solution in Make-lang.in
> that put a "-I ../libgcobol" into CPPFLAGS.
> 
> Then it turned out I couldn't use CPPFLAGS, because it wasn't available on
> all architectures.
> 
> But I nonetheless needed to use valconv.cc and charmaps.cc in both
> libgcobol and gcc/cobol.  So I copied them to the build directory.  Then
> it turned out that compilations have to be possible on read-only file
> systems.  And the various cdf.y parse.y and scan.l builds cause .cc files
> to be created in the build directory.  
> 
> But I don't know where the build directory is, so I couldn't statically
> establish the relative path to libgcobol in those source code modules.  
> 
> So, I didn't know how to set -I, and I didn't know where the build
> directory is, so I came up with the SED solution.  It was hateful, and Jim
> and I had words about it, but I did it to be able to keep going.  (You may
> have noted that I have a "keep going" ethic.)
> 
> If there is a solution whereby the gcc/cobol build process can have a "-I
> $(srcdir)/../libgcobol" established, then by all means, we should do so.
> I just wasn't able figure out how to do it.

1) An alternate solution is to rename the actual content “valconv.inc” and
“charmaps.inc” and to include it explicitly from the two use sites.  That
makes the intent clear - and allows all the paths to be defined at commit-
time (i.e. no violation of read-only source trees)

2) It is also possible to do

CFLAGS-xxxxxxx.o: -I <some directory> 
for each source that needs the libgcobol includes …

Which is still repetitive perhaps but more readable than the sed, but does
not solve the copying part.

I do have sympathy for the idea that the actual  paths should be readable
in the source that the user deals with - it makes intentions clear.

Iain

> 
> 
>> -----Original Message-----
>> From: Jakub Jelinek <ja...@redhat.com>
>> Sent: Friday, March 28, 2025 10:40
>> To: Robert Dubner <rdub...@symas.com>; James K. Lowden
>> <jklow...@cobolworx.com>; Richard Biener <rguent...@suse.de>
>> Cc: gcc-patches@gcc.gnu.org
>> Subject: [PATCH] cobol: Fix up cobol/{charmaps,valconv}.cc rules
>> 
>> Hi!
>> 
>> sed -i is not portable, it is supported by GNU sed and perhaps some
> BSDs,
>> but not elsewhere.
>> Furthermore, I think it is far better to always use
>> #include "../../libgcobol/something.h"
>> paths rather than something depending on the build directory.
>> And because we require GNU make, we don't have to have two different
>> rules for those, can use just one for both.
>> The l variable in there is just to make it fit into 80 columns.
>> 
>> Ok for trunk?
>> 
>> 2025-03-28  Jakub Jelinek  <ja...@redhat.com>
>> 
>>      * Make-lang.in (cobol/charmaps.cc, cobol/valconv.cc): Used sed -e
>>      instead of cp and multiple sed -i commands.  Always prefix
> libgcobol
>>      header names in #include directives with ../../libgcobol/ rather
>> than
>>      something depending on $(LIB_SOURCE).
>> 
>> --- gcc/cobol/Make-lang.in.jj        2025-03-28 15:08:29.431543005 +0100
>> +++ gcc/cobol/Make-lang.in   2025-03-28 15:31:14.886182633 +0100
>> @@ -87,29 +87,10 @@ cobol1_OBJS =    \
>> # Various #includes in the files copied from gcc/libgcobol need to be
>> modified
>> # so that the .h files can be found.
>> 
>> -cobol/charmaps.cc: $(LIB_SOURCE)/charmaps.cc
>> -    cp $^ $@
>> -    sed -i "s|\"ec[.]h\"|\"$(LIB_SOURCE)/ec.h\"|g" $@
>> -    sed -i "s|\"common-defs[.]h\"|\"$(LIB_SOURCE)/common-defs.h\"|g"
> $@
>> -    sed -i "s|\"io[.]h\"|\"$(LIB_SOURCE)/io.h\"|g" $@
>> -    sed -i "s|\"gcobolio[.]h\"|\"$(LIB_SOURCE)/gcobolio.h\"|g" $@
>> -    sed -i "s|\"libgcobol[.]h\"|\"$(LIB_SOURCE)/libgcobol.h\"|g" $@
>> -    sed -i "s|\"gfileio[.]h\"|\"$(LIB_SOURCE)/gfileio.h\"|g" $@
>> -    sed -i "s|\"charmaps[.]h\"|\"$(LIB_SOURCE)/charmaps.h\"|g" $@
>> -    sed -i "s|\"valconv[.]h\"|\"$(LIB_SOURCE)/valconv.h\"|g" $@
>> -    sed -i "s|\"exceptl[.]h\"|\"$(LIB_SOURCE)/exceptl.h\"|g" $@
>> -
>> -cobol/valconv.cc: $(LIB_SOURCE)/valconv.cc
>> -    cp $^ $@
>> -    sed -i "s|\"ec[.]h\"|\"$(LIB_SOURCE)/ec.h\"|g" $@
>> -    sed -i "s|\"common-defs[.]h\"|\"$(LIB_SOURCE)/common-defs.h\"|g"
> $@
>> -    sed -i "s|\"io[.]h\"|\"$(LIB_SOURCE)/io.h\"|g" $@
>> -    sed -i "s|\"gcobolio[.]h\"|\"$(LIB_SOURCE)/gcobolio.h\"|g" $@
>> -    sed -i "s|\"libgcobol[.]h\"|\"$(LIB_SOURCE)/libgcobol.h\"|g" $@
>> -    sed -i "s|\"gfileio[.]h\"|\"$(LIB_SOURCE)/gfileio.h\"|g" $@
>> -    sed -i "s|\"charmaps[.]h\"|\"$(LIB_SOURCE)/charmaps.h\"|g" $@
>> -    sed -i "s|\"valconv[.]h\"|\"$(LIB_SOURCE)/valconv.h\"|g" $@
>> -    sed -i "s|\"exceptl[.]h\"|\"$(LIB_SOURCE)/exceptl.h\"|g" $@
>> +cobol/charmaps.cc cobol/valconv.cc: cobol/%.cc: $(LIB_SOURCE)/%.cc
>> +    -l='ec\|common-defs\|io\|gcobolio\|libgcobol\|gfileio\|charmaps';
> \
>> +    l=$$l'\|valconv\|exceptl'; \
>> +    sed -e '/^#include/s,"\('$$l'\)\.h","../../libgcobol/\1.h",' $^ >
> $@
>> 
>> LIB_SOURCE_H=$(wildcard $(LIB_SOURCE)/*.h)
>> 
>> 
>>      Jakub
> 

Reply via email to