diff mbox series

examples: warn about broken pkg-config

Message ID 20210119130324.154030-1-bruce.richardson@intel.com (mailing list archive)
State Accepted, archived
Delegated to: Thomas Monjalon
Headers show
Series examples: warn about broken pkg-config | expand

Checks

Context Check Description
ci/iol-testing warning Testing issues
ci/iol-abi-testing success Testing PASS
ci/iol-mellanox-Functional success Functional Testing PASS
ci/intel-Testing success Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-broadcom-Functional success Functional Testing PASS
ci/Intel-compilation success Compilation OK
ci/checkpatch success coding style OK

Commit Message

Bruce Richardson Jan. 19, 2021, 1:03 p.m. UTC
Since the examples are designed to be built by end-users using Make, we
can detect and warn about broken pkg-config on the user's system as part
of the build process.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
 examples/bbdev_app/Makefile                          |  8 ++++++++
 examples/bond/Makefile                               |  8 ++++++++
 examples/cmdline/Makefile                            |  8 ++++++++
 examples/distributor/Makefile                        |  8 ++++++++
 examples/ethtool/ethtool-app/Makefile                |  8 ++++++++
 examples/eventdev_pipeline/Makefile                  |  8 ++++++++
 examples/fips_validation/Makefile                    |  8 ++++++++
 examples/flow_classify/Makefile                      |  8 ++++++++
 examples/flow_filtering/Makefile                     |  8 ++++++++
 examples/helloworld/Makefile                         |  8 ++++++++
 examples/ioat/Makefile                               |  8 ++++++++
 examples/ip_fragmentation/Makefile                   | 11 ++++++++++-
 examples/ip_pipeline/Makefile                        |  8 ++++++++
 examples/ip_reassembly/Makefile                      |  8 ++++++++
 examples/ipsec-secgw/Makefile                        |  8 ++++++++
 examples/ipv4_multicast/Makefile                     |  8 ++++++++
 examples/kni/Makefile                                |  8 ++++++++
 examples/l2fwd-cat/Makefile                          |  8 ++++++++
 examples/l2fwd-crypto/Makefile                       |  8 ++++++++
 examples/l2fwd-event/Makefile                        |  8 ++++++++
 examples/l2fwd-jobstats/Makefile                     |  8 ++++++++
 examples/l2fwd-keepalive/Makefile                    |  8 ++++++++
 examples/l2fwd-keepalive/ka-agent/Makefile           |  8 ++++++++
 examples/l2fwd/Makefile                              |  8 ++++++++
 examples/l3fwd-acl/Makefile                          |  8 ++++++++
 examples/l3fwd-graph/Makefile                        | 12 +++++++++++-
 examples/l3fwd-power/Makefile                        |  8 ++++++++
 examples/l3fwd/Makefile                              |  8 ++++++++
 examples/link_status_interrupt/Makefile              |  8 ++++++++
 .../client_server_mp/mp_client/Makefile              |  8 ++++++++
 .../client_server_mp/mp_server/Makefile              |  8 ++++++++
 examples/multi_process/hotplug_mp/Makefile           |  8 ++++++++
 examples/multi_process/simple_mp/Makefile            |  8 ++++++++
 examples/multi_process/symmetric_mp/Makefile         |  8 ++++++++
 examples/ntb/Makefile                                | 11 ++++++++++-
 examples/packet_ordering/Makefile                    |  8 ++++++++
 examples/performance-thread/l3fwd-thread/Makefile    |  8 ++++++++
 examples/performance-thread/pthread_shim/Makefile    |  8 ++++++++
 examples/pipeline/Makefile                           |  8 ++++++++
 examples/ptpclient/Makefile                          |  8 ++++++++
 examples/qos_meter/Makefile                          |  8 ++++++++
 examples/qos_sched/Makefile                          |  8 ++++++++
 examples/rxtx_callbacks/Makefile                     |  8 ++++++++
 examples/server_node_efd/node/Makefile               |  8 ++++++++
 examples/server_node_efd/server/Makefile             |  8 ++++++++
 examples/service_cores/Makefile                      |  8 ++++++++
 examples/skeleton/Makefile                           |  8 ++++++++
 examples/timer/Makefile                              |  8 ++++++++
 examples/vdpa/Makefile                               |  8 ++++++++
 examples/vhost/Makefile                              |  8 ++++++++
 examples/vhost_blk/Makefile                          |  8 ++++++++
 examples/vhost_crypto/Makefile                       |  8 ++++++++
 examples/vm_power_manager/Makefile                   |  8 ++++++++
 examples/vm_power_manager/guest_cli/Makefile         |  8 ++++++++
 examples/vmdq/Makefile                               |  8 ++++++++
 examples/vmdq_dcb/Makefile                           |  8 ++++++++
 56 files changed, 455 insertions(+), 3 deletions(-)

Comments

