/* * Copyright (C) 2014 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.tasks; import com.android.build.gradle.internal.NdkHandler; import com.android.build.gradle.internal.core.Abi; import com.android.build.gradle.managed.NdkConfig; import com.android.build.gradle.ndk.internal.StlConfiguration; import com.google.common.base.Charsets; import com.google.common.base.Joiner; import com.google.common.collect.Sets; import com.google.common.io.Files; import org.gradle.api.Action; import org.gradle.api.DefaultTask; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.TaskAction; import org.gradle.language.c.CSourceSet; import org.gradle.language.cpp.CppSourceSet; import org.gradle.nativeplatform.NativeBinarySpec; import java.io.File; import java.io.IOException; import java.util.Set; /** * Task to create gdb.setup for native code debugging. */ public class GdbSetupTask extends DefaultTask { private NdkHandler ndkHandler; private NdkConfig extension; private NativeBinarySpec binary; private File outputDir; // ----- PUBLIC TASK API ----- @Input public File getOutputDir() { return outputDir; } public void setOutputDir(File outputDir) { this.outputDir = outputDir; } // ----- PRIVATE TASK API ----- @Input public NdkHandler getNdkHandler() { return ndkHandler; } public void setNdkHandler(NdkHandler ndkHandler) { this.ndkHandler = ndkHandler; } @Input public NdkConfig getExtension() { return extension; } public void setExtension(NdkConfig extension) { this.extension = extension; } @Input public NativeBinarySpec getBinary() { return binary; } public void setBinary(NativeBinarySpec binary) { this.binary = binary; } @TaskAction public void taskAction() { File gdbSetupFile = new File(outputDir, "gdb.setup"); StringBuilder sb = new StringBuilder(); sb.append("set solib-search-path ") .append(outputDir.toString()) .append("\n") .append("directory ") .append(ndkHandler.getSysroot(Abi.getByName(binary.getTargetPlatform().getName()))) .append("/usr/include "); final Set<String> sources = Sets.newHashSet(); binary.getSource().withType(CSourceSet.class, new Action<CSourceSet>() { @Override public void execute(CSourceSet sourceSet) { for (File src : sourceSet.getSource().getSrcDirs()) { sources.add(src.toString()); } } }); binary.getSource().withType(CppSourceSet.class, new Action<CppSourceSet>() { @Override public void execute(CppSourceSet sourceSet) { for (File src : sourceSet.getSource().getSrcDirs()) { sources.add(src.toString()); } } }); sources.addAll(StlConfiguration.getStlSources(ndkHandler, extension.getStl())); sb.append(Joiner.on(' ').join(sources)); if (!outputDir.exists()) { outputDir.mkdirs(); } try { Files.write(sb.toString(), gdbSetupFile, Charsets.UTF_8); } catch (IOException e) { throw new RuntimeException(e); } } }