ENH: for all custom commands that can not be given to a target, add them to all targets in the current makefile

This commit is contained in:
Bill Hoffman 2006-01-09 14:40:31 -05:00
parent aa9734ab6c
commit a91947039a
8 changed files with 177 additions and 10 deletions

View File

@ -19,6 +19,7 @@
//----------------------------------------------------------------------------
cmCustomCommand::cmCustomCommand()
{
m_Used = false;
}
//----------------------------------------------------------------------------
@ -28,6 +29,7 @@ cmCustomCommand::cmCustomCommand(const cmCustomCommand& r):
m_CommandLines(r.m_CommandLines),
m_Comment(r.m_Comment)
{
m_Used = false;
}
//----------------------------------------------------------------------------
@ -40,6 +42,7 @@ cmCustomCommand::cmCustomCommand(const char* output,
m_CommandLines(commandLines),
m_Comment(comment?comment:"")
{
m_Used = false;
}
//----------------------------------------------------------------------------

View File

@ -49,11 +49,16 @@ public:
/** Get the comment string for the command. */
const char* GetComment() const;
/** set get the used status of the command */
void Used() { m_Used = true;};
bool IsUsed() { return m_Used;};
private:
std::string m_Output;
std::vector<std::string> m_Depends;
cmCustomCommandLines m_CommandLines;
std::string m_Comment;
bool m_Used;
};
#endif

View File

