用gradle构建libxml

用gradle构建libxml,gradle,cross-platform,Gradle,Cross Platform,你能分享一下你对交叉编译库的智慧吗,比如libxml2,libpng,libfreetype,它使用gradle为android和其他主机(如linux、windows和Mac Os X)提供配置脚本和生成文件 目前,我没有这两个库的完整工作示例,但希望有一个类似于以下内容的解决方案: buildSrc/src/main/groovy/com/ulabs/gradle/*。groovy包含: package com.ulabs.gradle import org.gradle.api.Def

你能分享一下你对交叉编译库的智慧吗,比如
libxml2
libpng
libfreetype
,它使用gradle为android和其他主机(如linux、windows和Mac Os X)提供配置脚本和生成文件

目前,我没有这两个库的完整工作示例,但希望有一个类似于以下内容的解决方案:

buildSrc/src/main/groovy/com/ulabs/gradle/*。groovy
包含:

package com.ulabs.gradle

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
import org.gradle.api.Project
import org.gradle.api.tasks.incremental.IncrementalTaskInputs

class AutoConfigureTask extends DefaultTask {
    @Input
    @Optional
    def extraArgs

    @TaskAction
    def execConfigure(IncrementalTaskInputs inputs) {
        println "Launching AutoConfigureTask from: " + project.projectDir

        if(!new File(project.projectDir, 'configure.ac').exists() &&
           !new File(project.projectDir, 'configure.in').exists()) {
            throw new FileNotFoundException(
                'autoconfigure task should have either configure.in or configure.ac ')
        }

        boolean outDated = false
        inputs.outOfDate { change ->
            outDated = true
        }

        if(outDated) {
            project.exec {
                executable "autoreconf"
                args "-ivf", hasProperty("extraArgs") ? extraArgs : ""
            }
        }
    }
}

package com.ulabs.gradle

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
import org.gradle.api.Project
import org.gradle.api.tasks.incremental.IncrementalTaskInputs

class ConfigureTask extends DefaultTask {
    @Input
    @Optional
    def extraArgs

    @TaskAction
    def execConfigure(IncrementalTaskInputs inputs) {
        if(!new File(project.projectDir, 'configure').exists()) {
            throw new FileNotFoundException(
                'configure task should have a configure script')
        }

        boolean outDated = false
        inputs.outOfDate { change ->
            outDated = true
        }

        if(outDated) {
            project.exec {
                executable "./configure"
                args hasProperty("extraArgs") ? extraArgs : ""
            }
        }
    }
}


package com.ulabs.gradle

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
import org.gradle.api.Project
import org.gradle.api.tasks.incremental.IncrementalTaskInputs

class MakefileTask extends DefaultTask {
    @Input
    @Optional
    def extraArgs

    @Input
    @Optional
    def env

    @TaskAction
    def execConfigure(IncrementalTaskInputs inputs) {
        if(!new File(project.projectDir, 'configure').exists()) {
            throw new FileNotFoundException(
                'makefile task should have a Makefile script')
        }

        boolean outDated = false
        inputs.outOfDate { change ->
            outDated = true
        }

        if(outDated) {
            project.exec {
                executable "make"
                args hasProperty("extraArgs") ? extraArgs : "-f Makefile"
            }
        }
    }
}
这很可能与任务的输入有关,或者任务的条件配置/运行时阶段混乱,但我尝试了许多选项,似乎都不起作用

因此,最后我希望:

  • /configure
    自动工具
    make
    除非其参数更改(
    外部参数
    环境
  • 当参数更改时,我希望它们都按照依赖项指定的链运行
  • 我希望
    libxml2
    像一个可以与其他人链接的项目一样,能够与依赖者的平台/架构相匹配,具有链接api、共享或静态

因此,调用库本身附带的构建系统似乎更好

以下是执行此操作的脚本:

task autoReconfigure(type : Exec) {
    executable "autoreconf"
    args "-vif"
    workingDir "."
}

task configureTask(type : Exec, dependsOn : autoReconfigure) {
    executable "./configure"
    args "--without-zlib"
    workingDir "."
}

task makeFileTask(type : Exec, dependsOn : configureTask) {
    executable "make"
    args "-f", "Makefile"
    workingDir "."
}

build.dependsOn(makeFileTask)
assemble.dependsOn(makeFileTask)
我将尝试添加对不同工具链/平台的支持

package com.ulabs.gradle

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
import org.gradle.api.Project
import org.gradle.api.tasks.incremental.IncrementalTaskInputs

class AutoConfigureTask extends DefaultTask {
    @Input
    @Optional
    def extraArgs

    @TaskAction
    def execConfigure(IncrementalTaskInputs inputs) {
        println "Launching AutoConfigureTask from: " + project.projectDir

        if(!new File(project.projectDir, 'configure.ac').exists() &&
           !new File(project.projectDir, 'configure.in').exists()) {
            throw new FileNotFoundException(
                'autoconfigure task should have either configure.in or configure.ac ')
        }

        boolean outDated = false
        inputs.outOfDate { change ->
            outDated = true
        }

        if(outDated) {
            project.exec {
                executable "autoreconf"
                args "-ivf", hasProperty("extraArgs") ? extraArgs : ""
            }
        }
    }
}

package com.ulabs.gradle

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
import org.gradle.api.Project
import org.gradle.api.tasks.incremental.IncrementalTaskInputs

class ConfigureTask extends DefaultTask {
    @Input
    @Optional
    def extraArgs

    @TaskAction
    def execConfigure(IncrementalTaskInputs inputs) {
        if(!new File(project.projectDir, 'configure').exists()) {
            throw new FileNotFoundException(
                'configure task should have a configure script')
        }

        boolean outDated = false
        inputs.outOfDate { change ->
            outDated = true
        }

        if(outDated) {
            project.exec {
                executable "./configure"
                args hasProperty("extraArgs") ? extraArgs : ""
            }
        }
    }
}


package com.ulabs.gradle

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Optional
import org.gradle.api.Project
import org.gradle.api.tasks.incremental.IncrementalTaskInputs

class MakefileTask extends DefaultTask {
    @Input
    @Optional
    def extraArgs

    @Input
    @Optional
    def env

    @TaskAction
    def execConfigure(IncrementalTaskInputs inputs) {
        if(!new File(project.projectDir, 'configure').exists()) {
            throw new FileNotFoundException(
                'makefile task should have a Makefile script')
        }

        boolean outDated = false
        inputs.outOfDate { change ->
            outDated = true
        }

        if(outDated) {
            project.exec {
                executable "make"
                args hasProperty("extraArgs") ? extraArgs : "-f Makefile"
            }
        }
    }
}
task autoReconfigure(type : Exec) {
    executable "autoreconf"
    args "-vif"
    workingDir "."
}

task configureTask(type : Exec, dependsOn : autoReconfigure) {
    executable "./configure"
    args "--without-zlib"
    workingDir "."
}

task makeFileTask(type : Exec, dependsOn : configureTask) {
    executable "make"
    args "-f", "Makefile"
    workingDir "."
}

build.dependsOn(makeFileTask)
assemble.dependsOn(makeFileTask)