Thomas Monjalon Jan. 29, 2021, 3:47 p.m. UTC | #1
19/01/2021 14:03, Bruce Richardson:
> Since the examples are designed to be built by end-users using Make, we
> can detect and warn about broken pkg-config on the user's system as part
> of the build process.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
>  examples/bbdev_app/Makefile                          |  8 ++++++++
>  examples/bond/Makefile                               |  8 ++++++++
>  examples/cmdline/Makefile                            |  8 ++++++++
>  examples/distributor/Makefile                        |  8 ++++++++
>  examples/ethtool/ethtool-app/Makefile                |  8 ++++++++
>  examples/eventdev_pipeline/Makefile                  |  8 ++++++++
>  examples/fips_validation/Makefile                    |  8 ++++++++
>  examples/flow_classify/Makefile                      |  8 ++++++++
>  examples/flow_filtering/Makefile                     |  8 ++++++++
>  examples/helloworld/Makefile                         |  8 ++++++++
>  examples/ioat/Makefile                               |  8 ++++++++
>  examples/ip_fragmentation/Makefile                   | 11 ++++++++++-
>  examples/ip_pipeline/Makefile                        |  8 ++++++++
>  examples/ip_reassembly/Makefile                      |  8 ++++++++
>  examples/ipsec-secgw/Makefile                        |  8 ++++++++
>  examples/ipv4_multicast/Makefile                     |  8 ++++++++
>  examples/kni/Makefile                                |  8 ++++++++
>  examples/l2fwd-cat/Makefile                          |  8 ++++++++
>  examples/l2fwd-crypto/Makefile                       |  8 ++++++++
>  examples/l2fwd-event/Makefile                        |  8 ++++++++
>  examples/l2fwd-jobstats/Makefile                     |  8 ++++++++
>  examples/l2fwd-keepalive/Makefile                    |  8 ++++++++
>  examples/l2fwd-keepalive/ka-agent/Makefile           |  8 ++++++++
>  examples/l2fwd/Makefile                              |  8 ++++++++
>  examples/l3fwd-acl/Makefile                          |  8 ++++++++
>  examples/l3fwd-graph/Makefile                        | 12 +++++++++++-
>  examples/l3fwd-power/Makefile                        |  8 ++++++++
>  examples/l3fwd/Makefile                              |  8 ++++++++
>  examples/link_status_interrupt/Makefile              |  8 ++++++++
>  .../client_server_mp/mp_client/Makefile              |  8 ++++++++
>  .../client_server_mp/mp_server/Makefile              |  8 ++++++++
>  examples/multi_process/hotplug_mp/Makefile           |  8 ++++++++
>  examples/multi_process/simple_mp/Makefile            |  8 ++++++++
>  examples/multi_process/symmetric_mp/Makefile         |  8 ++++++++
>  examples/ntb/Makefile                                | 11 ++++++++++-
>  examples/packet_ordering/Makefile                    |  8 ++++++++
>  examples/performance-thread/l3fwd-thread/Makefile    |  8 ++++++++
>  examples/performance-thread/pthread_shim/Makefile    |  8 ++++++++
>  examples/pipeline/Makefile                           |  8 ++++++++
>  examples/ptpclient/Makefile                          |  8 ++++++++
>  examples/qos_meter/Makefile                          |  8 ++++++++
>  examples/qos_sched/Makefile                          |  8 ++++++++
>  examples/rxtx_callbacks/Makefile                     |  8 ++++++++
>  examples/server_node_efd/node/Makefile               |  8 ++++++++
>  examples/server_node_efd/server/Makefile             |  8 ++++++++
>  examples/service_cores/Makefile                      |  8 ++++++++
>  examples/skeleton/Makefile                           |  8 ++++++++
>  examples/timer/Makefile                              |  8 ++++++++
>  examples/vdpa/Makefile                               |  8 ++++++++
>  examples/vhost/Makefile                              |  8 ++++++++
>  examples/vhost_blk/Makefile                          |  8 ++++++++
>  examples/vhost_crypto/Makefile                       |  8 ++++++++
>  examples/vm_power_manager/Makefile                   |  8 ++++++++
>  examples/vm_power_manager/guest_cli/Makefile         |  8 ++++++++
>  examples/vmdq/Makefile                               |  8 ++++++++
>  examples/vmdq_dcb/Makefile                           |  8 ++++++++
>  56 files changed, 455 insertions(+), 3 deletions(-)

That's a lot of duplicated code that may need some extension in future.
What about having a file examples/common.mk to include?
With the special syntax -include there will be no error in case
../common.mk does not exist. Deal?

ref: https://www.gnu.org/software/make/manual/html_node/Include.html
Bruce Richardson Jan. 29, 2021, 3:55 p.m. UTC | #2
On Fri, Jan 29, 2021 at 04:47:35PM +0100, Thomas Monjalon wrote:
> 19/01/2021 14:03, Bruce Richardson:
> > Since the examples are designed to be built by end-users using Make, we
> > can detect and warn about broken pkg-config on the user's system as part
> > of the build process.
> > 
> > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > ---
> >  examples/bbdev_app/Makefile                          |  8 ++++++++
> >  examples/bond/Makefile                               |  8 ++++++++
> >  examples/cmdline/Makefile                            |  8 ++++++++
> >  examples/distributor/Makefile                        |  8 ++++++++
> >  examples/ethtool/ethtool-app/Makefile                |  8 ++++++++
> >  examples/eventdev_pipeline/Makefile                  |  8 ++++++++
> >  examples/fips_validation/Makefile                    |  8 ++++++++
> >  examples/flow_classify/Makefile                      |  8 ++++++++
> >  examples/flow_filtering/Makefile                     |  8 ++++++++
> >  examples/helloworld/Makefile                         |  8 ++++++++
> >  examples/ioat/Makefile                               |  8 ++++++++
> >  examples/ip_fragmentation/Makefile                   | 11 ++++++++++-
> >  examples/ip_pipeline/Makefile                        |  8 ++++++++
> >  examples/ip_reassembly/Makefile                      |  8 ++++++++
> >  examples/ipsec-secgw/Makefile                        |  8 ++++++++
> >  examples/ipv4_multicast/Makefile                     |  8 ++++++++
> >  examples/kni/Makefile                                |  8 ++++++++
> >  examples/l2fwd-cat/Makefile                          |  8 ++++++++
> >  examples/l2fwd-crypto/Makefile                       |  8 ++++++++
> >  examples/l2fwd-event/Makefile                        |  8 ++++++++
> >  examples/l2fwd-jobstats/Makefile                     |  8 ++++++++
> >  examples/l2fwd-keepalive/Makefile                    |  8 ++++++++
> >  examples/l2fwd-keepalive/ka-agent/Makefile           |  8 ++++++++
> >  examples/l2fwd/Makefile                              |  8 ++++++++
> >  examples/l3fwd-acl/Makefile                          |  8 ++++++++
> >  examples/l3fwd-graph/Makefile                        | 12 +++++++++++-
> >  examples/l3fwd-power/Makefile                        |  8 ++++++++
> >  examples/l3fwd/Makefile                              |  8 ++++++++
> >  examples/link_status_interrupt/Makefile              |  8 ++++++++
> >  .../client_server_mp/mp_client/Makefile              |  8 ++++++++
> >  .../client_server_mp/mp_server/Makefile              |  8 ++++++++
> >  examples/multi_process/hotplug_mp/Makefile           |  8 ++++++++
> >  examples/multi_process/simple_mp/Makefile            |  8 ++++++++
> >  examples/multi_process/symmetric_mp/Makefile         |  8 ++++++++
> >  examples/ntb/Makefile                                | 11 ++++++++++-
> >  examples/packet_ordering/Makefile                    |  8 ++++++++
> >  examples/performance-thread/l3fwd-thread/Makefile    |  8 ++++++++
> >  examples/performance-thread/pthread_shim/Makefile    |  8 ++++++++
> >  examples/pipeline/Makefile                           |  8 ++++++++
> >  examples/ptpclient/Makefile                          |  8 ++++++++
> >  examples/qos_meter/Makefile                          |  8 ++++++++
> >  examples/qos_sched/Makefile                          |  8 ++++++++
> >  examples/rxtx_callbacks/Makefile                     |  8 ++++++++
> >  examples/server_node_efd/node/Makefile               |  8 ++++++++
> >  examples/server_node_efd/server/Makefile             |  8 ++++++++
> >  examples/service_cores/Makefile                      |  8 ++++++++
> >  examples/skeleton/Makefile                           |  8 ++++++++
> >  examples/timer/Makefile                              |  8 ++++++++
> >  examples/vdpa/Makefile                               |  8 ++++++++
> >  examples/vhost/Makefile                              |  8 ++++++++
> >  examples/vhost_blk/Makefile                          |  8 ++++++++
> >  examples/vhost_crypto/Makefile                       |  8 ++++++++
> >  examples/vm_power_manager/Makefile                   |  8 ++++++++
> >  examples/vm_power_manager/guest_cli/Makefile         |  8 ++++++++
> >  examples/vmdq/Makefile                               |  8 ++++++++
> >  examples/vmdq_dcb/Makefile                           |  8 ++++++++
> >  56 files changed, 455 insertions(+), 3 deletions(-)
> 
> That's a lot of duplicated code that may need some extension in future.
> What about having a file examples/common.mk to include?
> With the special syntax -include there will be no error in case
> ../common.mk does not exist. Deal?
> 
> ref: https://www.gnu.org/software/make/manual/html_node/Include.html
> 

