From 988dea5a4e5f4b1947eb5c41cac5b0d72987793a Mon Sep 17 00:00:00 2001 From: AndreyFilippov Date: Tue, 21 Nov 2017 14:48:20 -0700 Subject: [PATCH] updated .cproject, moved used_files.py --- .gitignore | 4 + eclipse_project_setup/.cproject | 68 ++++---- used_files.py | 280 -------------------------------- 3 files changed, 38 insertions(+), 314 deletions(-) delete mode 100755 used_files.py diff --git a/.gitignore b/.gitignore index c8a8f98..e164c5f 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,10 @@ src/garminusb2nmea src/log_imu src/.depend +all_sources.lst +excluding.lst +including.lst + doxygen.tag /image /scripts diff --git a/eclipse_project_setup/.cproject b/eclipse_project_setup/.cproject index 8cba991..ed6a5a8 100644 --- a/eclipse_project_setup/.cproject +++ b/eclipse_project_setup/.cproject @@ -3,81 +3,81 @@ - + - - - - - - + + + + + + - - - + + + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + \ No newline at end of file diff --git a/used_files.py b/used_files.py deleted file mode 100755 index 6eb6152..0000000 --- a/used_files.py +++ /dev/null @@ -1,280 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 -from __future__ import division -from __future__ import print_function -""" -# @file used_files.py -# @brief Extract file access data after build, modify CDT project configuration -# (.cproject) accordingly -# @copyright Copyright (C) 2016, Elphel.inc. -# @param License -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -@author: Andrey Filippov -@license: GPLv3.0+ -@contact: andrey@elphel.coml -@deffield updated: Updated -""" -__author__ = "Andrey Filippov" -__copyright__ = "Copyright 2016, Elphel, Inc." -__license__ = "GPL" -__version__ = "3.0+" -__maintainer__ = "Andrey Filippov" -__email__ = "andrey@elphel.com" -__status__ = "Development" - -import sys -import os -import time -import xml.etree.ElementTree as ET -''' -TODO:Automate, find out why separate touch commands are needed -Run this program twice: -1-st run ./used_files.py linux -1 -and save shown timestamp -Then run (some mystery here) -touch src/drivers/ata/ahci_elphel.c -touch src/drivers/elphel/sensor_common.c -Wait 5 seconds and run (in a different console with appropriate sourcing) -bitbake linux-xlnx -c compile -f -Then again -./used_files.py linux -If somethong went wrong you will need to resore .cproject from eclipse_project_setup directory - -For php: -bitbake php -c cleansstate -bitbake php -c unpack -f -bitbake php -c configure -f -./used_files.py php -1 -bitbake php -c compile -f -./used_files.py php 1471044836.8 - -Doing: -bitbake php -c compile -f -./used_files.py php -1 -bitbake php -c compile -f -./used_files.py php 1471044836.8 -Corrupts make process - -''' -def file_tree(flist): # Each file in list is a file, no directories - ftree={} - for p in flist: - node = ftree - seg_list=p.split(os.sep) - last_i=len(seg_list)-1 - for i,segm in enumerate(seg_list): - if not segm in node: - if i == last_i: - node[segm] = None - else: - node[segm] = {} - node=node[segm] - - return ftree - -def exclude_list(ftree, flist): - mark = "*" # no file/dir name can be "*" - def list_tree_recursive(root): - rslt = [] - if not mark in root: - return [[""]] # convert to trailing "/" for directories - for n in root: - if not n == mark: - if root[n] is None: - rslt.append([n]) - else: - - for l in list_tree_recursive(root[n]): - rslt.append([n]+l) - return rslt - - ftree[mark]=None # mark top level dir - for p in flist: - node = ftree - for segm in p.split(os.sep)[:-1]: - node=node[segm] - node[mark]=None # [mark] means used in flist - del node[p.split(os.sep)[-1]] - #print (ftree) -# for k in ftree: -# print(k) - #Now prune unused directories - #prune_recursive(ftree) # (assuming root is used) - # now create list - files_list_list = list_tree_recursive(ftree) -# print (files_list_list) - #converrt to file paths - pl = [] - for l in files_list_list: - pl.append(os.path.join(*(l[1:]))) - pl = sorted (pl) - return pl - - -def proc_tree(): - DEBUG = True - extensions = [".h",".c",".cpp"] - exclude_start = ["linux"+os.sep+"scripts"+os.sep,"linux"+os.sep+"source"+os.sep+"scripts"+os.sep] - delta_t = 3 # seconds - try: - root_path = sys.argv[1] - except: - print ("Calling %s [timestamp]"%(os.path.basename(sys.argv[0]))) - try: - start_time = float(sys.argv[2]) - except: - start_time = 0.0 - - touch_files= start_time < 0.0 - print ("root_path = %s"%(root_path)) -# root_path = "/home/eyesis/git/poky/linux-elphel/linux/" - lstFiles = [] - # Append files to a list - for path, _, files in os.walk(root_path, followlinks = True): - for f in files: - for ext in extensions: - if f.endswith(ext): - lstFiles.append(os.path.join(path, f)) - break - - all_tree= file_tree(sorted(lstFiles)) - include_lst=[] - lst_a = [] - latest_at=0 - for p in lstFiles: - if touch_files: - if os.path.islink(p): - try: - os.utime(os.path.realpath(p), None) - except: - print("missing linked file: %s"%(os.path.realpath(p))) - else: - os.utime(p, None) - else: -# at = time.ctime(os.stat(p).st_atime) - try: - at = os.stat(p).st_atime - l = None - except: - at = 0 - if os.path.islink(p): - try: - l = os.path.realpath(p) - at = os.stat(l).st_atime - except: - at = 0 # missing file - latest_at = max((latest_at,at)) - if at > (start_time + delta_t): - #Scripts/lexers result in problems - exclude=False - for exStr in exclude_start: - if p.startswith(exStr): - exclude=True - break - if exclude: - break - #exclude_start - lst_a.append([p,at,l]) - include_lst.append(p) - if touch_files: - print (len(lstFiles), "last time = ", time.time()) - return - - excluding = exclude_list(all_tree, include_lst) -# print (all_tree) -# print (sorted(include_lst)) -# print ("|".join(excluding)) - if DEBUG: - with open("all_sources.lst","w" ) as f: - for p in sorted(lstFiles): - try: - at = os.stat(p).st_atime - except: - at = 0 - lnk="" - if os.path.islink(p): - try: - at = os.stat(os.path.realpath(p)).st_atime - except: - at = 0 - lnk = os.path.realpath(p) - print (p,at,lnk, file=f) - with open("excluding.lst","w" ) as f: - for p in excluding: - print (p, file=f) - with open("including.lst","w" ) as f: - for p in include_lst: - print (p, file=f) -# include_tree= file_tree(sorted(include_lst)) -# print(include_tree) - root_dir=include_lst[0].split(os.sep)[0] - print ("root_dir=",root_dir) - - xml= ET.parse(".cproject") - root=xml.getroot() -# for child in root: -# print(child.tag, child.attrib) - - for child in root.iter('sourceEntries'): - for gchild in child: - print(gchild.tag) - - for child in root.iter('sourceEntries'): - for gchild in child: - if gchild.tag == 'entry': - attr = gchild.attrib - try: - if (attr['kind'] == 'sourcePath') and (attr['name'] == root_dir): - child.remove (gchild) - print ("Removed existing entry ",gchild.tag) - break - except: - print ("error matching attributes for ",gchild.tag) - pass - break #after first 'sourceEntries' - should be just one? - ET.SubElement(child, 'entry', {"flags":"VALUE_WORKSPACE_PATH", "kind":"sourcePath", "name":root_dir, "excluding":"|".join(excluding)}) - - for child in root.iter('sourceEntries'): - for gchild in child: - print(gchild.tag) - - oneliner= ET.tostring(root) - #overwrites original .cproject, may change to somethong different - with open(".cproject", "wr") as f: - f.write(""" -""") - f.write(oneliner) - - print (len(lstFiles), len(lst_a), "last access time = ",latest_at) - -if __name__ == '__main__': - proc_tree() - """ -Usage for new applications: -1) add src to sources, remove root folder -2) Do not add sysroots to sources, just add include directory (sysroots/elphel393/usr/include-uapi) - sysroot created with 'bitbake -c unpack' -3) run following steps - they will add sysroots to .cproject, together with the exclude filter -make clean # otherwise compiled files are preserved -bitbake apps-editconf -c cleansstate -bitbake apps-editconf -c unpack -f -bitbake apps-editconf -c configure -f -./used_files.py sysroots -1 -bitbake apps-editconf -c compile -f -./used_files.py sysroots 1473297567.42 # result of previous run -4)Add SCP to target in "builders" "new" "program". -5) remove "configuration builder' in 2 steps - remove it from .externalToolBuilders, run Eclipse again and then remove from builders. -6) copy .externalToolBuilders (just 1 entry), .project and .cproject to eclipse_project_setup -7) make sure .gitignore ignores all what it should - - - """ \ No newline at end of file -- 2.18.1