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) |
