All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH] mk: symlink every headers first
@ 2017-06-20 21:21 Thomas Monjalon
  2017-06-21 10:27 ` Bruce Richardson
  0 siblings, 1 reply; 7+ messages in thread
From: Thomas Monjalon @ 2017-06-20 21:21 UTC (permalink / raw)
  To: gaetan.rivet; +Cc: dev

If a library or a build tool uses a definition from a driver,
there is a build ordering issue, like seen when moving PCI code
into a bus driver.

One option is to keep PCI helpers and some common definitions in EAL.
The other option is to symlink every headers at the beginning of
the build so they can be included by any other component.

This patch shows how to achieve the second option.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
 mk/internal/rte.install-post.mk | 2 ++
 mk/rte.sdkbuild.mk              | 9 ++++++++-
 mk/rte.subdir.mk                | 7 +++++++
 3 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/mk/internal/rte.install-post.mk b/mk/internal/rte.install-post.mk
index b99e2b2f7..61804561f 100644
--- a/mk/internal/rte.install-post.mk
+++ b/mk/internal/rte.install-post.mk
@@ -55,7 +55,9 @@ $(foreach dir,$(INSTALL-DIRS-y),\
 # arg1: relative install dir in RTE_OUTPUT
 # arg2: relative file name in a source dir (VPATH)
 #
+.PHONY: headers
 define symlink_rule
+headers: $(addprefix $(RTE_OUTPUT)/$(1)/,$(notdir $(2)))
 $(addprefix $(RTE_OUTPUT)/$(1)/,$(notdir $(2))): $(2)
 	@echo "  SYMLINK-FILE $(addprefix $(1)/,$(notdir $(2)))"
 	@[ -d $(RTE_OUTPUT)/$(1) ] || mkdir -p $(RTE_OUTPUT)/$(1)
diff --git a/mk/rte.sdkbuild.mk b/mk/rte.sdkbuild.mk
index 0bf909e9e..ec04ccb2b 100644
--- a/mk/rte.sdkbuild.mk
+++ b/mk/rte.sdkbuild.mk
@@ -67,9 +67,16 @@ clean: $(CLEANDIRS)
 .PHONY: test-build
 test-build: test
 
+.PHONY: headers
+headers: $(addprefix headers-, $(ROOTDIRS-y))
+headers-%:
+	@[ -d $(BUILDDIR)/$* ] || mkdir -p $(BUILDDIR)/$*
+	$(Q)$(MAKE) S=$* -f $(RTE_SRCDIR)/$*/Makefile -C $(BUILDDIR)/$* \
+		-srR headers
+
 .SECONDEXPANSION:
 .PHONY: $(ROOTDIRS-y) $(ROOTDIRS-)
-$(ROOTDIRS-y) $(ROOTDIRS-):
+$(ROOTDIRS-y) $(ROOTDIRS-): headers
 	@[ -d $(BUILDDIR)/$@ ] || mkdir -p $(BUILDDIR)/$@
 	@echo "== Build $@"
 	$(Q)$(MAKE) S=$@ -f $(RTE_SRCDIR)/$@/Makefile -C $(BUILDDIR)/$@ all
diff --git a/mk/rte.subdir.mk b/mk/rte.subdir.mk
index 92f5de4c8..3ae4ce525 100644
--- a/mk/rte.subdir.mk
+++ b/mk/rte.subdir.mk
@@ -57,6 +57,13 @@ _postinstall: build
 .PHONY: build
 build: _postbuild
 
+.PHONY: headers
+headers: $(addprefix headers-, $(DIRS-y))
+headers-%:
+	@[ -d $(CURDIR)/$* ] || mkdir -p $(CURDIR)/$*
+	@$(MAKE) S=$S/$* -f $(SRCDIR)/$*/Makefile -C $(CURDIR)/$* \
+		-srR headers
+
 .SECONDEXPANSION:
 .PHONY: $(DIRS-y)
 $(DIRS-y):
-- 
2.13.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [RFC PATCH] mk: symlink every headers first
  2017-06-20 21:21 [RFC PATCH] mk: symlink every headers first Thomas Monjalon
@ 2017-06-21 10:27 ` Bruce Richardson
  2017-06-21 10:41   ` Thomas Monjalon
  2017-06-21 14:27   ` Wiles, Keith
  0 siblings, 2 replies; 7+ messages in thread