Yes, and no. There is far more boilerplate already in these files which
needs to be consolidated, so I see little point in just trying to extract
this part out alone. Therefore, what I'd like to see done (if ever someone
has the time) is to extract all the boilerplate out to a common makefile,
but also add a postinstall script to flatten out the makefile on install,
so that each example is once again self-contained.

I've been thinking about this for a while, just haven't got time for it.

/Bruce
Anatoly Burakov Jan. 29, 2021, 4:04 p.m. UTC | #3
On 29-Jan-21 3:55 PM, Bruce Richardson wrote:
> On Fri, Jan 29, 2021 at 04:47:35PM +0100, Thomas Monjalon wrote:
>> 19/01/2021 14:03, Bruce Richardson:
>>> Since the examples are designed to be built by end-users using Make, we
>>> can detect and warn about broken pkg-config on the user's system as part
>>> of the build process.
>>>
>>> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
>>> ---
>>>   examples/bbdev_app/Makefile                          |  8 ++++++++
>>>   examples/bond/Makefile                               |  8 ++++++++
>>>   examples/cmdline/Makefile                            |  8 ++++++++
>>>   examples/distributor/Makefile                        |  8 ++++++++
>>>   examples/ethtool/ethtool-app/Makefile                |  8 ++++++++
>>>   examples/eventdev_pipeline/Makefile                  |  8 ++++++++
>>>   examples/fips_validation/Makefile                    |  8 ++++++++
>>>   examples/flow_classify/Makefile                      |  8 ++++++++
>>>   examples/flow_filtering/Makefile                     |  8 ++++++++
>>>   examples/helloworld/Makefile                         |  8 ++++++++
>>>   examples/ioat/Makefile                               |  8 ++++++++
>>>   examples/ip_fragmentation/Makefile                   | 11 ++++++++++-
>>>   examples/ip_pipeline/Makefile                        |  8 ++++++++
>>>   examples/ip_reassembly/Makefile                      |  8 ++++++++
>>>   examples/ipsec-secgw/Makefile                        |  8 ++++++++
>>>   examples/ipv4_multicast/Makefile                     |  8 ++++++++
>>>   examples/kni/Makefile                                |  8 ++++++++
>>>   examples/l2fwd-cat/Makefile                          |  8 ++++++++
>>>   examples/l2fwd-crypto/Makefile                       |  8 ++++++++
>>>   examples/l2fwd-event/Makefile                        |  8 ++++++++
>>>   examples/l2fwd-jobstats/Makefile                     |  8 ++++++++
>>>   examples/l2fwd-keepalive/Makefile                    |  8 ++++++++
>>>   examples/l2fwd-keepalive/ka-agent/Makefile           |  8 ++++++++
>>>   examples/l2fwd/Makefile                              |  8 ++++++++
>>>   examples/l3fwd-acl/Makefile                          |  8 ++++++++
>>>   examples/l3fwd-graph/Makefile                        | 12 +++++++++++-
>>>   examples/l3fwd-power/Makefile                        |  8 ++++++++
>>>   examples/l3fwd/Makefile                              |  8 ++++++++
>>>   examples/link_status_interrupt/Makefile              |  8 ++++++++
>>>   .../client_server_mp/mp_client/Makefile              |  8 ++++++++
>>>   .../client_server_mp/mp_server/Makefile              |  8 ++++++++
>>>   examples/multi_process/hotplug_mp/Makefile           |  8 ++++++++
>>>   examples/multi_process/simple_mp/Makefile            |  8 ++++++++
>>>   examples/multi_process/symmetric_mp/Makefile         |  8 ++++++++
>>>   examples/ntb/Makefile                                | 11 ++++++++++-
>>>   examples/packet_ordering/Makefile                    |  8 ++++++++
>>>   examples/performance-thread/l3fwd-thread/Makefile    |  8 ++++++++
>>>   examples/performance-thread/pthread_shim/Makefile    |  8 ++++++++
>>>   examples/pipeline/Makefile                           |  8 ++++++++
>>>   examples/ptpclient/Makefile                          |  8 ++++++++
>>>   examples/qos_meter/Makefile                          |  8 ++++++++
>>>   examples/qos_sched/Makefile                          |  8 ++++++++
>>>   examples/rxtx_callbacks/Makefile                     |  8 ++++++++
>>>   examples/server_node_efd/node/Makefile               |  8 ++++++++
>>>   examples/server_node_efd/server/Makefile             |  8 ++++++++
>>>   examples/service_cores/Makefile                      |  8 ++++++++
>>>   examples/skeleton/Makefile                           |  8 ++++++++
>>>   examples/timer/Makefile                              |  8 ++++++++
>>>   examples/vdpa/Makefile                               |  8 ++++++++
>>>   examples/vhost/Makefile                              |  8 ++++++++
>>>   examples/vhost_blk/Makefile                          |  8 ++++++++
>>>   examples/vhost_crypto/Makefile                       |  8 ++++++++
>>>   examples/vm_power_manager/Makefile                   |  8 ++++++++
>>>   examples/vm_power_manager/guest_cli/Makefile         |  8 ++++++++
>>>   examples/vmdq/Makefile                               |  8 ++++++++
>>>   examples/vmdq_dcb/Makefile                           |  8 ++++++++
>>>   56 files changed, 455 insertions(+), 3 deletions(-)
>>
>> That's a lot of duplicated code that may need some extension in future.
>> What about having a file examples/common.mk to include?
>> With the special syntax -include there will be no error in case
>> ../common.mk does not exist. Deal?
>>
>> ref: https://www.gnu.org/software/make/manual/html_node/Include.html
>>
> 
> Yes, and no. There is far more boilerplate already in these files which
> needs to be consolidated, so I see little point in just trying to extract
> this part out alone. Therefore, what I'd like to see done (if ever someone
> has the time) is to extract all the boilerplate out to a common makefile,
> but also add a postinstall script to flatten out the makefile on install,
> so that each example is once again self-contained.
> 
> I've been thinking about this for a while, just haven't got time for it.
> 
> /Bruce
> 

These makefiles are supposed to be examples. Meaning, it should be 
possible to just take the example app and compile it as is. That means 
we can't rely on external makefiles, they're supposed to be self-contained.
Bruce Richardson Jan. 29, 2021, 4:05 p.m. UTC | #4
On Fri, Jan 29, 2021 at 04:04:18PM +0000, Burakov, Anatoly wrote:
> On 29-Jan-21 3:55 PM, Bruce Richardson wrote:
> > On Fri, Jan 29, 2021 at 04:47:35PM +0100, Thomas Monjalon wrote:
> > > 19/01/2021 14:03, Bruce Richardson:
> > > > Since the examples are designed to be built by end-users using Make, we
> > > > can detect and warn about broken pkg-config on the user's system as part
> > > > of the build process.
> > > > 
> > > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> > > > ---
> > > >   examples/bbdev_app/Makefile                          |  8 ++++++++
> > > >   examples/bond/Makefile                               |  8 ++++++++
> > > >   examples/cmdline/Makefile                            |  8 ++++++++
> > > >   examples/distributor/Makefile                        |  8 ++++++++
> > > >   examples/ethtool/ethtool-app/Makefile                |  8 ++++++++
> > > >   examples/eventdev_pipeline/Makefile                  |  8 ++++++++
> > > >   examples/fips_validation/Makefile                    |  8 ++++++++
> > > >   examples/flow_classify/Makefile                      |  8 ++++++++
> > > >   examples/flow_filtering/Makefile                     |  8 ++++++++
> > > >   examples/helloworld/Makefile                         |  8 ++++++++
> > > >   examples/ioat/Makefile                               |  8 ++++++++
> > > >   examples/ip_fragmentation/Makefile                   | 11 ++++++++++-
> > > >   examples/ip_pipeline/Makefile                        |  8 ++++++++
> > > >   examples/ip_reassembly/Makefile                      |  8 ++++++++
> > > >   examples/ipsec-secgw/Makefile                        |  8 ++++++++
> > > >   examples/ipv4_multicast/Makefile                     |  8 ++++++++
> > > >   examples/kni/Makefile                                |  8 ++++++++
> > > >   examples/l2fwd-cat/Makefile                          |  8 ++++++++
> > > >   examples/l2fwd-crypto/Makefile                       |  8 ++++++++
> > > >   examples/l2fwd-event/Makefile                        |  8 ++++++++
> > > >   examples/l2fwd-jobstats/Makefile                     |  8 ++++++++
> > > >   examples/l2fwd-keepalive/Makefile                    |  8 ++++++++
> > > >   examples/l2fwd-keepalive/ka-agent/Makefile           |  8 ++++++++
> > > >   examples/l2fwd/Makefile                              |  8 ++++++++
> > > >   examples/l3fwd-acl/Makefile                          |  8 ++++++++
> > > >   examples/l3fwd-graph/Makefile                        | 12 +++++++++++-
> > > >   examples/l3fwd-power/Makefile                        |  8 ++++++++
> > > >   examples/l3fwd/Makefile                              |  8 ++++++++
> > > >   examples/link_status_interrupt/Makefile              |  8 ++++++++
> > > >   .../client_server_mp/mp_client/Makefile              |  8 ++++++++
> > > >   .../client_server_mp/mp_server/Makefile              |  8 ++++++++
> > > >   examples/multi_process/hotplug_mp/Makefile           |  8 ++++++++
> > > >   examples/multi_process/simple_mp/Makefile            |  8 ++++++++
> > > >   examples/multi_process/symmetric_mp/Makefile         |  8 ++++++++
> > > >   examples/ntb/Makefile                                | 11 ++++++++++-
> > > >   examples/packet_ordering/Makefile                    |  8 ++++++++
> > > >   examples/performance-thread/l3fwd-thread/Makefile    |  8 ++++++++
> > > >   examples/performance-thread/pthread_shim/Makefile    |  8 ++++++++
> > > >   examples/pipeline/Makefile                           |  8 ++++++++
> > > >   examples/ptpclient/Makefile                          |  8 ++++++++
> > > >   examples/qos_meter/Makefile                          |  8 ++++++++
> > > >   examples/qos_sched/Makefile                          |  8 ++++++++
> > > >   examples/rxtx_callbacks/Makefile                     |  8 ++++++++
> > > >   examples/server_node_efd/node/Makefile               |  8 ++++++++
> > > >   examples/server_node_efd/server/Makefile             |  8 ++++++++
> > > >   examples/service_cores/Makefile                      |  8 ++++++++
> > > >   examples/skeleton/Makefile                           |  8 ++++++++
> > > >   examples/timer/Makefile                              |  8 ++++++++
> > > >   examples/vdpa/Makefile                               |  8 ++++++++
> > > >   examples/vhost/Makefile                              |  8 ++++++++
> > > >   examples/vhost_blk/Makefile                          |  8 ++++++++
> > > >   examples/vhost_crypto/Makefile                       |  8 ++++++++
> > > >   examples/vm_power_manager/Makefile                   |  8 ++++++++
> > > >   examples/vm_power_manager/guest_cli/Makefile         |  8 ++++++++
> > > >   examples/vmdq/Makefile                               |  8 ++++++++
> > > >   examples/vmdq_dcb/Makefile                           |  8 ++++++++
> > > >   56 files changed, 455 insertions(+), 3 deletions(-)
> > > 
> > > That's a lot of duplicated code that may need some extension in future.
> > > What about having a file examples/common.mk to include?
> > > With the special syntax -include there will be no error in case
> > > ../common.mk does not exist. Deal?
> > > 
> > > ref: https://www.gnu.org/software/make/manual/html_node/Include.html
> > > 
> > 
> > Yes, and no. There is far more boilerplate already in these files which
> > needs to be consolidated, so I see little point in just trying to extract
> > this part out alone. Therefore, what I'd like to see done (if ever someone
> > has the time) is to extract all the boilerplate out to a common makefile,
> > but also add a postinstall script to flatten out the makefile on install,
> > so that each example is once again self-contained.
> > 
> > I've been thinking about this for a while, just haven't got time for it.
> > 
> > /Bruce
> > 
> 
> These makefiles are supposed to be examples. Meaning, it should be possible
> to just take the example app and compile it as is. That means we can't rely
> on external makefiles, they're supposed to be self-contained.
> 
Exactly. Hence the need to "flatten" out the makefiles, by changing the
include to be the actual contents.
Thomas Monjalon Jan. 29, 2021, 4:27 p.m. UTC | #5
29/01/2021 17:05, Bruce Richardson:
> On Fri, Jan 29, 2021 at 04:04:18PM +0000, Burakov, Anatoly wrote:
> > On 29-Jan-21 3:55 PM, Bruce Richardson wrote:
> > > On Fri, Jan 29, 2021 at 04:47:35PM +0100, Thomas Monjalon wrote:
> > > > 19/01/2021 14:03, Bruce Richardson:
> > > > > Since the examples are designed to be built by end-users using Make, we
> > > > > can detect and warn about broken pkg-config on the user's system as part
> > > > > of the build process.
> > > > > 
> > > > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
[...]
> > > > >   56 files changed, 455 insertions(+), 3 deletions(-)
> > > > 
> > > > That's a lot of duplicated code that may need some extension in future.
> > > > What about having a file examples/common.mk to include?
> > > > With the special syntax -include there will be no error in case
> > > > ../common.mk does not exist. Deal?
> > > > 
> > > > ref: https://www.gnu.org/software/make/manual/html_node/Include.html
> > > > 
> > > 
> > > Yes, and no. There is far more boilerplate already in these files which
> > > needs to be consolidated, so I see little point in just trying to extract
> > > this part out alone. Therefore, what I'd like to see done (if ever someone
> > > has the time) is to extract all the boilerplate out to a common makefile,
> > > but also add a postinstall script to flatten out the makefile on install,
> > > so that each example is once again self-contained.
> > > 
> > > I've been thinking about this for a while, just haven't got time for it.
> > > 
> > > /Bruce
> > > 
> > 
> > These makefiles are supposed to be examples. Meaning, it should be possible
> > to just take the example app and compile it as is. That means we can't rely
> > on external makefiles, they're supposed to be self-contained.
> > 
> Exactly. Hence the need to "flatten" out the makefiles, by changing the
> include to be the actual contents.

