How would I include the date/time my code was built at so it could be printed by the software when requested?
I tried adding a -DTIME=%time% to the compliler options (%time% on Windows is a special env. var) but it's passed literally in (as though "#define TIME %time%").
Using a define would seem to be the cleanest method; but I would also be content with including a file that was generated by some batch/Python script as part of the build process. However, I don't know how to automatically run other things at build time.
Solved! Go to Solution.
Had some spare time to hack up a solution; here's what I cooked up with information borrowed from several other posts.
1. Configure (Edit...)Standard Settings:
- Target/Target Settings
--- Pre-linker: BatchRunner PreLinker
- Linker/BatchRunner PreLinker
--- {Project}verstamp.bat
2. verstamp.bat in my Project root
python verstamp.py
3. verstamp.py in my Project root
import sys import os import subprocess import time fname = 'verstamp' cwpath = 'C:/Program Files/Freescale/CodeWarrior for Microcontrollers V6.3' srcpath = './CODE' objpath = './c6v2_Data/Standard/ObjectCode' rev_code_only = True cfile = '%s/%s.c' % (srcpath, fname) ofile = '%s/%s.o' % (objpath, fname) def main(argv=None): if argv is None: argv = sys.argv #datetimestamp = iso8601datetime(sdec=3) datetimestamp = time.strftime('%Y-%m-%d %H:%M:%S') # Running 'svnversion' on the entire project directory can take # a long time. Probably TargetDataWindows.tdt, which causes a # significant pause when 'svn status' scans it. if rev_code_only: revstamp = subprocess.Popen( 'svnversion %s' % srcpath, shell=True, stdout=subprocess.PIPE).stdout.read().strip() else: revstamp = subprocess.Popen( 'svnversion', shell=True, stdout=subprocess.PIPE).stdout.read().strip() with open(cfile,'w') as fstamp: fstamp.write('// autogenerated file\n') fstamp.write('const char bldDateTime[] = "Built on: %s";\n' % datetimestamp) fstamp.write('const char bldSVNRev[] = "SVN rev : %s";\n' % revstamp) # echo generated file with open(cfile) as f: for line in f.readlines(): print line, # compile file subprocess.call(' '.join([ r'"%s/prog/chc08.exe"' % cwpath, # compiler r'"%s"' % cfile, # - file to compile r'-I"%s/lib/hc08c/include"' % cwpath, # - include path r'-Cs08', # - HCS08 core r'-Ms', # - small memory model r'-D__NO_FLOAT__', # - #defines r'-WmsgFbv', # - verbose message file r'-WmsgFob"%f%e(%l): %k %d: %m\n"' # - message format ])) # (just leave the .o file with the code...it's found by the linker fine) #os.remove(ofile) #os.rename(cfile, ofile) if __name__ == "__main__": sys.exit(main())
4. Was using PE so had to(?) disable the PRM file generation under the CPU/Build Options/Generate PRM File = No. (This was after it was initially generated)
5. Added this snippet to the end of the PRM so it would link my compiled object file.
ENTRIES verstamp.o:* END
I don't fully understand the build process, so this is a dirty hack, but it gets the SVN revision (and date/time) that the project was compiled with into the binary, so...success.
Had some spare time to hack up a solution; here's what I cooked up with information borrowed from several other posts.
1. Configure (Edit...)Standard Settings:
- Target/Target Settings
--- Pre-linker: BatchRunner PreLinker
- Linker/BatchRunner PreLinker
--- {Project}verstamp.bat
2. verstamp.bat in my Project root
python verstamp.py
3. verstamp.py in my Project root
import sys import os import subprocess import time fname = 'verstamp' cwpath = 'C:/Program Files/Freescale/CodeWarrior for Microcontrollers V6.3' srcpath = './CODE' objpath = './c6v2_Data/Standard/ObjectCode' rev_code_only = True cfile = '%s/%s.c' % (srcpath, fname) ofile = '%s/%s.o' % (objpath, fname) def main(argv=None): if argv is None: argv = sys.argv #datetimestamp = iso8601datetime(sdec=3) datetimestamp = time.strftime('%Y-%m-%d %H:%M:%S') # Running 'svnversion' on the entire project directory can take # a long time. Probably TargetDataWindows.tdt, which causes a # significant pause when 'svn status' scans it. if rev_code_only: revstamp = subprocess.Popen( 'svnversion %s' % srcpath, shell=True, stdout=subprocess.PIPE).stdout.read().strip() else: revstamp = subprocess.Popen( 'svnversion', shell=True, stdout=subprocess.PIPE).stdout.read().strip() with open(cfile,'w') as fstamp: fstamp.write('// autogenerated file\n') fstamp.write('const char bldDateTime[] = "Built on: %s";\n' % datetimestamp) fstamp.write('const char bldSVNRev[] = "SVN rev : %s";\n' % revstamp) # echo generated file with open(cfile) as f: for line in f.readlines(): print line, # compile file subprocess.call(' '.join([ r'"%s/prog/chc08.exe"' % cwpath, # compiler r'"%s"' % cfile, # - file to compile r'-I"%s/lib/hc08c/include"' % cwpath, # - include path r'-Cs08', # - HCS08 core r'-Ms', # - small memory model r'-D__NO_FLOAT__', # - #defines r'-WmsgFbv', # - verbose message file r'-WmsgFob"%f%e(%l): %k %d: %m\n"' # - message format ])) # (just leave the .o file with the code...it's found by the linker fine) #os.remove(ofile) #os.rename(cfile, ofile) if __name__ == "__main__": sys.exit(main())
4. Was using PE so had to(?) disable the PRM file generation under the CPU/Build Options/Generate PRM File = No. (This was after it was initially generated)
5. Added this snippet to the end of the PRM so it would link my compiled object file.
ENTRIES verstamp.o:* END
I don't fully understand the build process, so this is a dirty hack, but it gets the SVN revision (and date/time) that the project was compiled with into the binary, so...success.
Hello
Did you check following post?
https://community.freescale.com/message/32584#32584
This could be a solution to your request.
CrasyCat