On 10/21/21 11:10 AM, Adrian Moreno wrote:
Currently, if "make" is run after the project is built, the root
manpage (ovn-detrace.1) is rebuilt unnecessarily.
The reason is that its dependencies are wrong: files such as
lib/common.man or lib/ovs.tmac do not exist in the project's root
path so "make" will constantly rebuild the manpage target. Instead, those
dependencies live in $ovs_src.
Modify sodepends.py to generate a makefile that contains the variable
names that point the right paths.
Signed-off-by: Adrian Moreno <[email protected]>
---
Hi Adrian,
I confirm this fixes the issue. I have some questions though.
Makefile.am | 2 +-
build-aux/sodepends.py | 45 ++++++++++++++++++++++++++++++++++++++----
manpages.mk | 12 +++++------
3 files changed, 48 insertions(+), 11 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 0169c96ef..3b0df8393 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -425,7 +425,7 @@ CLEANFILES += flake8-check
include $(srcdir)/manpages.mk
$(srcdir)/manpages.mk: $(MAN_ROOTS) build-aux/sodepends.py
$(OVS_SRCDIR)/python/build/soutil.py
- @PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python
$(PYTHON3) $(srcdir)/build-aux/sodepends.py -I. -I$(srcdir) -I$(OVS_MANDIR)
$(MAN_ROOTS) >$(@F).tmp
+ @PYTHONPATH=$(OVS_SRCDIR)/python$(psep)$$PYTHONPATH$(psep)$(srcdir)/python
$(PYTHON3) $(srcdir)/build-aux/sodepends.py -I. -Isrcdir,$(srcdir)
-IOVS_MANDIR,$(OVS_MANDIR) $(MAN_ROOTS) >$(@F).tmp
@if cmp -s $(@F).tmp $@; then \
touch $@; \
rm -f $(@F).tmp; \
diff --git a/build-aux/sodepends.py b/build-aux/sodepends.py
index 45812bcbd..343fda1af 100755
--- a/build-aux/sodepends.py
+++ b/build-aux/sodepends.py
@@ -16,9 +16,44 @@
from build import soutil
import sys
+import getopt
+import os
-def sodepends(include_dirs, filenames, dst):
+def parse_include_dirs():
+ include_dirs = []
+ options, args = getopt.gnu_getopt(sys.argv[1:], 'I:', ['include='])
+ for key, value in options:
+ if key in ['-I', '--include']:
+ include_dirs.append(value.split(','))
+ else:
+ assert False
+
+ include_dirs.append(['.'])
+ return include_dirs, args
Why don't we use soutil.parse_include_dirs() directly and add the
'value.split(,)' there?
>> +
+
+def find_include_file(include_info, name):
+ for info in include_info:
+ if len(info) == 2:
+ dir = info[1]
+ var = "$(%s)/" % info[0]
+ else:
+ dir = info[0]
+ var = ""
+
+ file = "%s/%s" % (dir, name)
+ try:
+ os.stat(file)
+ return var + name
+ except OSError:
+ pass
+ sys.stderr.write("%s not found in: %s\n" %
+ (name, ' '.join(str(include_info))))
+ return None
+
Shouldn't this go to soutil.py in OVS instead?
+
+def sodepends(include_info, filenames, dst):
ok = True
print("# Generated automatically -- do not modify! "
"-*- buffer-read-only: t -*-")
@@ -28,6 +63,7 @@ def sodepends(include_dirs, filenames, dst):
continue
# Open file.
+ include_dirs = [info[0] for info in include_info]
fn = soutil.find_file(include_dirs, toplevel)
if not fn:
ok = False
@@ -47,8 +83,9 @@ def sodepends(include_dirs, filenames, dst):
name = soutil.extract_include_directive(line)
if name:
- if soutil.find_file(include_dirs, name):
- dependencies.append(name)
+ include_file = find_include_file(include_info, name)
+ if include_file:
+ dependencies.append(include_file)
else:
ok = False
@@ -62,6 +99,6 @@ def sodepends(include_dirs, filenames, dst):
if __name__ == '__main__':
- include_dirs, args = soutil.parse_include_dirs()
+ include_dirs, args = parse_include_dirs()
error = not sodepends(include_dirs, args, sys.stdout)
sys.exit(1 if error else 0)
+Numan
In general, I'm not completely sure about why sodepends.py needs to be
part of OVN and why we can't use the OVS version?