My proposal is just for pkg-config check, which doesn't serve as an example.
If this check is not there, it still works.
That's what -include is for: include optional stuff which can be missing.
Bruce Richardson Jan. 29, 2021, 4:51 p.m. UTC | #6
On Fri, Jan 29, 2021 at 05:27:11PM +0100, Thomas Monjalon wrote:
> 29/01/2021 17:05, Bruce Richardson:
> > On Fri, Jan 29, 2021 at 04:04:18PM +0000, Burakov, Anatoly wrote:
> > > On 29-Jan-21 3:55 PM, Bruce Richardson wrote:
> > > > On Fri, Jan 29, 2021 at 04:47:35PM +0100, Thomas Monjalon wrote:
> > > > > 19/01/2021 14:03, Bruce Richardson:
> > > > > > Since the examples are designed to be built by end-users using Make, we
> > > > > > can detect and warn about broken pkg-config on the user's system as part
> > > > > > of the build process.
> > > > > > 
> > > > > > Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
> [...]
> > > > > >   56 files changed, 455 insertions(+), 3 deletions(-)
> > > > > 
> > > > > That's a lot of duplicated code that may need some extension in future.
> > > > > What about having a file examples/common.mk to include?
> > > > > With the special syntax -include there will be no error in case
> > > > > ../common.mk does not exist. Deal?
> > > > > 
> > > > > ref: https://www.gnu.org/software/make/manual/html_node/Include.html
> > > > > 
> > > > 
> > > > Yes, and no. There is far more boilerplate already in these files which
> > > > needs to be consolidated, so I see little point in just trying to extract
> > > > this part out alone. Therefore, what I'd like to see done (if ever someone
> > > > has the time) is to extract all the boilerplate out to a common makefile,
> > > > but also add a postinstall script to flatten out the makefile on install,
> > > > so that each example is once again self-contained.
> > > > 
> > > > I've been thinking about this for a while, just haven't got time for it.
> > > > 
> > > > /Bruce
> > > > 
> > > 
> > > These makefiles are supposed to be examples. Meaning, it should be possible
> > > to just take the example app and compile it as is. That means we can't rely
> > > on external makefiles, they're supposed to be self-contained.
> > > 
> > Exactly. Hence the need to "flatten" out the makefiles, by changing the
> > include to be the actual contents.
> 
> My proposal is just for pkg-config check, which doesn't serve as an example.
> If this check is not there, it still works.
> That's what -include is for: include optional stuff which can be missing.
> 

