Impianti di spegnimento antincendio: come trovare esperti in sistemi anticendio
Come Trovare Especialisti in Impianti di Spegnimento Antincendio
Come Identificare Specialisti di Sistemi di Estinzione Antincendio.
Scopri come trovare specialisti in impianti di spegnimento antincendio per garantire la sicurezza dei tuoi spazi. Nel nostro ultimo articolo, esploriamo i criteri fondamentali da considerare nella scelta dei professionisti, le certificazioni necessarie e le migliori pratiche per una corretta installazione. Assicurati di proteggere la tua proprietà!
Trova professionisti vicino a te
Trova professionisti
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.build.gradle.internal.ndk
import com.android.build.gradle.internal.core.Abi
import com.android.build.gradle.internal.core.Abi.X86
import com.android.build.gradle.internal.core.Abi.X86_64
import com.android.build.gradle.internal.cxx.configure.AbiConfigurationKey
import com.android.build.gradle.internal.cxx.configure.CmakeProperty
import com.android.build.gradle.internal.cxx.configure.CommandLineArgument
import com.android.build.gradle.internal.cxx.configure.CommandLineCmakeArgument
import com.android.build.gradle.internal.cxx.configure.DslProperty
import com.android.build.gradle.internal.cxx.configure.NativeBuildSystem
import com.android.build.gradle.internal.cxx.configure.createCmakeProperty
import com.android.build.gradle.internal.cxx.configure.createDslProperty
import com.android.build.gradle.internal.cxx.configure.createPropertyArgument
import com.android.build.gradle.internal.cxx.configure.getNdkDefaultAbi
import com.android.build.gradle.internal.cxx.configure.refreshLocalProperties
import com.android.build.gradle.internal.cxx.logging.errorln
import com.android.build.gradle.internal.cxx.logging.infoln
import com.android.build.gradle.internal.cxx.logging.warnln
import com.android.build.gradle.internal.ndk.files.CmakeFile
import com.android.build.gradle.internal.ndk.files.makeFile
import com.android.build.gradle.internal.ndk.files.soongExternalNativeBuildProperties
import com.android.build.gradle.internal.ndk.files.soongExternalNativeBuildPropertiesFile
import com.android.build.gradle.internal.scope.GlobalScope
import com.android.build.gradle.internal.scope.VariantScope
import com.android.builder.errors.EvalIssueReporter
import com.android.utils.FileUtils
import com.android.utils.ILogger
import com.google.common.base.Charsets
import com.google.common.base.Joiner
import com.google.common.base.MoreObjects
import com.google.common.base.Strings
import com.google.common.collect.ArrayListMultimap
import com.google.common.collect.ImmutableList
import com.google.common.collect.ImmutableMap
import com.google.common.collect.ImmutableSet
import com.google.common.collect.Maps
import com.google.common.collect.Multimap
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.FileCollection
import org.gradle.api.file.FileTree
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.util.PatternSet
import java.io.File
import java.io.IOException
import java.io.PrintWriter
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import java.util.Objects
import java.util.concurrent.atomic.AtomicBoolean
import java.util.function.Consumer
/**
* Data class to capture information from build.gradle that is used during configuring and building
*/
data class NdkBuildInfo(
val rootBuildScript: File,
val rootDir: File,
val buildScript: File,
val soongOutDir: File,
val makeFile: File,
val sourceFiles: FileCollection,
val abis: ImmutableSet,
val ndkHandler: NdkHandler,
val externalNativeBuildProperties: File?,
val cxxBuildSystem: NativeBuildSystem,
val cxxVersion: CxxModuleModel.CxxModuleVersion,
val variantName: String)
/**
* Generate a [NdkBuildInfo] from a [VariantScope].
*/
fun createNdkBuildInfo(
variantScope: VariantScope,
project: Project,
ndkHandler: NdkHandler,
cxxVersion: CxxModuleModel.CxxModuleVersion,
cxxBuildSystem: NativeBuildSystem,
ndkData: NdkData
): NdkBuildInfo {
val externalNativeBuildPropertiesFile = soongExternalNativeBuildPropertiesFile(variantScope)
val externalNativeBuildProperties =
if (externalNativeBuildPropertiesFile.isFile) externalNativeBuildPropertiesFile else null
return NdkBuildInfo(
rootBuildScript = variantScope.globalScope.buildFile,
rootDir = variantScope.globalScope.project.rootDir,
buildScript = variantScope.variantData.variantConfiguration.buildType.buildFile,
soongOutDir = variantScope.globalScope.ndkFolder.toFile(),
makeFile = makeFile(variantScope).toFile(),
sourceFiles = project.files(*ndkData.sources.toTypedArray()),
abis = ImmutableSet.copyOf(variantScope.getNdkAbiNames()),
externalNativeBuildProperties = externalNativeBuildProperties,
ndkHandler = ndkHandler,
cxxVersion = cxxVersion,
cxxBuildSystem = cxxBuildSystem,
variantName = variantScope.fullVariantName
)
}
/**
* Given [NdkBuildInfo] configure the ndk side of things.
*
* This is the equivalent of calling ndk-build and having it parse the Android.mk. This will create
* a cmake project and a soong externalNativeBuild.json.
*
* @return true if successful.
*/
fun configureNdkBuild(
ndkBuildInfo: NdkBuildInfo,
logger: ILogger,
issueReporter: EvalIssueReporter
): Boolean {
// Make sure the source files exist and the output folder exists
if (!ndkBuildInfo.sourceFiles.isEmpty && !ndkBuildInfo.soongOutDir.exists()) {
FileUtils.mkdirs(ndkBuildInfo.soongOutDir)
}
if (!ndkBuildInfo.sourceFiles.isEmpty && !ndkBuildInfo.makeFile.exists()) {
FileUtils.mkdirs(ndkBuildInfo.makeFile.parentFile)
}
// Check if all the source files exist and are readable
if (!ndkBuildInfo.sourceFiles.isEmpty && ndkBuildInfo.sourceFiles.files.any { !it.isFile }) {
// TODO(danalbert): This error message should print the paths that don't exist.
issueReporter.reportError(
EvalIssueReporter.Type.EXTERNAL_NATIVE_BUILD_CONFIGURATION,
"Unable to read all the source files for C/C++ code. " +
"See the error above for more details.")
return false
}
val abiNames = ndkBuildInfo.abis.map { it.tag }
val cmakeFile = CmakeFile(ndkBuildInfo.makeFile)
val groupsToFiles = ArrayListMultimap.create()
val globalProperties = mutableListOf()
val globalAppleClangFlags = mutableListOf()
val globalClangFlags = mutableListOf()
val globalLibClangFlags = mutableListOf()
val globalCFlags = mutableListOf()
val globalCppFlags = mutableListOf()
val globalLdFlags = mutableListOf()
val globalLibs = mutableListOf()
val perAbiProperties = Maps.newHashMap>()
val perAbiAppleClangFlags = Maps.newHashMap>()
val perAbiClangFlags = Maps.newHashMap>()
val perAbiLibClangFlags = Maps.newHashMap>()
val perAbiCFlags = Maps.newHashMap>()
val perAbiCppFlags = Maps.newHashMap>()
val perAbiLdFlags = Maps.newHashMap>()
val perAbiLibs = Maps.newHashMap>()
val perAbiLibraries = Maps.newHashMap>()
val perAbiIncludeDirs = Maps.newHashMap>()
val perAbiLinkerFlags = Maps.newHashMap>()
for (abi in ndkBuildInfo.abis) {
perAbiProperties[abi] = mutableListOf()
perAbiAppleClangFlags[abi] = mutableListOf()
perAbiClangFlags[abi] = mutableListOf()
perAbiLibClangFlags[abi] = mutableListOf()
perAbiCFlags[abi] = mutableListOf()
perAbiCppFlags[abi] = mutableListOf()
perAbiLdFlags[abi] = mutableListOf()
perAbiLibs[abi] = mutableListOf()
perAbiLibraries[abi] = mutableListOf()
perAbiIncludeDirs[abi] = mutableListOf()
perAbiLinkerFlags[abi] = mutableListOf()
}
// This is the root folder of the source files. The source files are expected to be relative to
// this folder.
val sourceFilesRootFolder =
when {
ndkBuildInfo.sourceFiles.isEmpty -> null
ndkBuildInfo.sourceFiles.singleFile != null -> ndkBuildInfo.sourceFiles.singleFile!!.parentFile
else -> {
val commonRoot =
FileUtils.findCommonRoot(ndkBuildInfo.sourceFiles.files.map { it.parentFile })
if (commonRoot == null) {
// This should never happen, since we already check that the files exist.
logger.errorln("Unable to locate common source files root folder. Aborting.")
return false
}
commonRoot
}
}
// This is the root folder of the Android.mk. The Android.MK is expected to be relative to this
// folder.
val makeFileRootFolder =
when {
ndkBuildInfo.sourceFiles.isEmpty -> null
ndkBuildInfo.makeFile.parentFile == null -> null
ndkBuildInfo.makeFile.parentFile.absolutePath == sourceFilesRootFolder?.absolutePath -> null
else -> ndkBuildInfo.makeFile.parentFile
}
parseAndroidMkFiles(
ndkBuildInfo = ndkBuildInfo,
sourceFilesRootFolder = sourceFilesRootFolder,
makeFileRootFolder = makeFileRootFolder,
groupsToFiles = groupsToFiles,
globalProperties = globalProperties,
globalAppleClangFlags = globalAppleClangFlags,
globalClangFlags = globalClangFlags,
globalLibClangFlags = globalLibClangFlags,
globalCFlags = globalCFlags,
globalCppFlags = globalCppFlags,
globalLdFlags = globalLdFlags,
globalLibs = globalLibs,
perAbiProperties = perAbiProperties,
perAbiAppleClangFlags = perAbiAppleClangFlags,
perAbiClangFlags = perAbiClangFlags,
perAbiLibClangFlags = perAbiLibClangFlags,
perAbiCFlags = perAbiCFlags,
perAbiCppFlags = perAbiCppFlags,
perAbiLdFlags = perAbiLdFlags,
perAbiLibs = perAbiLibs,
perAbiLibraries = perAbiLibraries,
perAbiIncludeDirs = perAbiIncludeDirs,
perAbiLinkerFlags = perAbiLinkerFlags,
logger = logger
)
if (logger.isVerbose) {
logger.verbose("Done parsing Android.mk")
logger.verbose("Android.mk groups to files:")
groupsToFiles.asMap().forEach { (name, files) ->
logger.verbose(" $name:")
files.forEach { logger.verbose(" $it") }
}
logger.verbose("Android.mk global properties:")
globalProperties.forEach(Consumer { logger.verbose(" $it") })
logger.verbose("Android.mk global flags:")
logger.verbose(" Apple clang flags: ${Joiner.on(" ").join(globalAppleClangFlags)}")
logger.verbose(" clang flags: ${Joiner.on(" ").join(globalClangFlags)}")
logger.verbose(" libclang flags: ${Joiner.on(" ").join(globalLibClangFlags)}")
logger.verbose(" C flags: ${Joiner.on(" ").join(globalCFlags)}")
logger.verbose(" C++ flags: ${Joiner.on(" ").join(globalCppFlags)}")
logger.verbose(" ld flags: ${Joiner.on(" ").join(globalLdFlags)}")
logger.verbose(" libs: ${Joiner.on(" ").join(globalLibs)}")
logger.verbose("Android.mk per-ABI properties:")
perAbiProperties.forEach { (abi, properties) ->
logger.verbose(" ${abi.tag}:")
properties.forEach(Consumer { logger.verbose(" $it") })
}
logger.verbose("Android.MK per-ABI flags:")
perAbiAppleClangFlags.forEach { (abi, flags) ->
logger.verbose(" ${abi.tag}:")
logger.verbose(" Apple clang flags: ${Joiner.on(" ").join(flags)}")
}
perAbiClangFlags.forEach { (abi, flags) ->
logger.verbose(" ${abi.tag}:")
logger.verbose(" clang flags: ${Joiner.on(" ").join(flags)}")
}
perAbiLibClangFlags.forEach { (abi, flags) ->
logger.verbose(" ${abi.tag}:")
logger.verbose(" libclang flags: ${Joiner.on(" ").join(flags)}")
}
perAbiCFlags.forEach { (abi, flags) ->
logger.verbose(" ${abi.tag}:")
logger.verbose(" C flags: ${Joiner.on(" ").join(flags)}")
}
perAbiCppFlags.forEach { (abi, flags) ->
logger.verbose(" ${abi.tag}:")
logger.verbose(" C++ flags: ${Joiner.on(" ").join(flags)}")
}
perAbiLdFlags.forEach { (abi, flags) ->
logger.verbose(" ${abi.tag}:")
logger.verbose(" ld flags: ${Joiner.on(" ").join(flags)}")
}