@ -80,9 +80,60 @@ void cmLocalVisualStudio6Generator::OutputDSPFile()
// clear project names
m_CreatedProjectNames.clear();
// Call TraceVSDependencies on all targets
cmTargets &tgts = m_Makefile->GetTargets();
for(cmTargets::iterator l = tgts.begin();
l != tgts.end(); l++)
{
// INCLUDE_EXTERNAL_MSPROJECT command only affects the workspace
// so don't build a projectfile for it
if ((l->second.GetType() != cmTarget::INSTALL_FILES)
&& (l->second.GetType() != cmTarget::INSTALL_PROGRAMS)
&& (strncmp(l->first.c_str(), "INCLUDE_EXTERNAL_MSPROJECT", 26) != 0))
{
cmTarget& target = l->second;
target.TraceVSDependencies(target.GetName(), m_Makefile);
}
}
// now for all custom commands that are not used directly in a
// target, add them to all targets in the current directory or
// makefile
std::vector<cmSourceFile*> & classesmf = m_Makefile->GetSourceFiles();
for(std::vector<cmSourceFile*>::const_iterator i = classesmf.begin();
i != classesmf.end(); i++)
{
if(cmCustomCommand* cc = (*i)->GetCustomCommand())
{
if(!cc->IsUsed())
{
for(cmTargets::iterator l = tgts.begin();
l != tgts.end(); l++)
{
if ((l->second.GetType() != cmTarget::INSTALL_FILES)
&& (l->second.GetType() != cmTarget::INSTALL_PROGRAMS)
&& (strncmp(l->first.c_str(), "INCLUDE_EXTERNAL_MSPROJECT", 26) != 0))
{
cmTarget& target = l->second;
bool sameAsTarget = false;
// make sure we don't add a custom command that depends on
// this target
for(unsigned int k =0; k < cc->GetDepends().size(); k++)
{
if(cmSystemTools::GetFilenameName(cc->GetDepends()[k]) == target.GetFullName())
{
sameAsTarget = true;
}
}
if(!sameAsTarget)
{
target.GetSourceFiles().push_back(*i);
}
}
}
}
}
}
// build any targets
cmTargets &tgts = m_Makefile->GetTargets();
for(cmTargets::iterator l = tgts.begin();
l != tgts.end(); l++)
{
@ -266,7 +317,6 @@ void cmLocalVisualStudio6Generator::WriteDSPFile(std::ostream& fout,
// trace the visual studio dependencies
std::string name = libName;
name += ".dsp.cmake";
target.TraceVSDependencies(name, m_Makefile);
// We may be modifying the source groups temporarily, so make a copy.
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();

View File

@ -92,8 +92,82 @@ void cmLocalVisualStudio7Generator::OutputVCProjFile()
// clear project names
m_CreatedProjectNames.clear();
// build any targets
cmTargets &tgts = m_Makefile->GetTargets();
// Call TraceVSDependencies on all targets
cmTargets &tgts = m_Makefile->GetTargets();
for(cmTargets::iterator l = tgts.begin();
l != tgts.end(); l++)
{
// INCLUDE_EXTERNAL_MSPROJECT command only affects the workspace
// so don't build a projectfile for it
if ((l->second.GetType() != cmTarget::INSTALL_FILES)
&& (l->second.GetType() != cmTarget::INSTALL_PROGRAMS)
&& (strncmp(l->first.c_str(), "INCLUDE_EXTERNAL_MSPROJECT", 26) != 0))
{
cmTarget& target = l->second;
target.TraceVSDependencies(target.GetName(), m_Makefile);
}
}
// now for all custom commands that are not used directly in a
// target, add them to all targets in the current directory or
// makefile
std::vector<cmSourceFile*> & classesmf = m_Makefile->GetSourceFiles();
for(std::vector<cmSourceFile*>::const_iterator i = classesmf.begin();
i != classesmf.end(); i++)
{
if(cmCustomCommand* cc = (*i)->GetCustomCommand())
{
// while we are at it, if it is a .rule file then for visual studio 7 we
// must generate it so that depend information works correctly
if ((*i)->GetSourceExtension() == "rule")
{
std::string source = (*i)->GetFullPath();
if(!cmSystemTools::FileExists(source.c_str()))
{
cmSystemTools::ReplaceString(source, "$(IntDir)/", "");
#if defined(_WIN32) || defined(__CYGWIN__)
std::ofstream fout(source.c_str(),
std::ios::binary | std::ios::out | std::ios::trunc);
#else
std::ofstream fout(source.c_str(),
std::ios::out | std::ios::trunc);
#endif
if(fout)
{
fout.write("# generated from CMake",22);
fout.flush();
fout.close();
}
}
}
if(!cc->IsUsed())
{
for(cmTargets::iterator l = tgts.begin();
l != tgts.end(); l++)
{
if ((l->second.GetType() != cmTarget::INSTALL_FILES)
&& (l->second.GetType() != cmTarget::INSTALL_PROGRAMS)
&& (strncmp(l->first.c_str(), "INCLUDE_EXTERNAL_MSPROJECT", 26) != 0))
{
cmTarget& target = l->second;
bool sameAsTarget = false;
// make sure we don't add a custom command that depends on
// this target
for(unsigned int k =0; k < cc->GetDepends().size(); k++)
{
if(cmSystemTools::GetFilenameName(cc->GetDepends()[k]) == target.GetFullName())
{
sameAsTarget = true;
}
}
if(!sameAsTarget)
{
target.GetSourceFiles().push_back(*i);
}
}
}
}
}
}
for(cmTargets::iterator l = tgts.begin();
l != tgts.end(); l++)
{
@ -968,7 +1042,6 @@ void cmLocalVisualStudio7Generator::WriteVCProjFile(std::ostream& fout,
// trace the visual studio dependencies
std::string name = libName;
name += ".vcproj.cmake";
target.TraceVSDependencies(name, m_Makefile);
// We may be modifying the source groups temporarily, so make a copy.
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();

View File

@ -192,6 +192,16 @@ void cmTarget::TraceVSDependencies(std::string projFile,
// finished with this SF move to the next
srcFilesToProcess.pop();
}
// mark all custom commands in the targets list of source files as used.
for(std::vector<cmSourceFile*>::iterator i = m_SourceFiles.begin();
i != m_SourceFiles.end(); ++i)
{
cmCustomCommand* cc = (*i)->GetCustomCommand();
if(cc)
{
cc->Used();
}
}
}
void cmTarget::GenerateSourceFilesFromSourceLists( cmMakefile &mf)

View File

@ -3,6 +3,8 @@
#
PROJECT (CustomCommand)
ADD_SUBDIRECTORY(GeneratedHeader)
#
# Lib and exe path
#
@ -133,8 +135,10 @@ ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_BINARY_DIR}/foo.c
# auto-object-depends feature of the Makefile generator. Currently
# the feature does not seem to work in Visual Studio generators so
# these dependencies are needed.
SET_SOURCE_FILES_PROPERTIES(${PROJECT_BINARY_DIR}/foo.c PROPERTIES
OBJECT_DEPENDS "${PROJECT_BINARY_DIR}/doc1.h;${PROJECT_BINARY_DIR}/foo.h")
#SET_SOURCE_FILES_PROPERTIES(${PROJECT_BINARY_DIR}/foo.c
#PROPERTIES
# OBJECT_DEPENDS "${PROJECT_BINARY_DIR}/doc1.h;${PROJECT_BINARY_DIR}/foo.h"
#)
# add the library
ADD_EXECUTABLE(CustomCommand
@ -143,6 +147,9 @@ ADD_EXECUTABLE(CustomCommand
${PROJECT_BINARY_DIR}/generated.c
)
TARGET_LINK_LIBRARIES(CustomCommand GeneratedHeader)
# must add a dependency on TDocument otherwise it might never build and
# the CustomCommand executable really needs doc1.h
ADD_DEPENDENCIES(CustomCommand TDocument)

View File

@ -143,15 +143,18 @@ ENDIF (QT_FOUND AND QT_UIC_EXECUTABLE)
SET (FLTK_SRCS
fltk1.fl
)
ADD_EXECUTABLE(fakefluid fakefluid.cxx)
GET_TARGET_PROPERTY(FLUID_LOC fakefluid LOCATION)
SET (FLTK_WRAP_UI "On")
SET (FLTK_FLUID_EXECUTABLE "echo")
SET (FLTK_FLUID_EXECUTABLE "${FLUID_LOC}")
FLTK_WRAP_UI (wraplibFLTK ${FLTK_SRCS})
ADD_LIBRARY(wraplibFLTK ${wraplibFLTK_FLTK_UI_SRCS})
CONFIGURE_FILE(
${Wrapping_SOURCE_DIR}/fltk1.fl
${Wrapping_BINARY_DIR}/fltk1.cxx
COPYONLY)
ADD_DEPENDENCIES(wraplibFLTK fakefluid)
ADD_DEPENDENCIES(fakefluid Wrap)
#
# Mangled Mesa
#

View File

@ -0,0 +1,16 @@
#include <stdio.h>
#include <string.h>
int main(int ac, char** av)
{
for(int i =0; i < ac; ++i)
{
if(strcmp(av[i], "-o") == 0)
{
FILE* file = fopen(av[i+1], "w");
fprintf(file, "// hello\n");
fclose(file);
return 0;
}
}
return 0;
}