Yes, but given the number of times I've had queries about the static builds
being broken on RHEL7, I think it's quite important that this check be
there to flag it. Therefore, I'd rather not have it in a common file that
could be missed.
Thomas Monjalon Jan. 30, 2021, 12:32 a.m. UTC | #7
19/01/2021 14:03, Bruce Richardson:
> Since the examples are designed to be built by end-users using Make, we
> can detect and warn about broken pkg-config on the user's system as part
> of the build process.
> 
> Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>

Applied, thanks
diff mbox series

Patch

diff --git a/examples/bbdev_app/Makefile b/examples/bbdev_app/Makefile
index 2f156736d..03bf1edb1 100644
--- a/examples/bbdev_app/Makefile
+++ b/examples/bbdev_app/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/bond/Makefile b/examples/bond/Makefile
index 8700b589f..313a5389e 100644
--- a/examples/bond/Makefile
+++ b/examples/bond/Makefile
@@ -28,6 +28,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/cmdline/Makefile b/examples/cmdline/Makefile
index 09da84ba0..0b6a3c6dd 100644
--- a/examples/cmdline/Makefile
+++ b/examples/cmdline/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/distributor/Makefile b/examples/distributor/Makefile
index d7615f9a3..9630fea3f 100644
--- a/examples/distributor/Makefile
+++ b/examples/distributor/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/ethtool/ethtool-app/Makefile b/examples/ethtool/ethtool-app/Makefile
index 93ef5c27c..685afbdf3 100644
--- a/examples/ethtool/ethtool-app/Makefile
+++ b/examples/ethtool/ethtool-app/Makefile
@@ -31,6 +31,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED += $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC += $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/eventdev_pipeline/Makefile b/examples/eventdev_pipeline/Makefile
index f5072a2b0..5cf88ca41 100644
--- a/examples/eventdev_pipeline/Makefile
+++ b/examples/eventdev_pipeline/Makefile
@@ -28,6 +28,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/fips_validation/Makefile b/examples/fips_validation/Makefile
index 8f82a4c6c..1cc33450c 100644
--- a/examples/fips_validation/Makefile
+++ b/examples/fips_validation/Makefile
@@ -36,6 +36,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/flow_classify/Makefile b/examples/flow_classify/Makefile
index 4c215daf1..1caa93a9b 100644
--- a/examples/flow_classify/Makefile
+++ b/examples/flow_classify/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/flow_filtering/Makefile b/examples/flow_filtering/Makefile
index 9bc917934..b0cdeab3a 100644
--- a/examples/flow_filtering/Makefile
+++ b/examples/flow_filtering/Makefile
@@ -24,6 +24,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/helloworld/Makefile b/examples/helloworld/Makefile
index 436569f5a..1b4dfcdde 100644
--- a/examples/helloworld/Makefile
+++ b/examples/helloworld/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/ioat/Makefile b/examples/ioat/Makefile
index c13ad8d8a..c82ba1758 100644
--- a/examples/ioat/Makefile
+++ b/examples/ioat/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/ip_fragmentation/Makefile b/examples/ip_fragmentation/Makefile
index f6baf635b..b5b546e20 100644
--- a/examples/ip_fragmentation/Makefile
+++ b/examples/ip_fragmentation/Makefile
@@ -24,10 +24,19 @@  PKGCONF ?= pkg-config
 
 PC_FILE := $(shell $(PKGCONF) --path libdpdk 2>/dev/null)
 CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
-CFLAGS += -DALLOW_EXPERIMENTAL_API
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
+CFLAGS += -DALLOW_EXPERIMENTAL_API
+
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
 	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
 
diff --git a/examples/ip_pipeline/Makefile b/examples/ip_pipeline/Makefile
index 4b391973c..96f492a5e 100644
--- a/examples/ip_pipeline/Makefile
+++ b/examples/ip_pipeline/Makefile
@@ -39,6 +39,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -I. -DALLOW_EXPERIMENTAL_API -D_GNU_SOURCE
 
 OBJS := $(patsubst %.c,build/%.o,$(SRCS-y))
diff --git a/examples/ip_reassembly/Makefile b/examples/ip_reassembly/Makefile
index 740f4721d..f9d0e5a6c 100644
--- a/examples/ip_reassembly/Makefile
+++ b/examples/ip_reassembly/Makefile
@@ -27,6 +27,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/ipsec-secgw/Makefile b/examples/ipsec-secgw/Makefile
index 7670cc368..55a7ac6d8 100644
--- a/examples/ipsec-secgw/Makefile
+++ b/examples/ipsec-secgw/Makefile
@@ -41,6 +41,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 CFLAGS += -Wno-address-of-packed-member
 
diff --git a/examples/ipv4_multicast/Makefile b/examples/ipv4_multicast/Makefile
index 7ea44e6f6..614b17705 100644
--- a/examples/ipv4_multicast/Makefile
+++ b/examples/ipv4_multicast/Makefile
@@ -27,6 +27,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/kni/Makefile b/examples/kni/Makefile
index bbf3bcae1..f87e93dcf 100644
--- a/examples/kni/Makefile
+++ b/examples/kni/Makefile
@@ -27,6 +27,14 @@  CFLAGS += -DALLOW_EXPERIMENTAL_API
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 LDFLAGS += -pthread
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/l2fwd-cat/Makefile b/examples/l2fwd-cat/Makefile
index 9ba113561..85066612b 100644
--- a/examples/l2fwd-cat/Makefile
+++ b/examples/l2fwd-cat/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 LDFLAGS += -lpqos
diff --git a/examples/l2fwd-crypto/Makefile b/examples/l2fwd-crypto/Makefile
index 7731eccd0..8d44e95ed 100644
--- a/examples/l2fwd-crypto/Makefile
+++ b/examples/l2fwd-crypto/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 CONFIG_DEFINES = $(shell $(CC) $(CFLAGS) -dM -E - < /dev/null)
 ifneq ($(findstring RTE_CRYPTO_SCHEDULER,$(CONFIG_DEFINES)),)