From: Bruce Richardson @ 2017-06-21 10:27 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: gaetan.rivet, dev

On Tue, Jun 20, 2017 at 11:21:39PM +0200, Thomas Monjalon wrote:
> If a library or a build tool uses a definition from a driver,
> there is a build ordering issue, like seen when moving PCI code
> into a bus driver.
> 
> One option is to keep PCI helpers and some common definitions in EAL.
> The other option is to symlink every headers at the beginning of
> the build so they can be included by any other component.
> 
> This patch shows how to achieve the second option.
> 
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> ---

My 2c.

This may be worth doing, however, two points to consider.

1. If we look to change build system this may not be worth doing unless
a compelling need becomes obvious in the short term. In the meantime,
for cases where it is needed...
2. libraries can already access the includes from drivers or other
places fairly easily, just by adding the relevant "-I" flag to the
CFLAGS for that lib.

That said, since the work is already done developing this, and if it
doesn't hurt in terms of build time, I suppose we might as well merge
it in.

So tentative ack from me, subject to testing and feedback from others.

/Bruce

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC PATCH] mk: symlink every headers first
  2017-06-21 10:27 ` Bruce Richardson
@ 2017-06-21 10:41   ` Thomas Monjalon
  2017-06-21 12:52     ` Richardson, Bruce
  2017-06-21 14:27   ` Wiles, Keith
  1 sibling, 1 reply; 7+ messages in thread
From: Thomas Monjalon @ 2017-06-21 10:41 UTC (permalink / raw)
  To: Bruce Richardson; +Cc: gaetan.rivet, dev

21/06/2017 12:27, Bruce Richardson:
> On Tue, Jun 20, 2017 at 11:21:39PM +0200, Thomas Monjalon wrote:
> > If a library or a build tool uses a definition from a driver,
> > there is a build ordering issue, like seen when moving PCI code
> > into a bus driver.
> > 
> > One option is to keep PCI helpers and some common definitions in EAL.
> > The other option is to symlink every headers at the beginning of
> > the build so they can be included by any other component.
> > 
> > This patch shows how to achieve the second option.
> > 
> > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > ---
> 
> My 2c.
> 
> This may be worth doing, however, two points to consider.
> 
> 1. If we look to change build system this may not be worth doing unless
> a compelling need becomes obvious in the short term. In the meantime,
> for cases where it is needed...
> 2. libraries can already access the includes from drivers or other
> places fairly easily, just by adding the relevant "-I" flag to the
> CFLAGS for that lib.

You mean adding a -I pointing to source location instead of
the build directory?

> That said, since the work is already done developing this, and if it
> doesn't hurt in terms of build time, I suppose we might as well merge
> it in.

It hurts a bit the build time.

> So tentative ack from me, subject to testing and feedback from others.

I would prefer not applying this patch if Gaetan can organize EAL and
bus drivers in a way that everything compile fine.
Libraries should not look into drivers.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC PATCH] mk: symlink every headers first
  2017-06-21 10:41   ` Thomas Monjalon
@ 2017-06-21 12:52     ` Richardson, Bruce
  0 siblings, 0 replies; 7+ messages in thread
From: Richardson, Bruce @ 2017-06-21 12:52 UTC (permalink / raw)
  To: Thomas Monjalon; +Cc: gaetan.rivet, dev



