/* * Copyright 2014 the original author or authors. * * 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 org.gradle.language.c.plugins; import com.google.common.collect.Maps; import org.gradle.api.Incubating; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.internal.service.ServiceRegistry; import org.gradle.language.base.internal.SourceTransformTaskConfig; import org.gradle.language.base.internal.registry.LanguageTransformContainer; import org.gradle.language.base.plugins.ComponentModelBasePlugin; import org.gradle.language.c.CSourceSet; import org.gradle.language.c.internal.DefaultCSourceSet; import org.gradle.language.c.tasks.CCompile; import org.gradle.language.c.tasks.CPreCompiledHeaderCompile; import org.gradle.language.nativeplatform.internal.DependentSourceSetInternal; import org.gradle.language.nativeplatform.internal.NativeLanguageTransform; import org.gradle.language.nativeplatform.internal.PCHCompileTaskConfig; import org.gradle.language.nativeplatform.internal.SourceCompileTaskConfig; import org.gradle.model.Mutate; import org.gradle.model.RuleSource; import org.gradle.nativeplatform.internal.DefaultPreprocessingTool; import org.gradle.nativeplatform.internal.pch.PchEnabledLanguageTransform; import org.gradle.platform.base.ComponentType; import org.gradle.platform.base.TypeBuilder; import java.util.Map; /** * Adds core C language support. */ @Incubating public class CLangPlugin implements Plugin<Project> { @Override public void apply(final Project project) { project.getPluginManager().apply(ComponentModelBasePlugin.class); } @SuppressWarnings("UnusedDeclaration") static class Rules extends RuleSource { @ComponentType void registerLanguage(TypeBuilder<CSourceSet> builder) { builder.defaultImplementation(DefaultCSourceSet.class); builder.internalView(DependentSourceSetInternal.class); } @Mutate void registerLanguageTransform(LanguageTransformContainer languages, ServiceRegistry serviceRegistry) { languages.add(new C()); } } private static class C extends NativeLanguageTransform<CSourceSet> implements PchEnabledLanguageTransform<CSourceSet> { @Override public Class<CSourceSet> getSourceSetType() { return CSourceSet.class; } @Override public Map<String, Class<?>> getBinaryTools() { Map<String, Class<?>> tools = Maps.newLinkedHashMap(); tools.put("cCompiler", DefaultPreprocessingTool.class); return tools; } @Override public String getLanguageName() { return "c"; } @Override public SourceTransformTaskConfig getTransformTask() { return new SourceCompileTaskConfig(this, CCompile.class); } @Override public SourceTransformTaskConfig getPchTransformTask() { return new PCHCompileTaskConfig(this, CPreCompiledHeaderCompile.class); } } }