On Tue, May 5, 2020 at 4:13 PM Chris Johns <chr...@rtems.org> wrote:
>
>
> On 5 May 2020, at 5:37 pm, Vijay Kumar Banerjee <vi...@rtems.org> wrote:
>
> 
>
>
> On Tue, May 5, 2020 at 9:56 AM Chris Johns <chr...@rtems.org> wrote:
>>
>> On 4/5/20 8:16 pm, Vijay Kumar Banerjee wrote:
>> >
>> >
>> > On Mon, May 4, 2020 at 4:39 AM Chris Johns <chr...@rtems.org
>> > <mailto:chr...@rtems.org>> wrote:
>> >
>> >     Hi
>> >
>> >     Are uninstall command useful with RTEMS? A use case that shows how it
>> >     would be used may help.
>> >
>> > The use case in mind was libbsd. The uninstall command comes handy in
>> > cleaning off the files that were installed, and there's no need to delete 
>> > it
>> > manually. I remember having some issues with libbsd while taking a trial
>> > and error approach in searching for the right sources, the residue of the
>> > old build would often cause problems and I had to delete them manually.
>>
>> I understand. I see this as a development issue and not something a user
>> would typically do. A release can have the pieces in a vertically
>> software stack built on top of each other, i.e. a single prefix. For
>> development where you can have specific pieces that are moving relative
>> to each other I recommend separate sandboxing. The user manual details
>> this. Prefix based sandboxing lets you remove a specific prefix without
>> needing to rebuild the whole stack.
>>
>> >     I use separate prefixes to manage this. We do not track common files
>> >     when installing to a common prefix so building ARM and then PowerPC to
>> >     the same prefix then uninstalling only the PowerPC build would remove
>> >     files needed by ARM.
>> >
>> > waf only removes the files that have been installed with install_files. If 
>> > I
>> > run ./waf uninstall from libbsd, only the files under
>> > arm-rtems5/beagleboneblack/lib
>> > are getting affected.
>>
>> That must be the default uninstall for waf. We should decide to move one
>> way or the other, that is remove the uninstall because it is broken or
>> we fix it, i.e. your patch?
>>
>> I hesitate adding something that is not manually tested often and so not
>> kept up to date. Would a unit test be a solution? Something that
>> collects a hash based stamp for all the files under a prefix, performs
>> the install and the uninstall steps and then verifies the prefix tree is
>> exactly the same?
>>
> The uninstall function is currently broken but it would be nice to have.
>
>
> Sure that is fine with me.
>
> The unit-test approach sounds great and will make sure that it doesn't
> break anything. Is this an issue for the release if the uninstall is broken?
>
>
> I suggest doing the patch for master and we can review it for 5.2.
>
> Is there any example of some unit-test added like this?
>
>
> Not that I know of. If it is a single module maybe it can used in all our waf 
> repos.
>

Hi Chris,

I added support in rtems_waf to test the uninstall function, following
the approach that you suggested. I'm attaching the patch here, please
have a look.

I am using it in libbsd by calling it from wscript like this:
```
diff --git a/wscript b/wscript
index 0979644a..74fc1f48 100644
--- a/wscript
+++ b/wscript
@@ -226,6 +226,9 @@ def configure(conf):
     update_builders(conf, conf.env.BUILDSET)
     rtems.configure(conf, bsp_configure)

+def test(bld):
+    rtems.test_uninstall(bld)
+
 def build(bld):
     rtems.build(bld)
     builders[bld.libbsd_buildset_name].build(bld)
```
If this approach looks alright to you, I'll send a v2 of the patchset
for libbsd and rtems_waf for review.

Thanks,
Vijay
>
> Chris
From b78d5a654593b961e8964be2115333da326fe4ed Mon Sep 17 00:00:00 2001
From: Vijay Kumar Banerjee <vi...@rtems.org>
Date: Fri, 8 May 2020 00:11:38 +0530
Subject: [PATCH rtems_waf] rtems: Add function to test waf uninstall

---
 rtems.py | 40 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)

diff --git a/rtems.py b/rtems.py
index 067a213..ab6d03b 100644
--- a/rtems.py
+++ b/rtems.py
@@ -303,6 +303,46 @@ def build(bld):
     if bld.env.LONG_COMMANDS == 'yes':
         long_command_line()
 
+def get_dir_hash(bld):
+    from waflib import ConfigSet, Options
+    import hashlib
+
+    env = ConfigSet.ConfigSet()
+    env.load(Options.lockfile)
+    prefix = env.options['prefix']
+    shahash = hashlib.sha1()
+
+    for root, dirs, files in os.walk(prefix):
+        for names in files:
+            filepath = os.path.join(root, names)
+            try:
+                f1 = open(filepath, 'rb')
+            except:
+                f1.close()
+                continue
+
+            while 1:
+                buf = f1.read(4096)
+                if not buf:
+                    break
+                shahash.update(hashlib.sha1(buf).hexdigest())
+            f1.close()
+    return shahash.hexdigest()
+
+def test_uninstall(bld):
+    print('TESTING WAF UNINSTALL\n')
+    print('CALCULATING HASH BEFORE INSTALL')
+    initial_hash = get_dir_hash(bld)
+    subprocess.call(['./waf', 'install'])
+    subprocess.call(['./waf', 'uninstall'])
+    print('CALCULATING HASH AFTER UNINSTALL')
+    final_hash = get_dir_hash(bld)
+
+    if (initial_hash == final_hash):
+        print("TEST PASSED")
+    else:
+        print("TEST FAILED")
+
 def load_cpuopts(conf):
     options = ['RTEMS_DEBUG',
                'RTEMS_MULTIPROCESSING',
-- 
2.21.1

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to