diff --git a/examples/l2fwd-event/Makefile b/examples/l2fwd-event/Makefile
index 384224b24..1570b1f83 100644
--- a/examples/l2fwd-event/Makefile
+++ b/examples/l2fwd-event/Makefile
@@ -32,6 +32,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/l2fwd-jobstats/Makefile b/examples/l2fwd-jobstats/Makefile
index fcb60b2a3..1a8842c64 100644
--- a/examples/l2fwd-jobstats/Makefile
+++ b/examples/l2fwd-jobstats/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/l2fwd-keepalive/Makefile b/examples/l2fwd-keepalive/Makefile
index 09a891149..bcc075f0d 100644
--- a/examples/l2fwd-keepalive/Makefile
+++ b/examples/l2fwd-keepalive/Makefile
@@ -28,6 +28,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/l2fwd-keepalive/ka-agent/Makefile b/examples/l2fwd-keepalive/ka-agent/Makefile
index 8b329a78b..ef4950f23 100644
--- a/examples/l2fwd-keepalive/ka-agent/Makefile
+++ b/examples/l2fwd-keepalive/ka-agent/Makefile
@@ -30,6 +30,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/l2fwd/Makefile b/examples/l2fwd/Makefile
index b180deb86..44bc9ef4d 100644
--- a/examples/l2fwd/Makefile
+++ b/examples/l2fwd/Makefile
@@ -28,6 +28,14 @@  CFLAGS += -DALLOW_EXPERIMENTAL_API
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
 	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
 
diff --git a/examples/l3fwd-acl/Makefile b/examples/l3fwd-acl/Makefile
index 3420ea3a9..49ad69811 100644
--- a/examples/l3fwd-acl/Makefile
+++ b/examples/l3fwd-acl/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/l3fwd-graph/Makefile b/examples/l3fwd-graph/Makefile
index 6e3d0bca0..9622e2358 100644
--- a/examples/l3fwd-graph/Makefile
+++ b/examples/l3fwd-graph/Makefile
@@ -22,10 +22,20 @@  static: build/$(APP)-static
 PKGCONF ?= pkg-config
 
 PC_FILE := $(shell $(PKGCONF) --path libdpdk 2>/dev/null)
-CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk) -DALLOW_EXPERIMENTAL_API
+CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
+CFLAGS += -DALLOW_EXPERIMENTAL_API
+
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
 	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
 
diff --git a/examples/l3fwd-power/Makefile b/examples/l3fwd-power/Makefile
index d69854c9f..50edc34e6 100644
--- a/examples/l3fwd-power/Makefile
+++ b/examples/l3fwd-power/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/l3fwd/Makefile b/examples/l3fwd/Makefile
index 7e70bbd82..ff3930c42 100644
--- a/examples/l3fwd/Makefile
+++ b/examples/l3fwd/Makefile
@@ -29,6 +29,14 @@  CFLAGS += -DALLOW_EXPERIMENTAL_API
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
 	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
 
diff --git a/examples/link_status_interrupt/Makefile b/examples/link_status_interrupt/Makefile
index fa608c56a..583a84736 100644
--- a/examples/link_status_interrupt/Makefile
+++ b/examples/link_status_interrupt/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/multi_process/client_server_mp/mp_client/Makefile b/examples/multi_process/client_server_mp/mp_client/Makefile
index bc00a1c87..2c389f35b 100644
--- a/examples/multi_process/client_server_mp/mp_client/Makefile
+++ b/examples/multi_process/client_server_mp/mp_client/Makefile
@@ -28,6 +28,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/multi_process/client_server_mp/mp_server/Makefile b/examples/multi_process/client_server_mp/mp_server/Makefile
index d066524b3..bc04ab733 100644
--- a/examples/multi_process/client_server_mp/mp_server/Makefile
+++ b/examples/multi_process/client_server_mp/mp_server/Makefile
@@ -28,6 +28,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/multi_process/hotplug_mp/Makefile b/examples/multi_process/hotplug_mp/Makefile
index 3122449d6..75ae8eb9a 100644
--- a/examples/multi_process/hotplug_mp/Makefile
+++ b/examples/multi_process/hotplug_mp/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/multi_process/simple_mp/Makefile b/examples/multi_process/simple_mp/Makefile
index d03597c4c..675e8c3f9 100644
--- a/examples/multi_process/simple_mp/Makefile
+++ b/examples/multi_process/simple_mp/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/multi_process/symmetric_mp/Makefile b/examples/multi_process/symmetric_mp/Makefile
index 45b7214cb..5a671e54a 100644
--- a/examples/multi_process/symmetric_mp/Makefile
+++ b/examples/multi_process/symmetric_mp/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/ntb/Makefile b/examples/ntb/Makefile
index d35dabc47..8e1f52f17 100644
--- a/examples/ntb/Makefile
+++ b/examples/ntb/Makefile
@@ -26,10 +26,19 @@  LDFLAGS += -pthread
 
 PC_FILE := $(shell $(PKGCONF) --path libdpdk 2>/dev/null)
 CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
-CFLAGS += -DALLOW_EXPERIMENTAL_API
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
+CFLAGS += -DALLOW_EXPERIMENTAL_API
+
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
 	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
 