> -----Original Message-----
> From: Thomas Monjalon [mailto:thomas@monjalon.net]
> Sent: Wednesday, June 21, 2017 11:42 AM
> To: Richardson, Bruce <bruce.richardson@intel.com>
> Cc: gaetan.rivet@6wind.com; dev@dpdk.org
> Subject: Re: [dpdk-dev] [RFC PATCH] mk: symlink every headers first
> 
> 21/06/2017 12:27, Bruce Richardson:
> > On Tue, Jun 20, 2017 at 11:21:39PM +0200, Thomas Monjalon wrote:
> > > If a library or a build tool uses a definition from a driver, there
> > > is a build ordering issue, like seen when moving PCI code into a bus
> > > driver.
> > >
> > > One option is to keep PCI helpers and some common definitions in EAL.
> > > The other option is to symlink every headers at the beginning of the
> > > build so they can be included by any other component.
> > >
> > > This patch shows how to achieve the second option.
> > >
> > > Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> > > ---
> >
> > My 2c.
> >
> > This may be worth doing, however, two points to consider.
> >
> > 1. If we look to change build system this may not be worth doing
> > unless a compelling need becomes obvious in the short term. In the
> > meantime, for cases where it is needed...
> > 2. libraries can already access the includes from drivers or other
> > places fairly easily, just by adding the relevant "-I" flag to the
> > CFLAGS for that lib.
> 
> You mean adding a -I pointing to source location instead of the build
> directory?
> 

Yep. Easy workaround for limited cases where it is needed. It's been done before in our code, not sure there are any instances left after the rework of the last couple of releases, but we certainly used to have that scheme in the past and it didn't cause us a single problem as I recall.

/Bruce

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC PATCH] mk: symlink every headers first
  2017-06-21 10:27 ` Bruce Richardson
  2017-06-21 10:41   ` Thomas Monjalon
@ 2017-06-21 14:27   ` Wiles, Keith
  2017-06-21 15:14     ` Gaëtan Rivet
  1 sibling, 1 reply; 7+ messages in thread
From: Wiles, Keith @ 2017-06-21 14:27 UTC (permalink / raw)
  To: Richardson, Bruce; +Cc: Thomas Monjalon, gaetan.rivet, dev


> On Jun 21, 2017, at 5:27 AM, Bruce Richardson <bruce.richardson@intel.com> wrote:
> 
> On Tue, Jun 20, 2017 at 11:21:39PM +0200, Thomas Monjalon wrote:
>> If a library or a build tool uses a definition from a driver,
>> there is a build ordering issue, like seen when moving PCI code
>> into a bus driver.
>> 
>> One option is to keep PCI helpers and some common definitions in EAL.
>> The other option is to symlink every headers at the beginning of
>> the build so they can be included by any other component.
>> 
>> This patch shows how to achieve the second option.
>> 
>> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
>> ---
> 
> My 2c.
> 
> This may be worth doing, however, two points to consider.
> 
> 1. If we look to change build system this may not be worth doing unless
> a compelling need becomes obvious in the short term. In the meantime,
> for cases where it is needed...
> 2. libraries can already access the includes from drivers or other
> places fairly easily, just by adding the relevant "-I" flag to the
> CFLAGS for that lib.
> 
> That said, since the work is already done developing this, and if it
> doesn't hurt in terms of build time, I suppose we might as well merge
> it in.
> 
> So tentative ack from me, subject to testing and feedback from others.

+1, I already have to make sure everything is symlinked first in my private DPDK work for other reasons. This patch would allow me to remove that special code.

> 
> /Bruce

