The problem is that $(eval SUPPLIER_A2l := $(sort $(shell find $(DIR_A2LGEN_SUPPLIER) -type f -name "*.a2l"))) runs before the directory was created and the a2l files were copied to the directory. Since this ran before the directory creation and copy of the a2l file SUPPLIER_A2L is always null. IS there anyway to force this statement to be ran in the exact sequence its listed?
Ed L Wolf Technical Advisor - Embedded Software e.l.w...@cummins.com Cummins Inc. Mail Code: C7004 1460 National Road Columbus, Indiana 47201 United States -----Original Message----- From: Bahman Movaqar <bah...@bahmanm.com> Sent: Tuesday, September 26, 2023 12:11 PM To: Ed L Wolf <e.l.w...@cummins.com>; bug-make@gnu.org Subject: Re: Problem setting a variable inside a target EXTERNAL SENDER: This email originated outside of Cummins. Do not click links or open attachments unless you verify the sender and know the content is safe. OK, it took me a while but I think I may have something relatively more readable. The idea is to let Make handle the prerequisites and the order of build for you by using well laid out targets. The challenge I was facing trying to understand your code was that you'd condensed the original hierarchy of `*.a2l' files into `DIR_A2LGEN_SUPPLIER' which had made very difficult to tell Make how to make a target and when. Here's my further slimmed down version of your snippet. Let me know if that makes sense and whether it solves your problem. You can also view on pastebin w/ syntax highlighting: https://pastebin.com/cHy8CuUt 🙶 SHELL := /usr/bin/env -S bash -o pipefail .DEFAULT_GOAL := all ####################################################################### ROOT := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) build.dir := $(ROOT)build/ src.dir := $(ROOT) ####################################################################### A2L-files.src = $(shell find $(src.dir) -type f -name '*.a2l') A2L-files.dst = $(subst $(src.dir),$(build.dir),$(A2L-files.src)) ####################################################################### $(build.dir) : mkdir -p $(@) ####################################################################### $(build.dir)%.a2l : $(src.dir)%.a2l mkdir -p $(build.dir)$(subst $(src.dir),,$(dir $(<))) \ && cp $(<) $(@) ####################################################################### .PHONY : merge ifneq ($(A2L-files.dst),) merge : $(A2L-files.dst) @echo MERGE POSSIBLE @echo ... else merge : @echo MERGE NOT POSSIBLE @echo ... endif ####################################################################### .PHONY : clean clean : -rm -rf $(build.dir) ####################################################################### .PHONY : all all : | $(build.dir) all : merge 🙷 -- Bahman On Tue, 2023-09-26 at 12:17 +0000, Ed L Wolf wrote: > Here is the strip down version > > $(DIR_A2LGEN_SETUP)/McData-setup.a2l: > @echo "A2L $@" > > > @find $(DIR_BSWPROJECT) -type f -name "*.a2l" | xargs -i > cp {} $(DIR_A2LGEN_SETUP) > > > > > ifneq ($(wildcard $(DIR_SUPPLIER)),) > @find $(DIR_SUPPLIER) -type f -name "*.a2l" | xargs -i cp > {} $(DIR_A2LGEN_SUPPLIER) > $(eval SUPPLIER_A2l := $(sort $(shell find > $(DIR_A2LGEN_SUPPLIER) -type f -name "*.a2l"))) > @echo "A2L Supplier folder detected" > @echo "Supplier a2l $(SUPPLIER_A2l)" > > > # Just becuase there is a supplier folder does not mean it has a2l > files. > ifeq ($(SUPPLIER_A2l),"*.a2l") > @echo "A2L Supplier a2l files > found" > > else > @cp $(DIR_A2LGEN_SETUP)/McData-copyright-can.a2l > $(DIR_A2LGEN_SETUP)/McData-setup.a2l > @echo "A2L Supplier folder detected but no a2l > files present" > endif > > else > @cp $(DIR_A2LGEN_SETUP)/McData-copyright-can.a2l > $(DIR_A2LGEN_SETUP)/McData-setup.a2l > @echo "A2L Supplier folder not available" > endif > > Ed L Wolf > Technical Advisor - Embedded Software > e.l.w...@cummins.com > Cummins Inc. > Mail Code: C7004 > 1460 National Road > Columbus, Indiana 47201 > United States > > -----Original Message----- > From: Bahman Movaqar <bah...@bahmanm.com> > Sent: Tuesday, September 26, 2023 6:35 AM > To: Ed L Wolf <e.l.w...@cummins.com>; bug-make@gnu.org > Subject: Re: Problem setting a variable inside a target > > EXTERNAL SENDER: This email originated outside of Cummins. Do not > click links or open attachments unless you verify the sender and know > the content is safe. > > > On Sun, 2023-09-24 at 17:23 +0000, Ed L Wolf wrote: > > > > > ifneq ($(wildcard $(DIR_SUPPLIER)),) ... > > > $(eval SUPPLIER_A2l := $(sort $(shell find $(DIR_A2LGEN_SUPPLIER) > > > - > > > type f -name "*.a2l"))) > > ... > > ifeq ($(SUPPLIER_A2l),"*.a2l") > > > > Quickly skimming through your code, I can see that the above `ifneq' > and `ifeq' are evaluated at the very same time/pass. That means the > result of `eval' will not be visible to `ifeq'. > > HTH, > > > PS: I could have tried to come up w/ an alternative approach to laying > out the code but, I found the snippet crowded w/ too much logic > specific to your case which makes it hard for me to see the abstract > patterns in play. Can you try to slim down the snippet and push it to > a public repo somewhere so I can take a look? > > -- > Bahman