diff --git a/Source/build.cpp b/Source/build.cpp index 990fa3a4..569353f9 100644 --- a/Source/build.cpp +++ b/Source/build.cpp @@ -172,7 +172,7 @@ CEXEBuild::CEXEBuild() : build_cursection_isfunc=0; build_cursection=NULL; // init public data. - build_packname[0]=build_packcmd[0]=build_output_filename[0]=0; + build_packname[0]=build_packcmd[0]=build_output_filename[0]=postbuild_cmd[0]=0; // Added by ramon 23 May 2003 build_allowskipfiles=1; @@ -2898,6 +2898,24 @@ int CEXEBuild::write_output(void) ftell(fp),total_usize,pc/10,pc%10); } fclose(fp); + if (postbuild_cmd[0]) + { + LPTSTR arg = _tcsstr(postbuild_cmd, _T("%1")); + if (arg) // if found, replace %1 by build_output_filename + { + memmove(arg+_tcslen(build_output_filename), arg+2, (_tcslen(arg+2)+1)*sizeof(TCHAR)); + memmove(arg, build_output_filename, _tcslen(build_output_filename)*sizeof(TCHAR)); + } + SCRIPT_MSG(_T("\nFinalize command: %s\n"),postbuild_cmd); +#ifdef _WIN32 + int ret=sane_system(postbuild_cmd); +#else + PATH_CONVERT(postbuild_cmd); + int ret=system(postbuild_cmd); +#endif + if (ret != 0) + INFO_MSG(_T("Finalize command returned %d\n"),ret); + } print_warnings(); return PS_OK; } diff --git a/Source/build.h b/Source/build.h index fb81535e..34487f0e 100644 --- a/Source/build.h +++ b/Source/build.h @@ -402,6 +402,7 @@ class CEXEBuild { bool has_called_write_output; TCHAR build_packname[1024], build_packcmd[1024]; + TCHAR postbuild_cmd[1024]; int build_overwrite, build_last_overwrite, build_crcchk, build_datesave, build_optimize_datablock, build_allowskipfiles; // Added by ramon 23 May 2003 diff --git a/Source/script.cpp b/Source/script.cpp index f767c7d0..ca014873 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -2960,6 +2960,12 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) SCRIPT_MSG(_T("!packhdr: filename=\"%s\", command=\"%s\"\n"), build_packname, build_packcmd); return PS_OK; + case TOK_P_FINALIZE: + if (postbuild_cmd[0]) + warning_fl(_T("Several !finalize instructions encountered. Only last one was executed")); + _tcsnccpy(postbuild_cmd,line.gettoken_str(1),COUNTOF(postbuild_cmd)-1); + SCRIPT_MSG(_T("!finalize: \"%s\"\n"),postbuild_cmd); + return PS_OK; case TOK_P_SYSTEMEXEC: { TCHAR *exec=line.gettoken_str(1); diff --git a/Source/tokens.cpp b/Source/tokens.cpp index ae5309e7..b5b911c9 100644 --- a/Source/tokens.cpp +++ b/Source/tokens.cpp @@ -240,6 +240,7 @@ static tokenType tokenlist[TOK__LAST] = {TOK_XPSTYLE, _T("XPStyle"),1,0,_T("(on|off)"),TP_GLOBAL}, {TOK_REQEXECLEVEL, _T("RequestExecutionLevel"),1,0,_T("none|user|highest|admin"),TP_GLOBAL}, {TOK_P_PACKEXEHEADER,_T("!packhdr"),2,0,_T("temp_file_name command_line_to_compress_that_temp_file"),TP_ALL}, +{TOK_P_FINALIZE,_T("!finalize"),1,0,_T("command_with_%1"),TP_ALL}, {TOK_P_SYSTEMEXEC,_T("!system"),1,2,_T("command [<|>|<>|=) retval]"),TP_ALL}, {TOK_P_EXECUTE,_T("!execute"),1,0,_T("command"),TP_ALL}, {TOK_P_ADDINCLUDEDIR,_T("!AddIncludeDir"),1,0,_T("dir"),TP_ALL}, diff --git a/Source/tokens.h b/Source/tokens.h index 3320ee70..0c8763b3 100644 --- a/Source/tokens.h +++ b/Source/tokens.h @@ -101,6 +101,7 @@ enum TOK_P_DEFINE, TOK_P_UNDEF, TOK_P_PACKEXEHEADER, + TOK_P_FINALIZE, TOK_P_SYSTEMEXEC, TOK_P_EXECUTE, TOK_P_ADDINCLUDEDIR,