[PATCH 1/3] waf_generator: Copy headers if necessary.

Chris Johns chrisj at rtems.org
Wed Aug 9 23:08:05 UTC 2017


On 10/08/2017 02:29, Sichen Zhao wrote:
> From: Christian Mauderer <christian.mauderer at embedded-brains.de>
> 
> There are some cases, where a header is installed into a directory with
> a different name then it's source directory. In that case, the build
> might fail because the header is not found. One example would be the
> <openssl/opensslv.h>. The source for this file is in
> freebsd/crypto/openssl/crypto/opensslv.h.
> 
> To allow the build to work in such cases too, copy such files into a
> temporary location in the build tree.
> ---
>  builder.py       |  1 +
>  libbsd_waf.py    | 15 +++++++++++++++
>  waf_generator.py | 23 +++++++++++++++++++++++
>  3 files changed, 39 insertions(+)
> 
> diff --git a/builder.py b/builder.py
> index bb633cb..53802c7 100755
> --- a/builder.py
> +++ b/builder.py
> @@ -172,6 +172,7 @@ def commonNoWarnings():
>  
>  def includes():
>      return ['-Irtemsbsd/include',
> +            '-Ilibbsd_build/include',

Is this path under the 'build' directory?

Why the 2 directories in the path? Could the path simply be 'build-include' or
even 'include' ? We know the context because we are looking under the build
directory.

I would prefer:

def buildInclude():
      return 'libbsd_build/include'

The path can then be referenced in waf_generator.py where needed, for example:

   for i in builder.includes() + ['-I' + builder.buildInclude()]:
      ....

>              '-Ifreebsd/sys',
>              '-Ifreebsd/sys/contrib/pf',
>              '-Ifreebsd/sys/net',
> diff --git a/libbsd_waf.py b/libbsd_waf.py
> index aee2e7a..1784f8b 100644
> --- a/libbsd_waf.py
> +++ b/libbsd_waf.py
> @@ -62,6 +62,7 @@ def build(bld):
>          for i in ['-Irtemsbsd/@CPU@/include', '-Ifreebsd/sys/@CPU@/include']:
>              includes += ["%s" % (i[2:].replace("@CPU@", "x86"))]
>      includes += ["rtemsbsd/include"]
> +    includes += ["libbsd_build/include"]
>      includes += ["freebsd/sys"]
>      includes += ["freebsd/sys/contrib/pf"]
>      includes += ["freebsd/sys/net"]
> @@ -123,6 +124,20 @@ def build(bld):
>          rule = "sed -e 's/@NET_CFG_SELF_IP@/%s/' -e 's/@NET_CFG_NETMASK@/%s/' -e 's/@NET_CFG_PEER_IP@/%s/' -e 's/@NET_CFG_GATEWAY_IP@/%s/' < ${SRC} > ${TGT}" % (net_cfg_self_ip, net_cfg_netmask, net_cfg_peer_ip, net_cfg_gateway_ip),
>          update_outputs = True)
>  
> +    # copy headers if necessary
> +    header_build_copy_paths = [
> +                              ]
> +    for headers in header_build_copy_paths:
> +        target = os.path.join("libbsd_build/include", headers[2])
> +        start_dir = bld.path.find_dir(headers[0])
> +        for header in start_dir.ant_glob("**/" + headers[1]):

Do we always want to copy all the files?

> +            relsourcepath = os.path.relpath(str(header), start=str(start_dir))

Is 'str(header)' really 'header.abspath()' ? See
https://waf.io/apidocs/Node.html#waflib.Node.Node.__str__.

I prefer the explicit use of .abspath() than the conversion operator.

> +            targetheader = os.path.join(target, relsourcepath)
> +            bld(features = 'subst',
> +                target = targetheader,
> +                source = header,
> +                is_copy = True)

Does a clean remove these files?

> +
>      # KVM Symbols
>      bld(target = "rtemsbsd/rtems/rtems-kernel-kvm-symbols.c",
>          source = "rtemsbsd/rtems/generate_kvm_symbols",
> diff --git a/waf_generator.py b/waf_generator.py
> index 35fe35f..fb52250 100755
> --- a/waf_generator.py
> +++ b/waf_generator.py
> @@ -445,6 +445,29 @@ class ModuleManager(builder.ModuleManager):
>          self.add('')
>  
>          #
> +        # Add a copy rule for all headers where the install path and the source
> +        # path are not the same.
> +        #
> +        self.add('    # copy headers if necessary')
> +        headerPaths = builder.headerPaths()

Can we remove this line and then ....

> +        self.add('    header_build_copy_paths = [')
> +        for hp in headerPaths:

.... use:

           for hp in builder.headerPaths():
?

> +            if hp[2] != '' and not hp[0].endswith(hp[2]):

I am ok with another boolean field being add to tuples rather than needing to
encode this some how if that is useful.

If a new field is not added can you please update builder.py with this rule so
we know what to do when adding headers to builder.headerPaths()?

> +                self.add('                               %s,' % (str(hp)))
> +        self.add('                              ]')
> +        self.add('    for headers in header_build_copy_paths:')
> +        self.add('        target = os.path.join("libbsd_build/include", headers[2])')

Use builder.buildInclude() rather than hard coding the path.

> +        self.add('        start_dir = bld.path.find_dir(headers[0])')
> +        self.add('        for header in start_dir.ant_glob("**/" + headers[1]):')
> +        self.add('            relsourcepath = os.path.relpath(str(header), start=str(start_dir))')
> +        self.add('            targetheader = os.path.join(target, relsourcepath)')
> +        self.add('            bld(features = \'subst\',')
> +        self.add('                target = targetheader,')
> +        self.add('                source = header,')
> +        self.add('                is_copy = True)')
> +        self.add('')
> +
> +        #
>          # Add the specific rule based builders for generating files.
>          #
>          if 'KVMSymbols' in data:
> 

Do any of these files copied into the build tree need to be installed so users
can access then? I cannot see an install component.

Chris



More information about the devel mailing list