mirror of
https://github.com/reactos/CMake.git
synced 2025-01-27 06:42:32 +00:00
ENH: Added FILES_MATCHING option to INSTALL(DIRECTORY). This will help install a tree of header files while ignoring non-headers.
This commit is contained in:
parent
5097640671
commit
60bf0531b0
@ -702,7 +702,7 @@ struct cmFileInstaller
|
|||||||
|
|
||||||
// All instances need the file command and makefile using them.
|
// All instances need the file command and makefile using them.
|
||||||
cmFileInstaller(cmFileCommand* fc, cmMakefile* mf):
|
cmFileInstaller(cmFileCommand* fc, cmMakefile* mf):
|
||||||
FileCommand(fc), Makefile(mf), DestDirLength(0)
|
FileCommand(fc), Makefile(mf), DestDirLength(0), MatchlessFiles(true)
|
||||||
{
|
{
|
||||||
// Get the current manifest.
|
// Get the current manifest.
|
||||||
this->Manifest =
|
this->Manifest =
|
||||||
@ -724,6 +724,9 @@ public:
|
|||||||
// The length of the destdir setting.
|
// The length of the destdir setting.
|
||||||
int DestDirLength;
|
int DestDirLength;
|
||||||
|
|
||||||
|
// Whether to install a file not matching any expression.
|
||||||
|
bool MatchlessFiles;
|
||||||
|
|
||||||
// The current file manifest (semicolon separated list).
|
// The current file manifest (semicolon separated list).
|
||||||
std::string Manifest;
|
std::string Manifest;
|
||||||
|
|
||||||
@ -749,7 +752,8 @@ public:
|
|||||||
std::vector<MatchRule> MatchRules;
|
std::vector<MatchRule> MatchRules;
|
||||||
|
|
||||||
// Get the properties from rules matching this input file.
|
// Get the properties from rules matching this input file.
|
||||||
MatchProperties CollectMatchProperties(const char* file)
|
MatchProperties CollectMatchProperties(const char* file,
|
||||||
|
bool isDirectory)
|
||||||
{
|
{
|
||||||
// Match rules are case-insensitive on some platforms.
|
// Match rules are case-insensitive on some platforms.
|
||||||
#if defined(_WIN32) || defined(__APPLE__) || defined(__CYGWIN__)
|
#if defined(_WIN32) || defined(__APPLE__) || defined(__CYGWIN__)
|
||||||
@ -758,16 +762,22 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Collect properties from all matching rules.
|
// Collect properties from all matching rules.
|
||||||
|
bool matched = false;
|
||||||
MatchProperties result;
|
MatchProperties result;
|
||||||
for(std::vector<MatchRule>::iterator mr = this->MatchRules.begin();
|
for(std::vector<MatchRule>::iterator mr = this->MatchRules.begin();
|
||||||
mr != this->MatchRules.end(); ++mr)
|
mr != this->MatchRules.end(); ++mr)
|
||||||
{
|
{
|
||||||
if(mr->Regex.find(file))
|
if(mr->Regex.find(file))
|
||||||
{
|
{
|
||||||
|
matched = true;
|
||||||
result.Exclude |= mr->Properties.Exclude;
|
result.Exclude |= mr->Properties.Exclude;
|
||||||
result.Permissions |= mr->Properties.Permissions;
|
result.Permissions |= mr->Properties.Permissions;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(!matched && !this->MatchlessFiles && !isDirectory)
|
||||||
|
{
|
||||||
|
result.Exclude = true;
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -868,7 +878,8 @@ bool cmFileInstaller::InstallFile(const char* fromFile, const char* toFile,
|
|||||||
bool always)
|
bool always)
|
||||||
{
|
{
|
||||||
// Collect any properties matching this file name.
|
// Collect any properties matching this file name.
|
||||||
MatchProperties match_properties = this->CollectMatchProperties(fromFile);
|
MatchProperties match_properties =
|
||||||
|
this->CollectMatchProperties(fromFile, false);
|
||||||
|
|
||||||
// Skip the file if it is excluded.
|
// Skip the file if it is excluded.
|
||||||
if(match_properties.Exclude)
|
if(match_properties.Exclude)
|
||||||
@ -946,7 +957,8 @@ bool cmFileInstaller::InstallDirectory(const char* source,
|
|||||||
bool always)
|
bool always)
|
||||||
{
|
{
|
||||||
// Collect any properties matching this directory name.
|
// Collect any properties matching this directory name.
|
||||||
MatchProperties match_properties = this->CollectMatchProperties(source);
|
MatchProperties match_properties =
|
||||||
|
this->CollectMatchProperties(source, true);
|
||||||
|
|
||||||
// Skip the directory if it is excluded.
|
// Skip the directory if it is excluded.
|
||||||
if(match_properties.Exclude)
|
if(match_properties.Exclude)
|
||||||
@ -1463,6 +1475,22 @@ bool cmFileCommand::ParseInstallArgs(std::vector<std::string> const& args,
|
|||||||
doing_permissions_dir = false;
|
doing_permissions_dir = false;
|
||||||
use_source_permissions = true;
|
use_source_permissions = true;
|
||||||
}
|
}
|
||||||
|
else if ( *cstr == "FILES_MATCHING" )
|
||||||
|
{
|
||||||
|
if(current_match_rule)
|
||||||
|
{
|
||||||
|
cmOStringStream e;
|
||||||
|
e << "INSTALL does not allow \"" << *cstr << "\" after REGEX.";
|
||||||
|
this->SetError(e.str().c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
doing_properties = false;
|
||||||
|
doing_files = false;
|
||||||
|
doing_permissions_file = false;
|
||||||
|
doing_permissions_dir = false;
|
||||||
|
installer.MatchlessFiles = false;
|
||||||
|
}
|
||||||
else if ( *cstr == "COMPONENTS" )
|
else if ( *cstr == "COMPONENTS" )
|
||||||
{
|
{
|
||||||
cmOStringStream e;
|
cmOStringStream e;
|
||||||
|
@ -871,6 +871,29 @@ cmInstallCommand::HandleDirectoryMode(std::vector<std::string> const& args)
|
|||||||
doing_component = false;
|
doing_component = false;
|
||||||
literal_args += " USE_SOURCE_PERMISSIONS";
|
literal_args += " USE_SOURCE_PERMISSIONS";
|
||||||
}
|
}
|
||||||
|
else if(args[i] == "FILES_MATCHING")
|
||||||
|
{
|
||||||
|
if(in_match_mode)
|
||||||
|
{
|
||||||
|
cmOStringStream e;
|
||||||
|
e << args[0] << " does not allow \""
|
||||||
|
<< args[i] << "\" after PATTERN or REGEX.";
|
||||||
|
this->SetError(e.str().c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add this option literally.
|
||||||
|
doing_dirs = false;
|
||||||
|
doing_destination = false;
|
||||||
|
doing_pattern = false;
|
||||||
|
doing_regex = false;
|
||||||
|
doing_permissions_file = false;
|
||||||
|
doing_permissions_dir = false;
|
||||||
|
doing_permissions_match = false;
|
||||||
|
doing_configurations = false;
|
||||||
|
doing_component = false;
|
||||||
|
literal_args += " FILES_MATCHING";
|
||||||
|
}
|
||||||
else if(args[i] == "CONFIGURATIONS")
|
else if(args[i] == "CONFIGURATIONS")
|
||||||
{
|
{
|
||||||
if(in_match_mode)
|
if(in_match_mode)
|
||||||
|
@ -178,7 +178,7 @@ public:
|
|||||||
" [DIRECTORY_PERMISSIONS permissions...]\n"
|
" [DIRECTORY_PERMISSIONS permissions...]\n"
|
||||||
" [USE_SOURCE_PERMISSIONS]\n"
|
" [USE_SOURCE_PERMISSIONS]\n"
|
||||||
" [CONFIGURATIONS [Debug|Release|...]]\n"
|
" [CONFIGURATIONS [Debug|Release|...]]\n"
|
||||||
" [COMPONENT <component>]\n"
|
" [COMPONENT <component>] [FILES_MATCHING]\n"
|
||||||
" [[PATTERN <pattern> | REGEX <regex>]\n"
|
" [[PATTERN <pattern> | REGEX <regex>]\n"
|
||||||
" [EXCLUDE] [PERMISSIONS permissions...]] [...])\n"
|
" [EXCLUDE] [PERMISSIONS permissions...]] [...])\n"
|
||||||
"The DIRECTORY form installs contents of one or more directories "
|
"The DIRECTORY form installs contents of one or more directories "
|
||||||
@ -198,18 +198,31 @@ public:
|
|||||||
"If no permissions are specified files will be given the default "
|
"If no permissions are specified files will be given the default "
|
||||||
"permissions specified in the FILES form of the command, and the "
|
"permissions specified in the FILES form of the command, and the "
|
||||||
"directories will be given the default permissions specified in the "
|
"directories will be given the default permissions specified in the "
|
||||||
"PROGRAMS form of the command. "
|
"PROGRAMS form of the command.\n"
|
||||||
"The PATTERN and REGEX options specify a globbing pattern or regular "
|
|
||||||
"expression to match directories or files encountered during traversal "
|
"Installation of directories may be controlled with fine granularity "
|
||||||
"of an input directory. The full path to an input file or directory "
|
"using the PATTERN or REGEX options. These \"match\" options specify a "
|
||||||
|
"globbing pattern or regular expression to match directories or files "
|
||||||
|
"encountered within input directories. They may be used to apply "
|
||||||
|
"certain options (see below) to a subset of the files and directories "
|
||||||
|
"encountered. "
|
||||||
|
"The full path to each input file or directory "
|
||||||
"(with forward slashes) is matched against the expression. "
|
"(with forward slashes) is matched against the expression. "
|
||||||
"A PATTERN will match only complete file names: the portion of the "
|
"A PATTERN will match only complete file names: the portion of the "
|
||||||
"full path matching the pattern must occur at the end of the file name "
|
"full path matching the pattern must occur at the end of the file name "
|
||||||
"and be preceded by a slash. "
|
"and be preceded by a slash. "
|
||||||
"A REGEX will match any portion of the full path but it may use "
|
"A REGEX will match any portion of the full path but it may use "
|
||||||
"'/' and '$' to simulate the PATTERN behavior. "
|
"'/' and '$' to simulate the PATTERN behavior. "
|
||||||
"Options following one of these matching expressions "
|
"By default all files and directories are installed whether "
|
||||||
"are applied only to files or directories matching them. "
|
"or not they are matched. "
|
||||||
|
"The FILES_MATCHING option may be given before the first match option "
|
||||||
|
"to disable installation of files (but not directories) not matched by "
|
||||||
|
"any expression. For example, the code\n"
|
||||||
|
" install(DIRECTORY src/ DESTINATION include/myproj\n"
|
||||||
|
" FILES_MATCHING PATTERN \"*.h\")\n"
|
||||||
|
"will extract and install header files from a source tree.\n"
|
||||||
|
"Some options may follow a PATTERN or REGEX expression and are "
|
||||||
|
"applied only to files or directories matching them. "
|
||||||
"The EXCLUDE option will skip the matched file or directory. "
|
"The EXCLUDE option will skip the matched file or directory. "
|
||||||
"The PERMISSIONS option overrides the permissions setting for the "
|
"The PERMISSIONS option overrides the permissions setting for the "
|
||||||
"matched file or directory. "
|
"matched file or directory. "
|
||||||
|
@ -97,6 +97,12 @@ IF(STAGE2)
|
|||||||
IF(EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/CMakeLists.txt")
|
IF(EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/CMakeLists.txt")
|
||||||
MESSAGE(FATAL_ERROR "Directory installation installed CMakeLists.txt.")
|
MESSAGE(FATAL_ERROR "Directory installation installed CMakeLists.txt.")
|
||||||
ENDIF(EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/CMakeLists.txt")
|
ENDIF(EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/CMakeLists.txt")
|
||||||
|
IF(NOT EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/alt/TestSubDir/TSD.h")
|
||||||
|
MESSAGE(FATAL_ERROR "Directory installation did not install alternate TSD.h")
|
||||||
|
ENDIF(NOT EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/alt/TestSubDir/TSD.h")
|
||||||
|
IF(EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/alt/TestSubDir/TSD.cxx")
|
||||||
|
MESSAGE(FATAL_ERROR "Directory installation installed alternate TSD.cxx")
|
||||||
|
ENDIF(EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/alt/TestSubDir/TSD.cxx")
|
||||||
|
|
||||||
# Check that scripts properly installed.
|
# Check that scripts properly installed.
|
||||||
IF(WIN32 AND NOT CYGWIN)
|
IF(WIN32 AND NOT CYGWIN)
|
||||||
@ -248,6 +254,13 @@ ELSE(STAGE2)
|
|||||||
PATTERN "CVS" EXCLUDE
|
PATTERN "CVS" EXCLUDE
|
||||||
REGEX "\\.txt$" EXCLUDE
|
REGEX "\\.txt$" EXCLUDE
|
||||||
)
|
)
|
||||||
|
INSTALL(
|
||||||
|
DIRECTORY TestSubDir DESTINATION MyTest/share/alt
|
||||||
|
FILE_PERMISSIONS OWNER_READ OWNER_WRITE
|
||||||
|
DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
|
||||||
|
GROUP_READ GROUP_EXECUTE
|
||||||
|
FILES_MATCHING PATTERN "*.h"
|
||||||
|
)
|
||||||
|
|
||||||
# Test empty directory installation.
|
# Test empty directory installation.
|
||||||
INSTALL(DIRECTORY DESTINATION MyTest/share/empty)
|
INSTALL(DIRECTORY DESTINATION MyTest/share/empty)
|
||||||
|
@ -97,6 +97,12 @@ IF(STAGE2)
|
|||||||
IF(EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/CMakeLists.txt")
|
IF(EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/CMakeLists.txt")
|
||||||
MESSAGE(FATAL_ERROR "Directory installation installed CMakeLists.txt.")
|
MESSAGE(FATAL_ERROR "Directory installation installed CMakeLists.txt.")
|
||||||
ENDIF(EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/CMakeLists.txt")
|
ENDIF(EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/CMakeLists.txt")
|
||||||
|
IF(NOT EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/alt/TestSubDir/TSD.h")
|
||||||
|
MESSAGE(FATAL_ERROR "Directory installation did not install alternate TSD.h")
|
||||||
|
ENDIF(NOT EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/alt/TestSubDir/TSD.h")
|
||||||
|
IF(EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/alt/TestSubDir/TSD.cxx")
|
||||||
|
MESSAGE(FATAL_ERROR "Directory installation installed alternate TSD.cxx")
|
||||||
|
ENDIF(EXISTS "${CMAKE_INSTALL_PREFIX}/MyTest/share/alt/TestSubDir/TSD.cxx")
|
||||||
|
|
||||||
# Check that scripts properly installed.
|
# Check that scripts properly installed.
|
||||||
IF(WIN32 AND NOT CYGWIN)
|
IF(WIN32 AND NOT CYGWIN)
|
||||||
@ -248,6 +254,13 @@ ELSE(STAGE2)
|
|||||||
PATTERN "CVS" EXCLUDE
|
PATTERN "CVS" EXCLUDE
|
||||||
REGEX "\\.txt$" EXCLUDE
|
REGEX "\\.txt$" EXCLUDE
|
||||||
)
|
)
|
||||||
|
INSTALL(
|
||||||
|
DIRECTORY TestSubDir DESTINATION MyTest/share/alt
|
||||||
|
FILE_PERMISSIONS OWNER_READ OWNER_WRITE
|
||||||
|
DIRECTORY_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE
|
||||||
|
GROUP_READ GROUP_EXECUTE
|
||||||
|
FILES_MATCHING PATTERN "*.h"
|
||||||
|
)
|
||||||
|
|
||||||
# Test empty directory installation.
|
# Test empty directory installation.
|
||||||
INSTALL(DIRECTORY DESTINATION MyTest/share/empty)
|
INSTALL(DIRECTORY DESTINATION MyTest/share/empty)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user