#!/usr/bin/env bash print_help() { (>&2 cat < Generate the .sspt file for this package and optionally edit it afterwards. Supported VCSes: git, hg, svn, cvs, bzr, mtn, darcs Supported build systems: npm, cargo, setuptools, idris, xbuild, stack, cabal, scons, gradle, sbt, bazel, meson, ninja, ant, mvn, cmake, qmake, autoconf, makefile EOF ) } autogen_git() { cat >> ".sspt" <> ".sspt" <> ".sspt" <> ".sspt" <> ".sspt" <> ".sspt" <> ".sspt" <&2 echo "NOTE: could not detect repository type of package" \ "'$1', add the .sspt file to make updating this pacakge possible.") # no upstream? cat >> ".sspt" </dev/null CHANGED_DIR=1 SSPT_FILE="../$SSPT_FILE" REL_DIR="./build" RELI_DIR="../" fi if [ -f "PKGBUILD" ]; then cat >> "$SSPT_FILE" <> "$SSPT_FILE" <> "$SSPT_FILE" </dev/null cmake .. -DCMAKE_BUILD_TYPE=Release "-DCMAKE_INSTALL_PREFIX=\$SSPT_DEST_DIR" popd >/dev/null } sspt_build() { make -C "$REL_DIR/cmake-build" -j$(nproc) } sspt_install() { make -C "$REL_DIR/cmake-build" install } sspt_clean() { make -C "$REL_DIR/cmake-build" clean } sspt_clean_config() { rm -rf "$REL_DIR/cmake-build" } EOF elif [ -f "./configure.ac" ]; then cat >> "$SSPT_FILE" <> "$SSPT_FILE" <> "$SSPT_FILE" <> "$SSPT_FILE" <> "$SSPT_FILE" <&2 echo "NOTE: npm doesn't honor \$SSPT_DEST_DIR" } sspt_build() { true } sspt_install() { npm install } sspt_clean() { true } sspt_clean_config() { rm -rf "$REL_DIR/node_packages" } EOF elif [ -f "Cargo.toml" ]; then cat >> "$SSPT_FILE" <&2 echo "You may want to edit the .sspt file to enable or disable some features." } sspt_build() { cargo build --release } sspt_install() { cargo install --root \$SSPT_DEST_DIR } sspt_clean() { cargo clean --release } sspt_clean_config() { true } EOF elif [ -f "setup.py" ]; then cat >> "$SSPT_FILE" <&2 echo "NOTE: sspt assumes that the setup.py script will be executed by the correct python binary." # ensure it is executable chmod +x $REL_DIR/setup.py } sspt_build() { "$REL_DIR/setup.py" build } sspt_install() { "$REL_DIR/setup.py" install -O2 --prefix \$SSPT_DEST_DIR } sspt_clean() { "$REL_DIR/setup.py" clean } sspt_clean_config() { "$REL_DIR/setup.py" clean -a } EOF elif [ -f "stack.yaml" ]; then cat >> "$SSPT_FILE" <&2 echo "NOTE: stack doesn't honor \$SSPT_DEST_DIR, but installs" \ "everything to \$XDG_CONFIG_HOME , which is also the default value" \ "of \$SSPT_DEST_DIR .") } sspt_build() { stack build --ghc-options -j$(nproc) } sspt_install() { stack install } sspt_clean() { stack clean } sspt_clean_config() { stack clean --full } EOF elif file_exists_glob ./*.cabal; then cat >> "$SSPT_FILE" <> "$SSPT_FILE" <&2 echo "NOTE: SCons cannot install packages.") } sspt_build() { scons } sspt_install() { (>&2 echo "NOTE: SCons cannot install packages.") } sspt_clean() { scons -c } sspt_clean_config() { true } EOF elif [ -f "build.gradle" ]; then cat >> "$SSPT_FILE" <&2 echo "NOTE: Gradle cannot install packages.") } sspt_build() { grdle -a } sspt_install() { (>&2 echo "NOTE: Gradle cannot install packages.") } sspt_clean() { (>&2 echo "NOTE: Gradle cannot clean packages.") } sspt_clean_config() { true } EOF elif file_exists_glob ./*.sbt; then cat >> "$SSPT_FILE" <&2 echo "NOTE: sbt cannot install packages.") } sspt_build() { sbt } sspt_install() { (>&2 echo "NOTE: sbt cannot install packages.") } sspt_clean() { (>&2 echo "NOTE: sbt cannot clean packages.") } sspt_clean_config() { true } EOF elif [ -f "BUILD" ]; then cat >> "$SSPT_FILE" <&2 echo "NOTE: Bazel cannot install packages.") } sspt_build() { bazel build } sspt_install() { (>&2 echo "NOTE: Bazel cannot install packages.") } sspt_clean() { bazel clean } sspt_clean_config() { true } EOF (>&2 echo "NOTE: sspt cannot figure out which target to use. Please edit the .sstp file manually.") return 1 elif [ -f "meson.build" ]; then cat >> "$SSPT_FILE" <> "$SSPT_FILE" <> "$SSPT_FILE" <&2 echo "NOTE: ant cannot install packages.") } sspt_build() { ant } sspt_install() { (>&2 echo "NOTE: ant cannot install packages.") } sspt_clean() { ant clean } sspt_clean_config() { true } EOF elif [ -f "pom.xml" ]; then cat >> "$SSPT_FILE" <> "$SSPT_FILE" <&2 echo "NOTE: idris doesn't honor \$SSPT_DEST_DIR") } sspt_build() { idris --build "$REL_DIR/$IPKG_FILE" } sspt_install() { idris --install "$REL_DIR/$IPKG_FILE" && idris --installdoc "$REL_DIR/$IPKG_FILE" } sspt_clean() { idris --clean "$REL_DIR/$IPKG_FILE" } sspt_clean_config() { true } EOF elif file_exists_glob ./*.sln; then local SLN_FILE=$(find ./*.sln -maxdepth 1 -type f | head -1) local PROBABLE_PROJECT_NAME=${SLN_FILE%.*} cat >> "$SSPT_FILE" <&2 echo "NOTE: the 'install' command for xbuild projects is extremely hacky, you might want to tweak it." } sspt_build() { xbuild /p:Configuration=Release "$REL_DIR/$SLN_FILE" } sspt_install() { cp "$RELI_DIR/$PROBABLE_PROJECT_NAME/bin/Release/"*.exe \$SSPT_DEST_DIR/bin && \ cp "$RELI_DIR/$PROBABLE_PROJECT_NAME/bin/Release/"*.dll \$SSPT_DEST_DIR/lib } sspt_clean() { xbuild /p:Configuration=Release "$REL_DIR/$SLN_FILE" /t:Clean } sspt_clean_config() { true } EOF elif ! [ -z "$CHANGED_DIR" ]; then # try top directory instead popd >/dev/null DONT_LOOK_INTO_BUILD=1 autogen_buildsys return $? else cat >> "$SSPT_FILE" <&2 echo "Could not detect how to compile package '$1'.") return 1 fi if ! [ -z "$CHANGED_DIR" ]; then popd >/dev/null fi } autogen_cwd() { if [ -f ".sspt" ]; then rm ".sspt" fi touch ".sspt" #echo "name=\"$(basename `pwd`)\"" >> ".sspt" autogen_vcs "$1" autogen_buildsys "$1" return $? } main() { local ESCAPED_PKG=$(escape_string "$1") case "$1" in "-h"|"-?"|"--help") print_help ;; "-e"|"--edit") if [ -z "$2" ]; then print_help exit fi main "$2" exec_subcommand edit "$2" ;; *) if ! exec_subcommand src-db exists "$1"; then (>&2 echo "Package '$1' doesn't exist.") exit 1 fi local PACKAGE_DIR="$SSPT_DL_DIR/$ESCAPED_PKG" pushd "$PACKAGE_DIR" >/dev/null autogen_cwd "$1" local RETVAL=$? popd >/dev/null exit $RETVAL ;; esac } if [ $# -eq 0 ]; then print_help exit fi main "$@"