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:
parent
aa9734ab6c
commit
a91947039a
@ -19,6 +19,7 @@
|
|||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
cmCustomCommand::cmCustomCommand()
|
cmCustomCommand::cmCustomCommand()
|
||||||
{
|
{
|
||||||
|
m_Used = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
@ -28,6 +29,7 @@ cmCustomCommand::cmCustomCommand(const cmCustomCommand& r):
|
|||||||
m_CommandLines(r.m_CommandLines),
|
m_CommandLines(r.m_CommandLines),
|
||||||
m_Comment(r.m_Comment)
|
m_Comment(r.m_Comment)
|
||||||
{
|
{
|
||||||
|
m_Used = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
@ -40,6 +42,7 @@ cmCustomCommand::cmCustomCommand(const char* output,
|
|||||||
m_CommandLines(commandLines),
|
m_CommandLines(commandLines),
|
||||||
m_Comment(comment?comment:"")
|
m_Comment(comment?comment:"")
|
||||||
{
|
{
|
||||||
|
m_Used = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
@ -49,11 +49,16 @@ public:
|
|||||||
/** Get the comment string for the command. */
|
/** Get the comment string for the command. */
|
||||||
const char* GetComment() const;
|
const char* GetComment() const;
|
||||||
|
|
||||||
|
/** set get the used status of the command */
|
||||||
|
void Used() { m_Used = true;};
|
||||||
|
bool IsUsed() { return m_Used;};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string m_Output;
|
std::string m_Output;
|
||||||
std::vector<std::string> m_Depends;
|
std::vector<std::string> m_Depends;
|
||||||
cmCustomCommandLines m_CommandLines;
|
cmCustomCommandLines m_CommandLines;
|
||||||
std::string m_Comment;
|
std::string m_Comment;
|
||||||
|
bool m_Used;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -80,9 +80,60 @@ void cmLocalVisualStudio6Generator::OutputDSPFile()
|
|||||||
|
|
||||||
// clear project names
|
// clear project names
|
||||||
m_CreatedProjectNames.clear();
|
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
|
// build any targets
|
||||||
cmTargets &tgts = m_Makefile->GetTargets();
|
|
||||||
for(cmTargets::iterator l = tgts.begin();
|
for(cmTargets::iterator l = tgts.begin();
|
||||||
l != tgts.end(); l++)
|
l != tgts.end(); l++)
|
||||||
{
|
{
|
||||||
@ -266,7 +317,6 @@ void cmLocalVisualStudio6Generator::WriteDSPFile(std::ostream& fout,
|
|||||||
// trace the visual studio dependencies
|
// trace the visual studio dependencies
|
||||||
std::string name = libName;
|
std::string name = libName;
|
||||||
name += ".dsp.cmake";
|
name += ".dsp.cmake";
|
||||||
target.TraceVSDependencies(name, m_Makefile);
|
|
||||||
|
|
||||||
// We may be modifying the source groups temporarily, so make a copy.
|
// We may be modifying the source groups temporarily, so make a copy.
|
||||||
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
|
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
|
||||||
|
@ -92,8 +92,82 @@ void cmLocalVisualStudio7Generator::OutputVCProjFile()
|
|||||||
// clear project names
|
// clear project names
|
||||||
m_CreatedProjectNames.clear();
|
m_CreatedProjectNames.clear();
|
||||||
|
|
||||||
// build any targets
|
// Call TraceVSDependencies on all targets
|
||||||
cmTargets &tgts = m_Makefile->GetTargets();
|
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();
|
for(cmTargets::iterator l = tgts.begin();
|
||||||
l != tgts.end(); l++)
|
l != tgts.end(); l++)
|
||||||
{
|
{
|
||||||
@ -968,7 +1042,6 @@ void cmLocalVisualStudio7Generator::WriteVCProjFile(std::ostream& fout,
|
|||||||
// trace the visual studio dependencies
|
// trace the visual studio dependencies
|
||||||
std::string name = libName;
|
std::string name = libName;
|
||||||
name += ".vcproj.cmake";
|
name += ".vcproj.cmake";
|
||||||
target.TraceVSDependencies(name, m_Makefile);
|
|
||||||
|
|
||||||
// We may be modifying the source groups temporarily, so make a copy.
|
// We may be modifying the source groups temporarily, so make a copy.
|
||||||
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
|
std::vector<cmSourceGroup> sourceGroups = m_Makefile->GetSourceGroups();
|
||||||
|
@ -192,6 +192,16 @@ void cmTarget::TraceVSDependencies(std::string projFile,
|
|||||||
// finished with this SF move to the next
|
// finished with this SF move to the next
|
||||||
srcFilesToProcess.pop();
|
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)
|
void cmTarget::GenerateSourceFilesFromSourceLists( cmMakefile &mf)
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
#
|
#
|
||||||
PROJECT (CustomCommand)
|
PROJECT (CustomCommand)
|
||||||
|
|
||||||
|
ADD_SUBDIRECTORY(GeneratedHeader)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Lib and exe path
|
# 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
|
# auto-object-depends feature of the Makefile generator. Currently
|
||||||
# the feature does not seem to work in Visual Studio generators so
|
# the feature does not seem to work in Visual Studio generators so
|
||||||
# these dependencies are needed.
|
# these dependencies are needed.
|
||||||
SET_SOURCE_FILES_PROPERTIES(${PROJECT_BINARY_DIR}/foo.c PROPERTIES
|
#SET_SOURCE_FILES_PROPERTIES(${PROJECT_BINARY_DIR}/foo.c
|
||||||
OBJECT_DEPENDS "${PROJECT_BINARY_DIR}/doc1.h;${PROJECT_BINARY_DIR}/foo.h")
|
#PROPERTIES
|
||||||
|
# OBJECT_DEPENDS "${PROJECT_BINARY_DIR}/doc1.h;${PROJECT_BINARY_DIR}/foo.h"
|
||||||
|
#)
|
||||||
|
|
||||||
# add the library
|
# add the library
|
||||||
ADD_EXECUTABLE(CustomCommand
|
ADD_EXECUTABLE(CustomCommand
|
||||||
@ -143,6 +147,9 @@ ADD_EXECUTABLE(CustomCommand
|
|||||||
${PROJECT_BINARY_DIR}/generated.c
|
${PROJECT_BINARY_DIR}/generated.c
|
||||||
)
|
)
|
||||||
|
|
||||||
|
TARGET_LINK_LIBRARIES(CustomCommand GeneratedHeader)
|
||||||
|
|
||||||
# must add a dependency on TDocument otherwise it might never build and
|
# must add a dependency on TDocument otherwise it might never build and
|
||||||
# the CustomCommand executable really needs doc1.h
|
# the CustomCommand executable really needs doc1.h
|
||||||
ADD_DEPENDENCIES(CustomCommand TDocument)
|
ADD_DEPENDENCIES(CustomCommand TDocument)
|
||||||
|
|
||||||
|
@ -143,15 +143,18 @@ ENDIF (QT_FOUND AND QT_UIC_EXECUTABLE)
|
|||||||
SET (FLTK_SRCS
|
SET (FLTK_SRCS
|
||||||
fltk1.fl
|
fltk1.fl
|
||||||
)
|
)
|
||||||
|
ADD_EXECUTABLE(fakefluid fakefluid.cxx)
|
||||||
|
GET_TARGET_PROPERTY(FLUID_LOC fakefluid LOCATION)
|
||||||
SET (FLTK_WRAP_UI "On")
|
SET (FLTK_WRAP_UI "On")
|
||||||
SET (FLTK_FLUID_EXECUTABLE "echo")
|
SET (FLTK_FLUID_EXECUTABLE "${FLUID_LOC}")
|
||||||
FLTK_WRAP_UI (wraplibFLTK ${FLTK_SRCS})
|
FLTK_WRAP_UI (wraplibFLTK ${FLTK_SRCS})
|
||||||
ADD_LIBRARY(wraplibFLTK ${wraplibFLTK_FLTK_UI_SRCS})
|
ADD_LIBRARY(wraplibFLTK ${wraplibFLTK_FLTK_UI_SRCS})
|
||||||
CONFIGURE_FILE(
|
CONFIGURE_FILE(
|
||||||
${Wrapping_SOURCE_DIR}/fltk1.fl
|
${Wrapping_SOURCE_DIR}/fltk1.fl
|
||||||
${Wrapping_BINARY_DIR}/fltk1.cxx
|
${Wrapping_BINARY_DIR}/fltk1.cxx
|
||||||
COPYONLY)
|
COPYONLY)
|
||||||
|
ADD_DEPENDENCIES(wraplibFLTK fakefluid)
|
||||||
|
ADD_DEPENDENCIES(fakefluid Wrap)
|
||||||
#
|
#
|
||||||
# Mangled Mesa
|
# Mangled Mesa
|
||||||
#
|
#
|
||||||
|
16
Tests/Wrapping/fakefluid.cxx
Normal file
16
Tests/Wrapping/fakefluid.cxx
Normal 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;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user