mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-15 11:10:19 -06:00
Add ability to copy try_compile (and try_run) source files from arbitrary locations into the operation directory. This is included for the sake of completion and consolidation, although use cases which actually require this may be rare.
120 lines
3.9 KiB
C++
120 lines
3.9 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file Copyright.txt or https://cmake.org/licensing for details. */
|
|
#pragma once
|
|
|
|
#include "cmConfigure.h" // IWYU pragma: keep
|
|
|
|
#include <map>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include <cm/optional>
|
|
|
|
#include "cmArgumentParser.h"
|
|
#include "cmArgumentParserTypes.h"
|
|
#include "cmStateTypes.h"
|
|
|
|
class cmMakefile;
|
|
template <typename Iter>
|
|
class cmRange;
|
|
|
|
/** \class cmCoreTryCompile
|
|
* \brief Base class for cmTryCompileCommand and cmTryRunCommand
|
|
*
|
|
* cmCoreTryCompile implements the functionality to build a program.
|
|
* It is the base class for cmTryCompileCommand and cmTryRunCommand.
|
|
*/
|
|
class cmCoreTryCompile
|
|
{
|
|
public:
|
|
cmCoreTryCompile(cmMakefile* mf)
|
|
: Makefile(mf)
|
|
{
|
|
}
|
|
|
|
struct Arguments : public ArgumentParser::ParseResult
|
|
{
|
|
cm::optional<std::string> CompileResultVariable;
|
|
cm::optional<std::string> BinaryDirectory;
|
|
cm::optional<std::string> SourceDirectoryOrFile;
|
|
cm::optional<std::string> ProjectName;
|
|
cm::optional<std::string> TargetName;
|
|
cm::optional<ArgumentParser::NonEmpty<std::vector<std::string>>> Sources;
|
|
cm::optional<ArgumentParser::NonEmpty<std::vector<std::string>>>
|
|
SourceFromArg;
|
|
cm::optional<ArgumentParser::NonEmpty<std::vector<std::string>>>
|
|
SourceFromVar;
|
|
cm::optional<ArgumentParser::NonEmpty<std::vector<std::string>>>
|
|
SourceFromFile;
|
|
ArgumentParser::MaybeEmpty<std::vector<std::string>> CMakeFlags{
|
|
1, "CMAKE_FLAGS"
|
|
}; // fake argv[0]
|
|
std::vector<std::string> CompileDefs;
|
|
cm::optional<ArgumentParser::MaybeEmpty<std::vector<std::string>>>
|
|
LinkLibraries;
|
|
ArgumentParser::MaybeEmpty<std::vector<std::string>> LinkOptions;
|
|
std::map<std::string, std::string> LangProps;
|
|
std::string CMakeInternal;
|
|
cm::optional<std::string> OutputVariable;
|
|
cm::optional<std::string> CopyFileTo;
|
|
cm::optional<std::string> CopyFileError;
|
|
|
|
// Argument for try_run only.
|
|
// Keep in sync with warnings in cmCoreTryCompile::ParseArgs.
|
|
cm::optional<std::string> CompileOutputVariable;
|
|
cm::optional<std::string> RunOutputVariable;
|
|
cm::optional<std::string> RunOutputStdOutVariable;
|
|
cm::optional<std::string> RunOutputStdErrVariable;
|
|
cm::optional<std::string> RunWorkingDirectory;
|
|
cm::optional<ArgumentParser::MaybeEmpty<std::vector<std::string>>> RunArgs;
|
|
};
|
|
|
|
Arguments ParseArgs(cmRange<std::vector<std::string>::const_iterator> args,
|
|
bool isTryRun);
|
|
|
|
/**
|
|
* This is the core code for try compile. It is here so that other commands,
|
|
* such as TryRun can access the same logic without duplication.
|
|
*
|
|
* This function requires at least two \p arguments and will crash if given
|
|
* fewer.
|
|
*/
|
|
bool TryCompileCode(Arguments& arguments,
|
|
cmStateEnums::TargetType targetType);
|
|
|
|
/**
|
|
* Returns \c true if \p path resides within a CMake temporary directory,
|
|
* otherwise returns \c false.
|
|
*/
|
|
static bool IsTemporary(std::string const& path);
|
|
|
|
/**
|
|
* This deletes all the files created by TryCompileCode.
|
|
* This way we do not have to rely on the timing and
|
|
* dependencies of makefiles.
|
|
*/
|
|
void CleanupFiles(std::string const& binDir);
|
|
|
|
/**
|
|
* This tries to find the (executable) file created by
|
|
TryCompileCode. The result is stored in OutputFile. If nothing is found,
|
|
the error message is stored in FindErrorMessage.
|
|
*/
|
|
void FindOutputFile(const std::string& targetName);
|
|
|
|
std::string BinaryDirectory;
|
|
std::string OutputFile;
|
|
std::string FindErrorMessage;
|
|
bool SrcFileSignature = false;
|
|
cmMakefile* Makefile;
|
|
|
|
private:
|
|
std::string WriteSource(std::string const& name, std::string const& content,
|
|
char const* command) const;
|
|
|
|
Arguments ParseArgs(
|
|
const cmRange<std::vector<std::string>::const_iterator>& args,
|
|
const cmArgumentParser<Arguments>& parser,
|
|
std::vector<std::string>& unparsedArguments);
|
|
};
|