Regards,
Keith

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC PATCH] mk: symlink every headers first
  2017-06-21 14:27   ` Wiles, Keith
@ 2017-06-21 15:14     ` Gaëtan Rivet
  2017-06-21 15:53       ` Wiles, Keith
  0 siblings, 1 reply; 7+ messages in thread
From: Gaëtan Rivet @ 2017-06-21 15:14 UTC (permalink / raw)
  To: Wiles, Keith; +Cc: Richardson, Bruce, Thomas Monjalon, dev

Hi,

On Wed, Jun 21, 2017 at 02:27:49PM +0000, Wiles, Keith wrote:
> 
> > On Jun 21, 2017, at 5:27 AM, Bruce Richardson <bruce.richardson@intel.com> wrote:
> > 
> > On Tue, Jun 20, 2017 at 11:21:39PM +0200, Thomas Monjalon wrote:
> >> If a library or a build tool uses a definition from a driver,
> >> there is a build ordering issue, like seen when moving PCI code
> >> into a bus driver.
> >> 
> >> One option is to keep PCI helpers and some common definitions in EAL.
> >> The other option is to symlink every headers at the beginning of
> >> the build so they can be included by any other component.
> >> 
> >> This patch shows how to achieve the second option.
> >> 
> >> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> >> ---
> > 
> > My 2c.
> > 
> > This may be worth doing, however, two points to consider.
> > 
> > 1. If we look to change build system this may not be worth doing unless
> > a compelling need becomes obvious in the short term. In the meantime,
> > for cases where it is needed...
> > 2. libraries can already access the includes from drivers or other
> > places fairly easily, just by adding the relevant "-I" flag to the
> > CFLAGS for that lib.
> > 
> > That said, since the work is already done developing this, and if it
> > doesn't hurt in terms of build time, I suppose we might as well merge
> > it in.
> > 
> > So tentative ack from me, subject to testing and feedback from others.
> 
> +1, I already have to make sure everything is symlinked first in my private DPDK work for other reasons. This patch would allow me to remove that special code.
> 
> > 
> > /Bruce
> 
> Regards,
> Keith
> 

Personally I do not like this approach.

A well designed architecture introduces constraints that developers
ought to follow. These constraints, when well defined, foster a cleaner
growth on top of it with better practices.

This solution is a crutch meant to alleviate other deep-rooted issues that
should be fixed anyway. It makes them disappear right now, only for
them to reappear when people will write libs and drivers with blurred
hierarchies and hard-to-determine dependencies.

These constraints should be a tool for developers to be critical of their work
and help them see whether they are making a mistake, for example by
putting implementation specific data in generic structures (as seen by
the problems at the root of this RFC: KNI, pmdinfogen dependencies).

This would have led for example eventdev, cryptodev, ethdev to leave PCI
specific data within their structures. Yes, it works. But it is not
clean, it leads to ABI instability, unsafe design practices.

This RFC is the easy way out, making it work, at the price of technical
debt.

I understand that it is a lot of work to properly clean up the
structures and that ressource is scarce. Having a clear architecture and
proper structures however helps external eyes to read, understand, use,
and ultimately contribute.

This kind of move goes against the previous work that was done to
make devices, drivers and buses generic, which I think was right.

I do not feel that it is my place to nack, nor that it is constructive
to block this if others are thinking that it is useful; however I hope
to sway others to my position.

Cheers,
-- 
Gaëtan Rivet
6WIND

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC PATCH] mk: symlink every headers first
  2017-06-21 15:14     ` Gaëtan Rivet
