diff options
Diffstat (limited to 'bitbake/lib/bb/build.py')
-rw-r--r-- | bitbake/lib/bb/build.py | 149 |
1 files changed, 44 insertions, 105 deletions
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py index 5ac191647c..5a1727116a 100644 --- a/bitbake/lib/bb/build.py +++ b/bitbake/lib/bb/build.py | |||
@@ -772,44 +772,7 @@ def exec_task(fn, task, d, profile = False): | |||
772 | event.fire(failedevent, d) | 772 | event.fire(failedevent, d) |
773 | return 1 | 773 | return 1 |
774 | 774 | ||
775 | def stamp_internal(taskname, d, file_name, baseonly=False, noextra=False): | 775 | def _get_cleanmask(taskname, mcfn): |
776 | """ | ||
777 | Internal stamp helper function | ||
778 | Makes sure the stamp directory exists | ||
779 | Returns the stamp path+filename | ||
780 | |||
781 | In the bitbake core, d can be a CacheData and file_name will be set. | ||
782 | When called in task context, d will be a data store, file_name will not be set | ||
783 | """ | ||
784 | taskflagname = taskname | ||
785 | if taskname.endswith("_setscene"): | ||
786 | taskflagname = taskname.replace("_setscene", "") | ||
787 | |||
788 | if file_name: | ||
789 | stamp = d.stamp[file_name] | ||
790 | extrainfo = d.stamp_extrainfo[file_name].get(taskflagname) or "" | ||
791 | else: | ||
792 | stamp = d.getVar('STAMP') | ||
793 | file_name = d.getVar('BB_FILENAME') | ||
794 | extrainfo = d.getVarFlag(taskflagname, 'stamp-extra-info') or "" | ||
795 | |||
796 | if baseonly: | ||
797 | return stamp | ||
798 | if noextra: | ||
799 | extrainfo = "" | ||
800 | |||
801 | if not stamp: | ||
802 | return | ||
803 | |||
804 | stamp = bb.parse.siggen.stampfile(stamp, file_name, taskname, extrainfo) | ||
805 | |||
806 | stampdir = os.path.dirname(stamp) | ||
807 | if cached_mtime_noerror(stampdir) == 0: | ||
808 | bb.utils.mkdirhier(stampdir) | ||
809 | |||
810 | return stamp | ||
811 | |||
812 | def stamp_cleanmask_internal(taskname, d, file_name): | ||
813 | """ | 776 | """ |
814 | Internal stamp helper function to generate stamp cleaning mask | 777 | Internal stamp helper function to generate stamp cleaning mask |
815 | Returns the stamp path+filename | 778 | Returns the stamp path+filename |
@@ -817,27 +780,14 @@ def stamp_cleanmask_internal(taskname, d, file_name): | |||
817 | In the bitbake core, d can be a CacheData and file_name will be set. | 780 | In the bitbake core, d can be a CacheData and file_name will be set. |
818 | When called in task context, d will be a data store, file_name will not be set | 781 | When called in task context, d will be a data store, file_name will not be set |
819 | """ | 782 | """ |
820 | taskflagname = taskname | 783 | cleanmask = bb.parse.siggen.stampcleanmask_mcfn(taskname, mcfn) |
821 | if taskname.endswith("_setscene"): | 784 | taskflagname = taskname.replace("_setscene", "") |
822 | taskflagname = taskname.replace("_setscene", "") | 785 | if cleanmask: |
823 | 786 | return [cleanmask, cleanmask.replace(taskflagname, taskflagname + "_setscene")] | |
824 | if file_name: | 787 | return [] |
825 | stamp = d.stampclean[file_name] | 788 | |
826 | extrainfo = d.stamp_extrainfo[file_name].get(taskflagname) or "" | 789 | def clean_stamp_mcfn(task, mcfn): |
827 | else: | 790 | cleanmask = _get_cleanmask(task, mcfn) |
828 | stamp = d.getVar('STAMPCLEAN') | ||
829 | file_name = d.getVar('BB_FILENAME') | ||
830 | extrainfo = d.getVarFlag(taskflagname, 'stamp-extra-info') or "" | ||
831 | |||
832 | if not stamp: | ||
833 | return [] | ||
834 | |||
835 | cleanmask = bb.parse.siggen.stampcleanmask(stamp, file_name, taskname, extrainfo) | ||
836 | |||
837 | return [cleanmask, cleanmask.replace(taskflagname, taskflagname + "_setscene")] | ||
838 | |||
839 | def clean_stamp(task, d, file_name = None): | ||
840 | cleanmask = stamp_cleanmask_internal(task, d, file_name) | ||
841 | for mask in cleanmask: | 791 | for mask in cleanmask: |
842 | for name in glob.glob(mask): | 792 | for name in glob.glob(mask): |
843 | # Preserve sigdata files in the stamps directory | 793 | # Preserve sigdata files in the stamps directory |
@@ -847,33 +797,46 @@ def clean_stamp(task, d, file_name = None): | |||
847 | if name.endswith('.taint'): | 797 | if name.endswith('.taint'): |
848 | continue | 798 | continue |
849 | os.unlink(name) | 799 | os.unlink(name) |
850 | return | ||
851 | 800 | ||
852 | def make_stamp(task, d, file_name = None): | 801 | def clean_stamp(task, d): |
802 | mcfn = d.getVar('BB_FILENAME') | ||
803 | clean_stamp_mcfn(task, mcfn) | ||
804 | |||
805 | def make_stamp_mcfn(task, mcfn): | ||
806 | |||
807 | basestamp = bb.parse.siggen.stampfile_mcfn(task, mcfn) | ||
808 | |||
809 | stampdir = os.path.dirname(basestamp) | ||
810 | if cached_mtime_noerror(stampdir) == 0: | ||
811 | bb.utils.mkdirhier(stampdir) | ||
812 | |||
813 | clean_stamp_mcfn(task, mcfn) | ||
814 | |||
815 | # Remove the file and recreate to force timestamp | ||
816 | # change on broken NFS filesystems | ||
817 | if basestamp: | ||
818 | bb.utils.remove(basestamp) | ||
819 | open(basestamp, "w").close() | ||
820 | |||
821 | def make_stamp(task, d): | ||
853 | """ | 822 | """ |
854 | Creates/updates a stamp for a given task | 823 | Creates/updates a stamp for a given task |
855 | (d can be a data dict or dataCache) | ||
856 | """ | 824 | """ |
857 | clean_stamp(task, d, file_name) | 825 | mcfn = d.getVar('BB_FILENAME') |
858 | 826 | ||
859 | stamp = stamp_internal(task, d, file_name) | 827 | make_stamp_mcfn(task, mcfn) |
860 | # Remove the file and recreate to force timestamp | ||
861 | # change on broken NFS filesystems | ||
862 | if stamp: | ||
863 | bb.utils.remove(stamp) | ||
864 | open(stamp, "w").close() | ||
865 | 828 | ||
866 | # If we're in task context, write out a signature file for each task | 829 | # If we're in task context, write out a signature file for each task |
867 | # as it completes | 830 | # as it completes |
868 | if not task.endswith("_setscene") and not file_name: | 831 | if not task.endswith("_setscene"): |
869 | stampbase = stamp_internal(task, d, None, True) | 832 | stampbase = bb.parse.siggen.stampfile_base(mcfn) |
870 | file_name = d.getVar('BB_FILENAME') | 833 | bb.parse.siggen.dump_sigtask(mcfn, task, stampbase, True) |
871 | bb.parse.siggen.dump_sigtask(file_name, task, stampbase, True) | 834 | |
872 | 835 | ||
873 | def find_stale_stamps(task, d, file_name=None): | 836 | def find_stale_stamps(task, mcfn): |
874 | current = stamp_internal(task, d, file_name) | 837 | current = bb.parse.siggen.stampfile_mcfn(task, mcfn) |
875 | current2 = stamp_internal(task + "_setscene", d, file_name) | 838 | current2 = bb.parse.siggen.stampfile_mcfn(task + "_setscene", mcfn) |
876 | cleanmask = stamp_cleanmask_internal(task, d, file_name) | 839 | cleanmask = _get_cleanmask(task, mcfn) |
877 | found = [] | 840 | found = [] |
878 | for mask in cleanmask: | 841 | for mask in cleanmask: |
879 | for name in glob.glob(mask): | 842 | for name in glob.glob(mask): |
@@ -887,38 +850,14 @@ def find_stale_stamps(task, d, file_name=None): | |||
887 | found.append(name) | 850 | found.append(name) |
888 | return found | 851 | return found |
889 | 852 | ||
890 | def del_stamp(task, d, file_name = None): | 853 | def write_taint(task, d): |
891 | """ | ||
892 | Removes a stamp for a given task | ||
893 | (d can be a data dict or dataCache) | ||
894 | """ | ||
895 | stamp = stamp_internal(task, d, file_name) | ||
896 | bb.utils.remove(stamp) | ||
897 | |||
898 | def write_taint(task, d, file_name = None): | ||
899 | """ | 854 | """ |
900 | Creates a "taint" file which will force the specified task and its | 855 | Creates a "taint" file which will force the specified task and its |
901 | dependents to be re-run the next time by influencing the value of its | 856 | dependents to be re-run the next time by influencing the value of its |
902 | taskhash. | 857 | taskhash. |
903 | (d can be a data dict or dataCache) | ||
904 | """ | ||
905 | import uuid | ||
906 | if file_name: | ||
907 | taintfn = d.stamp[file_name] + '.' + task + '.taint' | ||
908 | else: | ||
909 | taintfn = d.getVar('STAMP') + '.' + task + '.taint' | ||
910 | bb.utils.mkdirhier(os.path.dirname(taintfn)) | ||
911 | # The specific content of the taint file is not really important, | ||
912 | # we just need it to be random, so a random UUID is used | ||
913 | with open(taintfn, 'w') as taintf: | ||
914 | taintf.write(str(uuid.uuid4())) | ||
915 | |||
916 | def stampfile(taskname, d, file_name = None, noextra=False): | ||
917 | """ | ||
918 | Return the stamp for a given task | ||
919 | (d can be a data dict or dataCache) | ||
920 | """ | 858 | """ |
921 | return stamp_internal(taskname, d, file_name, noextra=noextra) | 859 | mcfn = d.getVar('BB_FILENAME') |
860 | bb.parse.siggen.invalidate_task(task, mcfn) | ||
922 | 861 | ||
923 | def add_tasks(tasklist, d): | 862 | def add_tasks(tasklist, d): |
924 | task_deps = d.getVar('_task_deps', False) | 863 | task_deps = d.getVar('_task_deps', False) |