mirror of
https://github.com/Kitware/CMake.git
synced 2025-10-14 10:47:59 +08:00

The file API code used unsigned long to hold the major version in most places, but not all. Some places used unsigned int, and an important one of those is the cmFileApi::BuildVersion() function. As a result, it has never been safe for a large value not representable by an unsigned int to be used in these variables. Convert all of the file API version number variables and function arguments to use unsigned int consistently. This avoids any size mismatch warnings when passing values around. They also don't need to be unsigned long, as we never expect version numbers to be anything even close to what an unsigned int cannot represent.
101 lines
3.0 KiB
C++
101 lines
3.0 KiB
C++
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
file LICENSE.rst or https://cmake.org/licensing for details. */
|
|
#include "cmTryCompileCommand.h"
|
|
|
|
#include <cm/optional>
|
|
|
|
#include "cmConfigureLog.h"
|
|
#include "cmCoreTryCompile.h"
|
|
#include "cmExecutionStatus.h"
|
|
#include "cmMakefile.h"
|
|
#include "cmMessageType.h"
|
|
#include "cmRange.h"
|
|
#include "cmState.h"
|
|
#include "cmStateTypes.h"
|
|
#include "cmStringAlgorithms.h"
|
|
#include "cmValue.h"
|
|
#include "cmake.h"
|
|
|
|
namespace {
|
|
#ifndef CMAKE_BOOTSTRAP
|
|
void WriteTryCompileEvent(cmConfigureLog& log, cmMakefile const& mf,
|
|
cmTryCompileResult const& compileResult)
|
|
{
|
|
// Keep in sync with cmFileAPIConfigureLog's DumpEventKindNames.
|
|
static std::vector<unsigned int> const LogVersionsWithTryCompileV1{ 1 };
|
|
|
|
if (log.IsAnyLogVersionEnabled(LogVersionsWithTryCompileV1)) {
|
|
log.BeginEvent("try_compile-v1", mf);
|
|
cmCoreTryCompile::WriteTryCompileEventFields(log, compileResult);
|
|
log.EndEvent();
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
|
|
bool cmTryCompileCommand(std::vector<std::string> const& args,
|
|
cmExecutionStatus& status)
|
|
{
|
|
cmMakefile& mf = status.GetMakefile();
|
|
|
|
if (args.size() < 3) {
|
|
mf.IssueMessage(
|
|
MessageType::FATAL_ERROR,
|
|
"The try_compile() command requires at least 3 arguments.");
|
|
return false;
|
|
}
|
|
|
|
if (mf.GetCMakeInstance()->GetWorkingMode() == cmake::FIND_PACKAGE_MODE) {
|
|
mf.IssueMessage(
|
|
MessageType::FATAL_ERROR,
|
|
"The try_compile() command is not supported in --find-package mode.");
|
|
return false;
|
|
}
|
|
|
|
cmStateEnums::TargetType targetType = cmStateEnums::EXECUTABLE;
|
|
cmValue tt = mf.GetDefinition("CMAKE_TRY_COMPILE_TARGET_TYPE");
|
|
if (cmNonempty(tt)) {
|
|
if (*tt == cmState::GetTargetTypeName(cmStateEnums::EXECUTABLE)) {
|
|
targetType = cmStateEnums::EXECUTABLE;
|
|
} else if (*tt ==
|
|
cmState::GetTargetTypeName(cmStateEnums::STATIC_LIBRARY)) {
|
|
targetType = cmStateEnums::STATIC_LIBRARY;
|
|
} else {
|
|
mf.IssueMessage(
|
|
MessageType::FATAL_ERROR,
|
|
cmStrCat("Invalid value '", *tt,
|
|
"' for CMAKE_TRY_COMPILE_TARGET_TYPE. Only '",
|
|
cmState::GetTargetTypeName(cmStateEnums::EXECUTABLE),
|
|
"' and '",
|
|
cmState::GetTargetTypeName(cmStateEnums::STATIC_LIBRARY),
|
|
"' are allowed."));
|
|
return false;
|
|
}
|
|
}
|
|
|
|
cmCoreTryCompile tc(&mf);
|
|
cmCoreTryCompile::Arguments arguments =
|
|
tc.ParseArgs(cmMakeRange(args), false);
|
|
if (!arguments) {
|
|
return true;
|
|
}
|
|
|
|
cm::optional<cmTryCompileResult> compileResult =
|
|
tc.TryCompileCode(arguments, targetType);
|
|
#ifndef CMAKE_BOOTSTRAP
|
|
if (compileResult && !arguments.NoLog) {
|
|
if (cmConfigureLog* log = mf.GetCMakeInstance()->GetConfigureLog()) {
|
|
WriteTryCompileEvent(*log, mf, *compileResult);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
// if They specified clean then we clean up what we can
|
|
if (tc.SrcFileSignature) {
|
|
if (!mf.GetCMakeInstance()->GetDebugTryCompile()) {
|
|
tc.CleanupFiles(tc.BinaryDirectory);
|
|
}
|
|
}
|
|
return true;
|
|
}
|