@ 2017-06-21 15:53       ` Wiles, Keith
  0 siblings, 0 replies; 7+ messages in thread
From: Wiles, Keith @ 2017-06-21 15:53 UTC (permalink / raw)
  To: Gaëtan Rivet; +Cc: Richardson, Bruce, Thomas Monjalon, dev


> On Jun 21, 2017, at 10:14 AM, Gaëtan Rivet <gaetan.rivet@6wind.com> wrote:
> 
> Hi,
> 
> On Wed, Jun 21, 2017 at 02:27:49PM +0000, Wiles, Keith wrote:
>> 
>>> On Jun 21, 2017, at 5:27 AM, Bruce Richardson <bruce.richardson@intel.com> wrote:
>>> 
>>> On Tue, Jun 20, 2017 at 11:21:39PM +0200, Thomas Monjalon wrote:
>>>> If a library or a build tool uses a definition from a driver,
>>>> there is a build ordering issue, like seen when moving PCI code
>>>> into a bus driver.
>>>> 
>>>> One option is to keep PCI helpers and some common definitions in EAL.
>>>> The other option is to symlink every headers at the beginning of
>>>> the build so they can be included by any other component.
>>>> 
>>>> This patch shows how to achieve the second option.
>>>> 
>>>> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
>>>> ---
>>> 
>>> My 2c.
>>> 
>>> This may be worth doing, however, two points to consider.
>>> 
>>> 1. If we look to change build system this may not be worth doing unless
>>> a compelling need becomes obvious in the short term. In the meantime,
>>> for cases where it is needed...
>>> 2. libraries can already access the includes from drivers or other
>>> places fairly easily, just by adding the relevant "-I" flag to the
>>> CFLAGS for that lib.
>>> 
>>> That said, since the work is already done developing this, and if it
>>> doesn't hurt in terms of build time, I suppose we might as well merge
>>> it in.
>>> 
>>> So tentative ack from me, subject to testing and feedback from others.
>> 
>> +1, I already have to make sure everything is symlinked first in my private DPDK work for other reasons. This patch would allow me to remove that special code.
>> 
>>> 
>>> /Bruce
>> 
>> Regards,
>> Keith
>> 
> 
> Personally I do not like this approach.
> 
> A well designed architecture introduces constraints that developers
> ought to follow. These constraints, when well defined, foster a cleaner
> growth on top of it with better practices.
> 
> This solution is a crutch meant to alleviate other deep-rooted issues that
> should be fixed anyway. It makes them disappear right now, only for
> them to reappear when people will write libs and drivers with blurred
> hierarchies and hard-to-determine dependencies.
> 
> These constraints should be a tool for developers to be critical of their work
> and help them see whether they are making a mistake, for example by
> putting implementation specific data in generic structures (as seen by
> the problems at the root of this RFC: KNI, pmdinfogen dependencies).
> 
> This would have led for example eventdev, cryptodev, ethdev to leave PCI
> specific data within their structures. Yes, it works. But it is not
> clean, it leads to ABI instability, unsafe design practices.
> 
> This RFC is the easy way out, making it work, at the price of technical
> debt.
> 
> I understand that it is a lot of work to properly clean up the
> structures and that ressource is scarce. Having a clear architecture and
> proper structures however helps external eyes to read, understand, use,
> and ultimately contribute.
> 
> This kind of move goes against the previous work that was done to
> make devices, drivers and buses generic, which I think was right.
> 
> I do not feel that it is my place to nack, nor that it is constructive
> to block this if others are thinking that it is useful; however I hope
> to sway others to my position.

I do not think this is a crutch as it allows the headers to be included from a single location, instead of relative includes, which can be the worst method.

The real problem is we did not police or restrict usage of structures/includes in the current work or patches. I suggest we start the cleanup of these dependencies and be more strict on what can be included in a feature or file. This way we can have both and it makes it easier for locating headers. We also do not really restrict or create public/private headers. Private headers should never be accessed by another feature/module or exported to the global location. Most if not all of the PMD headers should be private or they need to be split into a public/private set of headers.

> 
> Cheers,
> -- 
> Gaëtan Rivet
> 6WIND

Regards,
Keith


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2017-06-21 15:53 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-06-20 21:21 [RFC PATCH] mk: symlink every headers first Thomas Monjalon
2017-06-21 10:27 ` Bruce Richardson
2017-06-21 10:41   ` Thomas Monjalon
2017-06-21 12:52     ` Richardson, Bruce
2017-06-21 14:27   ` Wiles, Keith
2017-06-21 15:14     ` Gaëtan Rivet
2017-06-21 15:53       ` Wiles, Keith

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.