On 10/08/2017 02:29, Sichen Zhao wrote: > From: Christian Mauderer <christian.maude...@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 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel