From 722283804b7d3b04e90daac84465c53130748ee0 Mon Sep 17 00:00:00 2001 From: Ken Martin Date: Fri, 9 Nov 2001 13:00:53 -0500 Subject: support for custom targets on exe and lib --- Source/cmDSPWriter.cxx | 152 ++++++++++++++++++++++++---------- Source/cmDSPWriter.h | 9 +- Templates/DLLHeader.dsptemplate | 7 ++ Templates/EXEHeader.dsptemplate | 8 ++ Templates/EXEWinHeader.dsptemplate | 8 ++ Templates/staticLibHeader.dsptemplate | 9 ++ 6 files changed, 149 insertions(+), 44 deletions(-) diff --git a/Source/cmDSPWriter.cxx b/Source/cmDSPWriter.cxx index 180de34..22d193d 100644 --- a/Source/cmDSPWriter.cxx +++ b/Source/cmDSPWriter.cxx @@ -194,9 +194,6 @@ void cmDSPWriter::WriteDSPFile(std::ostream& fout, const char *libName, cmTarget &target) { - // Write the DSP file's header. - this->WriteDSPHeader(fout, libName, target); - // We may be modifying the source groups temporarily, so make a copy. std::vector sourceGroups = m_Makefile->GetSourceGroups(); @@ -228,6 +225,9 @@ void cmDSPWriter::WriteDSPFile(std::ostream& fout, sourceGroup.AddCustomCommand(cc); } + // Write the DSP file's header. + this->WriteDSPHeader(fout, libName, target, sourceGroups); + // Find the group in which the CMakeLists.txt source belongs, and add // the rule to generate this DSP file. for(std::vector::reverse_iterator sg = sourceGroups.rbegin(); @@ -263,49 +263,25 @@ void cmDSPWriter::WriteDSPFile(std::ostream& fout, std::string source = cc->first; const cmSourceGroup::Commands& commands = cc->second; - fout << "# Begin Source File\n\n";\ - - // Tell MS-Dev what the source is. If the compiler knows how to - // build it, then it will. - fout << "SOURCE=" << cmSystemTools::EscapeSpaces(source.c_str()) << "\n\n"; - if (!commands.empty()) + if (source != libName) { - // Loop through every custom command generating code from the - // current source. - // build up the depends and outputs and commands - cmSourceGroup::CommandFiles totalCommand; - std::string totalCommandStr; - std::string temp; - for(cmSourceGroup::Commands::const_iterator c = commands.begin(); - c != commands.end(); ++c) + fout << "# Begin Source File\n\n"; + + // Tell MS-Dev what the source is. If the compiler knows how to + // build it, then it will. + fout << "SOURCE=" << cmSystemTools::EscapeSpaces(source.c_str()) << "\n\n"; + if (!commands.empty()) { - totalCommandStr += "\n\t"; - temp= c->second.m_Command; - cmSystemTools::ConvertToWindowsSlashes(temp); - temp = cmSystemTools::EscapeSpaces(temp.c_str()); - totalCommandStr += temp; - totalCommandStr += " "; - totalCommandStr += c->second.m_Arguments; - totalCommand.Merge(c->second); - } - // Create a dummy file with the name of the source if it does - // not exist - if(totalCommand.m_Outputs.empty()) - { - std::string dummyFile = m_Makefile->GetStartOutputDirectory(); - dummyFile += "/"; - dummyFile += source; - if(!cmSystemTools::FileExists(dummyFile.c_str())) - { - std::ofstream fout(dummyFile.c_str()); - fout << "Dummy file created by cmake as unused source for utility command.\n"; - } + cmSourceGroup::CommandFiles totalCommand; + std::string totalCommandStr; + totalCommandStr = this->CombineCommands(commands, totalCommand, + source.c_str()); + this->WriteCustomRule(fout, source.c_str(), totalCommandStr.c_str(), + totalCommand.m_Depends, + totalCommand.m_Outputs); } - this->WriteCustomRule(fout, source.c_str(), totalCommandStr.c_str(), - totalCommand.m_Depends, - totalCommand.m_Outputs); + fout << "# End Source File\n"; } - fout << "# End Source File\n"; } // If the group has a name, write the footer. @@ -462,9 +438,93 @@ void cmDSPWriter::SetBuildType(BuildType b, const char *libName) } } } + +std::string +cmDSPWriter::CombineCommands(const cmSourceGroup::Commands &commands, + cmSourceGroup::CommandFiles &totalCommand, + const char *source) + +{ + // Loop through every custom command generating code from the + // current source. + // build up the depends and outputs and commands + std::string totalCommandStr = ""; + std::string temp; + for(cmSourceGroup::Commands::const_iterator c = commands.begin(); + c != commands.end(); ++c) + { + totalCommandStr += "\n\t"; + temp= c->second.m_Command; + cmSystemTools::ConvertToWindowsSlashes(temp); + temp = cmSystemTools::EscapeSpaces(temp.c_str()); + totalCommandStr += temp; + totalCommandStr += " "; + totalCommandStr += c->second.m_Arguments; + totalCommand.Merge(c->second); + } + // Create a dummy file with the name of the source if it does + // not exist + if(totalCommand.m_Outputs.empty()) + { + std::string dummyFile = m_Makefile->GetStartOutputDirectory(); + dummyFile += "/"; + dummyFile += source; + if(!cmSystemTools::FileExists(dummyFile.c_str())) + { + std::ofstream fout(dummyFile.c_str()); + fout << "Dummy file created by cmake as unused source for utility command.\n"; + } + } + return totalCommandStr; +} + + +// look for custom rules on a target and collect them together +std::string +cmDSPWriter::CreateTargetRules(const cmTarget &target, + const char *libName) +{ + std::string customRuleCode = ""; + + if (target.GetType() >= cmTarget::UTILITY) + { + return customRuleCode; + } + // Find the group in which the lix exe custom rules belong + bool init = false; + for (std::vector::const_iterator cr = + target.GetCustomCommands().begin(); + cr != target.GetCustomCommands().end(); ++cr) + { + cmCustomCommand cc(*cr); + cc.ExpandVariables(*m_Makefile); + if (cc.GetSourceName() == libName) + { + if (!init) + { + // header stuff + customRuleCode = "# Begin Special Build Tool\nPostBuild_Cmds="; + init = true; + } + else + { + customRuleCode += "\t"; + } + customRuleCode += cc.GetCommand() + " " + cc.GetArguments(); + } + } + + if (init) + { + customRuleCode += "\n# End Special Build Tool\n"; + } + return customRuleCode; +} + void cmDSPWriter::WriteDSPHeader(std::ostream& fout, const char *libName, - const cmTarget &target) + const cmTarget &target, + std::vector &sourceGroups) { // determine the link directories std::string libOptions; @@ -595,6 +655,10 @@ void cmDSPWriter::WriteDSPHeader(std::ostream& fout, const char *libName, libOptions += " /STACK:10000000 "; libMultiLineOptions += "# ADD LINK32 /STACK:10000000 \n"; + // are there any custom rules on the target itself + // only if the target is a lib or exe + std::string customRuleCode = this->CreateTargetRules(target, libName); + std::ifstream fin(m_DSPHeaderTemplate.c_str()); if(!fin) { @@ -611,6 +675,8 @@ void cmDSPWriter::WriteDSPHeader(std::ostream& fout, const char *libName, { mfcFlag = "0"; } + cmSystemTools::ReplaceString(line, "CMAKE_CUSTOM_RULE_CODE", + customRuleCode.c_str()); cmSystemTools::ReplaceString(line, "CMAKE_MFC_FLAG", mfcFlag); cmSystemTools::ReplaceString(line, "CM_LIBRARIES", diff --git a/Source/cmDSPWriter.h b/Source/cmDSPWriter.h index 0182e1a..fc951a0 100644 --- a/Source/cmDSPWriter.h +++ b/Source/cmDSPWriter.h @@ -95,7 +95,7 @@ private: void WriteDSPEndGroup(std::ostream& fout); void WriteDSPHeader(std::ostream& fout, const char *libName, - const cmTarget &tgt); + const cmTarget &tgt, std::vector &sgs); void WriteDSPFooter(std::ostream& fout); void AddDSPBuildRule(cmSourceGroup&); @@ -105,6 +105,13 @@ private: const std::set& depends, const std::set& outputs); + std::string CreateTargetRules(const cmTarget &target, + const char *libName); + std::string CombineCommands(const cmSourceGroup::Commands &commands, + cmSourceGroup::CommandFiles &totalCommand, + const char *source); + + std::string m_IncludeOptions; cmMakefile* m_Makefile; std::vector m_Configurations; diff --git a/Templates/DLLHeader.dsptemplate b/Templates/DLLHeader.dsptemplate index f9176d6..d2b3ddd 100644 --- a/Templates/DLLHeader.dsptemplate +++ b/Templates/DLLHeader.dsptemplate @@ -73,6 +73,8 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 # ADD LINK32 CM_OPTIMIZED_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +CMAKE_CUSTOM_RULE_CODE + !ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 Debug" # PROP BASE Use_MFC CMAKE_MFC_FLAG @@ -102,6 +104,8 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept # ADD LINK32 CM_DEBUG_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +CMAKE_CUSTOM_RULE_CODE + !ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 MinSizeRel" # PROP BASE Use_MFC CMAKE_MFC_FLAG @@ -133,6 +137,8 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /stack:0x989680 /dll /machine:I386 # ADD LINK32 CM_OPTIMIZED_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /stack:0x989680 /dll /machine:I386 +CMAKE_CUSTOM_RULE_CODE + !ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 RelWithDebInfo" # PROP BASE Use_MFC CMAKE_MFC_FLAG @@ -162,6 +168,7 @@ LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /pdbtype:sept # ADD LINK32 CM_OPTIMIZED_LIBRARIES CM_LIBRARIES kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +CMAKE_CUSTOM_RULE_CODE !ENDIF diff --git a/Templates/EXEHeader.dsptemplate b/Templates/EXEHeader.dsptemplate index b331f92..819c9a1 100644 --- a/Templates/EXEHeader.dsptemplate +++ b/Templates/EXEHeader.dsptemplate @@ -72,6 +72,8 @@ LINK32=link.exe CM_MULTILINE_OPTIMIZED_LIBRARIES CM_MULTILINE_LIBRARIES +CMAKE_CUSTOM_RULE_CODE + !ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 Debug" # PROP BASE Use_MFC CMAKE_MFC_FLAG @@ -102,6 +104,8 @@ LINK32=link.exe CM_MULTILINE_DEBUG_LIBRARIES CM_MULTILINE_LIBRARIES +CMAKE_CUSTOM_RULE_CODE + !ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 MinSizeRel" # PROP BASE Use_MFC CMAKE_MFC_FLAG # PROP BASE Use_Debug_Libraries 0 @@ -129,6 +133,8 @@ LINK32=link.exe CM_MULTILINE_OPTIMIZED_LIBRARIES CM_MULTILINE_LIBRARIES +CMAKE_CUSTOM_RULE_CODE + !ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 RelWithDebInfo" # PROP BASE Use_MFC CMAKE_MFC_FLAG @@ -157,6 +163,8 @@ LINK32=link.exe CM_MULTILINE_OPTIMIZED_LIBRARIES CM_MULTILINE_LIBRARIES +CMAKE_CUSTOM_RULE_CODE + !ENDIF # Begin Target diff --git a/Templates/EXEWinHeader.dsptemplate b/Templates/EXEWinHeader.dsptemplate index 219e87c..2f9f103 100644 --- a/Templates/EXEWinHeader.dsptemplate +++ b/Templates/EXEWinHeader.dsptemplate @@ -74,6 +74,8 @@ LINK32=link.exe CM_MULTILINE_OPTIMIZED_LIBRARIES CM_MULTILINE_LIBRARIES +CMAKE_CUSTOM_RULE_CODE + !ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 Debug" # PROP BASE Use_MFC CMAKE_MFC_FLAG @@ -105,6 +107,8 @@ CM_MULTILINE_DEBUG_LIBRARIES CM_MULTILINE_LIBRARIES +CMAKE_CUSTOM_RULE_CODE + !ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 MinSizeRel" # PROP BASE Use_MFC CMAKE_MFC_FLAG # PROP BASE Use_Debug_Libraries 0 @@ -132,6 +136,8 @@ LINK32=link.exe CM_MULTILINE_OPTIMIZED_LIBRARIES CM_MULTILINE_LIBRARIES +CMAKE_CUSTOM_RULE_CODE + !ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 RelWithDebInfo" # PROP BASE Use_MFC CMAKE_MFC_FLAG @@ -162,6 +168,8 @@ LINK32=link.exe CM_MULTILINE_OPTIMIZED_LIBRARIES CM_MULTILINE_LIBRARIES +CMAKE_CUSTOM_RULE_CODE + !ENDIF # Begin Target diff --git a/Templates/staticLibHeader.dsptemplate b/Templates/staticLibHeader.dsptemplate index c6a72ca..b2dcb2e 100644 --- a/Templates/staticLibHeader.dsptemplate +++ b/Templates/staticLibHeader.dsptemplate @@ -67,6 +67,8 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo +CMAKE_CUSTOM_RULE_CODE + !ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 Debug" # PROP BASE Use_MFC CMAKE_MFC_FLAG @@ -91,6 +93,9 @@ BSC32=bscmake.exe # ADD BSC32 /nologo LIB32=link.exe -lib # ADD BASE LIB32 /nologo + +CMAKE_CUSTOM_RULE_CODE + !ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 MinSizeRel" # PROP BASE Use_MFC CMAKE_MFC_FLAG @@ -118,6 +123,8 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo +CMAKE_CUSTOM_RULE_CODE + !ELSEIF "$(CFG)" == "OUTPUT_LIBNAME - Win32 RelWithDebInfo" # PROP BASE Use_MFC CMAKE_MFC_FLAG @@ -144,6 +151,8 @@ LIB32=link.exe -lib # ADD BASE LIB32 /nologo # ADD LIB32 /nologo +CMAKE_CUSTOM_RULE_CODE + !ENDIF # Begin Target -- cgit v0.12