# Copyright 2022 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @ECLASS: nimble.eclass # @MAINTAINER: # Anna Vyalkova # @AUTHOR: # Anna Vyalkova # @SUPPORTED_EAPIS: 8 # @PROVIDES: nim-utils # @BLURB: eclass to build Nim packages that use nimble as a build system # @EXAMPLE: # Typical ebuild for a Nim application: # # EAPI=8 # # inherit nimble # # ... # # src_compile() { # nimble_src_compile # nimble_build scss # } # # ... # # # Typical ebuild for a Nim library: # # EAPI=8 # # inherit nimble # # ... # SLOT=${PV} # # set_package_url "https://github.com/example/example" case ${EAPI} in 8) ;; *) die "${ECLASS}: EAPI ${EAPI} unsupported." esac if [[ ! ${_NIMBLE_ECLASS} ]]; then # @ECLASS_VARIABLE: BUILD_DIR # @DEFAULT_UNSET # @DESCRIPTION: # Build directory, location where all generated files should be placed. # If this isn't set, it defaults to ${WORKDIR}/${P}-build. inherit edo nim-utils ninja-utils BDEPEND="${NINJA_DEPEND} dev-lang/nim dev-nim/nimbus " # @FUNCTION: set_package_url # @USAGE: # @DESCRIPTION: # If this function is called, nimbus will generate and install a nimblemeta.json # file. Some packages specify their dependencies using URLs and nimbus is # unable to find them unless a metadata file exists. set_package_url() { debug-print-function ${FUNCNAME} "${@}" (( $# == 1 )) || \ die "${FUNCNAME} takes exactly one argument" _PACKAGE_URL="${1}" } # @FUNCTION: get_package_url # @USAGE: # @INTERNAL # @RETURN: package URL get_package_url() { echo "${_PACKAGE_URL}" } # @FUNCTION: nimble_src_configure # @USAGE: # @DESCRIPTION: # Configure the package with nimbus. This will start an out-of-source build. # Passes arguments to Nim by reading from an optionally pre-defined local # mynimargs bash array. # @CODE # src_configure() { # local mynimargs=( # --threads:on # ) # nimble_src_configure # } # @CODE nimble_src_configure() { debug-print-function ${FUNCNAME} "${@}" [[ -n "${NINJA_DEPEND}" ]] || \ ewarn "Unknown value '${NINJA}' for \${NINJA}" BUILD_DIR="${BUILD_DIR:-${WORKDIR}/${P}-build}" [[ -z ${mynimargs} ]] && local -a mynimargs=() local mynimargstype=$(declare -p mynimargs 2>&-) if [[ "${mynimargstype}" != "declare -a mynimargs="* ]]; then die "mynimargs must be declared as array" fi nim_gen_config local nimbusargs=( --nimbleDir:"${EPREFIX}"/opt/nimble --binDir:"${EPREFIX}"/usr/bin --url:"$(get_package_url)" "${mynimargs[@]}" ) edo nimbus "${nimbusargs[@]}" "${S}" "${BUILD_DIR}" } # @FUNCTION: nimble_build # @USAGE: [ninja args...] # @DESCRIPTION: # Function for building the package. All arguments are passed to eninja. nimble_build() { debug-print-function ${FUNCNAME} "${@}" eninja -C "${BUILD_DIR}" "${@}" } # @FUNCTION: nimble_src_compile # @USAGE: [ninja args...] # @DESCRIPTION: # Build the package with Ninja. All arguments are passed to nimble_build. nimble_src_compile() { debug-print-function ${FUNCNAME} "${@}" nimble_build "${@}" } # @FUNCTION: nimble_src_test # @USAGE: [ninja args...] # @DESCRIPTION: # Test the package. All arguments are passed to nimble_build. nimble_src_test() { debug-print-function ${FUNCNAME} "${@}" if nonfatal nimble_build test -n &> /dev/null; then nimble_build test "${@}" fi } # @FUNCTION: nimble_src_install # @DESCRIPTION: # Install the package with Ninja. All arguments are passed to nimble_build. nimble_src_install() { debug-print-function ${FUNCNAME} "${@}" DESTDIR="${D}" nimble_build install "${@}" einstalldocs } _NIMBLE_ECLASS=1 fi EXPORT_FUNCTIONS src_configure src_compile src_test src_install