diff --git a/examples/packet_ordering/Makefile b/examples/packet_ordering/Makefile
index 09abda91e..dcf583ec0 100644
--- a/examples/packet_ordering/Makefile
+++ b/examples/packet_ordering/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/performance-thread/l3fwd-thread/Makefile b/examples/performance-thread/l3fwd-thread/Makefile
index ca1a5d087..4f518358d 100644
--- a/examples/performance-thread/l3fwd-thread/Makefile
+++ b/examples/performance-thread/l3fwd-thread/Makefile
@@ -9,6 +9,14 @@  SRCS-y := main.c
 
 include ../common/common.mk
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 # Build using pkg-config variables if possible
diff --git a/examples/performance-thread/pthread_shim/Makefile b/examples/performance-thread/pthread_shim/Makefile
index 6b19ff63f..5aa401dc4 100644
--- a/examples/performance-thread/pthread_shim/Makefile
+++ b/examples/performance-thread/pthread_shim/Makefile
@@ -9,6 +9,14 @@  SRCS-y := main.c pthread_shim.c
 
 include ../common/common.mk
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 CFLAGS += -D_GNU_SOURCE
 LDFLAGS += "-Wl,--copy-dt-needed-entries"
diff --git a/examples/pipeline/Makefile b/examples/pipeline/Makefile
index d0a1f02e1..fcba51fd4 100644
--- a/examples/pipeline/Makefile
+++ b/examples/pipeline/Makefile
@@ -30,6 +30,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -I. -DALLOW_EXPERIMENTAL_API -D_GNU_SOURCE
 
 OBJS := $(patsubst %.c,build/%.o,$(SRCS-y))
diff --git a/examples/ptpclient/Makefile b/examples/ptpclient/Makefile
index 9f56a5e7a..f0d38c5c4 100644
--- a/examples/ptpclient/Makefile
+++ b/examples/ptpclient/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/qos_meter/Makefile b/examples/qos_meter/Makefile
index 7a5381829..1772c75a1 100644
--- a/examples/qos_meter/Makefile
+++ b/examples/qos_meter/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/qos_sched/Makefile b/examples/qos_sched/Makefile
index f42406fe1..8187542eb 100644
--- a/examples/qos_sched/Makefile
+++ b/examples/qos_sched/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/rxtx_callbacks/Makefile b/examples/rxtx_callbacks/Makefile
index a618cdf75..4296b19f6 100644
--- a/examples/rxtx_callbacks/Makefile
+++ b/examples/rxtx_callbacks/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/server_node_efd/node/Makefile b/examples/server_node_efd/node/Makefile
index 2120de539..56550e6fe 100644
--- a/examples/server_node_efd/node/Makefile
+++ b/examples/server_node_efd/node/Makefile
@@ -28,6 +28,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/server_node_efd/server/Makefile b/examples/server_node_efd/server/Makefile
index 6b5878d8c..50e18e150 100644
--- a/examples/server_node_efd/server/Makefile
+++ b/examples/server_node_efd/server/Makefile
@@ -28,6 +28,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/service_cores/Makefile b/examples/service_cores/Makefile
index 754333c87..df0284bd0 100644
--- a/examples/service_cores/Makefile
+++ b/examples/service_cores/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/skeleton/Makefile b/examples/skeleton/Makefile
index 4fa97cb97..bbd2dc181 100644
--- a/examples/skeleton/Makefile
+++ b/examples/skeleton/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/timer/Makefile b/examples/timer/Makefile
index 70b1af9f4..4c0a0f62f 100644
--- a/examples/timer/Makefile
+++ b/examples/timer/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/vdpa/Makefile b/examples/vdpa/Makefile
index c4b2184ea..470ca57df 100644
--- a/examples/vdpa/Makefile
+++ b/examples/vdpa/Makefile
@@ -27,6 +27,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
 	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
 
diff --git a/examples/vhost/Makefile b/examples/vhost/Makefile
index 8c969caaa..145b3f79a 100644
--- a/examples/vhost/Makefile
+++ b/examples/vhost/Makefile
@@ -28,6 +28,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/vhost_blk/Makefile b/examples/vhost_blk/Makefile
index 792591386..2fe199454 100644
--- a/examples/vhost_blk/Makefile
+++ b/examples/vhost_blk/Makefile
@@ -28,6 +28,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/vhost_crypto/Makefile b/examples/vhost_crypto/Makefile
index 27abd9199..ce6f04624 100644
--- a/examples/vhost_crypto/Makefile
+++ b/examples/vhost_crypto/Makefile
@@ -27,6 +27,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
 	$(CC) $(CFLAGS) $(SRCS-y) -o $@ $(LDFLAGS) $(LDFLAGS_SHARED)
 
diff --git a/examples/vm_power_manager/Makefile b/examples/vm_power_manager/Makefile
index 8ac1180b2..2fff8dadd 100644
--- a/examples/vm_power_manager/Makefile
+++ b/examples/vm_power_manager/Makefile
@@ -32,6 +32,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 ifneq ($(shell $(PKGCONF) --atleast-version=0.9.3 libvirt; echo $$?), 0)
diff --git a/examples/vm_power_manager/guest_cli/Makefile b/examples/vm_power_manager/guest_cli/Makefile
index 1ee1ca101..e9dff4753 100644
--- a/examples/vm_power_manager/guest_cli/Makefile
+++ b/examples/vm_power_manager/guest_cli/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/vmdq/Makefile b/examples/vmdq/Makefile
index 749ed53c6..8edda6cd6 100644
--- a/examples/vmdq/Makefile
+++ b/examples/vmdq/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build
diff --git a/examples/vmdq_dcb/Makefile b/examples/vmdq_dcb/Makefile
index 1dd42105d..b5d2efa4a 100644
--- a/examples/vmdq_dcb/Makefile
+++ b/examples/vmdq_dcb/Makefile
@@ -26,6 +26,14 @@  CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk)
 LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk)
 LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)
 
+ifeq ($(MAKECMDGOALS),static)
+# check for broken pkg-config
+ifeq ($(shell echo $(LDFLAGS_STATIC) | grep 'whole-archive.*l:lib.*no-whole-archive'),)
+$(warning "pkg-config output list does not contain drivers between 'whole-archive'/'no-whole-archive' flags.")
+$(error "Cannot generate statically-linked binaries with this version of pkg-config")
+endif
+endif
+
 CFLAGS += -DALLOW_EXPERIMENTAL_API
 
 build/$(APP)-shared: $(SRCS-y) Makefile $(PC_FILE) | build