libpmodules.bash 19.8 KB
Newer Older
1
#!/bin/bash
gsell's avatar
gsell committed
2

3
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin
gsell's avatar
gsell committed
4

5 6 7
# disable auto-echo feature of 'cd'
unset CDPATH

8 9 10
shopt -s expand_aliases


11 12
declare -r  BUILDSCRIPT_DIR=$( cd $(dirname "$0") && pwd )
declare -r  BUILDSCRIPT="${BUILDSCRIPT_DIR}"/$(basename "$0")
13 14 15
declare -rx ARGS="$@"
declare -rx SHLIBDIR=$( cd $(dirname "$BASH_SOURCE") && pwd )
declare -r OS=$(uname -s)
gsell's avatar
gsell committed
16

17
# number of parallel make jobs
18
declare -i  JOBS=3
gsell's avatar
gsell committed
19 20 21

source "${SHLIBDIR}/lib.bash"

22 23 24 25 26 27 28 29 30 31
declare -rx BUILD_BASEDIR=$(abspath $SHLIBDIR/..)

source "$(readlink ${BUILD_BASEDIR}/config/environment.bash)"

declare -xr BUILD_CONFIGDIR="${BUILD_BASEDIR}/config"
declare -xr BUILD_SCRIPTSDIR="${BUILD_BASEDIR}/scripts"
declare -xr BUILD_TMPDIR="${BUILD_BASEDIR}/tmp"
declare -xr BUILD_DOWNLOADSDIR="${BUILD_BASEDIR}/Downloads"
declare -xr BUILD_VERSIONSFILE="${BUILD_CONFIGDIR}/versions.conf"

32
#source "${BUILD_CONFIGDIR}/Pmodules.conf"
33 34 35

declare -x  PREFIX=''
declare -x  DOCDIR=''
gsell's avatar
gsell committed
36
declare -x  MODULE_GROUP=''
37
declare	-x  MODULE_RELEASE=''
38 39 40
declare     cur_module_release=''

declare     DEPEND_RELEASE=''
41 42 43 44 45 46 47 48 49
declare -x  MODULE_NAME=''

# these directories are module dependend
declare -x  MODULE_SRCDIR=''
declare -x  MODULE_BUILDDIR=''

declare -x  MODULE_BUILD_DEPENDENCIES
declare -x  MODULE_DEPENDENCIES

50 51 52 53 54 55
declare -x  C_INCLUDE_PATH
declare -x  CPLUS_INCLUDE_PATH
declare -x  CPP_INCLUDE_PATH
declare -x  LIBRARY_PATH
declare -x  LD_LIBRARY_PATH
declare -x  DYLD_LIBRARY_PATH
56

57 58
##############################################################################
#
gsell's avatar
gsell committed
59
usage() {
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
	error "
Usage: $0 [OPTIONS..] [VERSION] [ENV=VALUE...]

VERSION
        Version of module to compile.

ENV=VALUE
        Set environment variable ENV to VALUE. This can be used to
        overwrite default versions.

-? | -h | --help
        Print usage

-v | --verbose )
        Verbose output

-j N | --jobs=N
        Run N parallel make jobs

-f | --force-rebuild
        Force rebuild of module.

82 83 84
-b | --bootstrap 
	Bootstrap Pmodules

85 86 87
--with=P/V
        Preload module P with version V. To preload multiple modules,
        use this option per module. Nete that order may matter.
88

89
--release=stable|unstable|deprecated
90 91 92 93 94

"
	exit 1
}

95 96 97 98 99 100
##############################################################################
#
# test whether a the string passed in $1 is a valid release name
#
# $1: string to be tested
#
101 102
is_release () {
	[[ ${releases} =~ :$1: ]]
103
}
104

105 106
##############################################################################
#
gsell's avatar
gsell committed
107
# set supported OS
108
#
gsell's avatar
gsell committed
109
# $1: OS (as printed by 'uname -s')
110
#
gsell's avatar
gsell committed
111
pmodules.supported_os() {
112 113
	for os in "$@"; do
		[[ ${os} == ${OS} ]] && return 0
gsell's avatar
gsell committed
114
	done
115
	die 0 "${P}: Not available for ${OS}."
gsell's avatar
gsell committed
116 117
}

gsell's avatar
gsell committed
118 119 120 121 122 123 124
##############################################################################
#
# install module in given group
#
# $1: group
#
pmodules.add_to_group() {
gsell's avatar
gsell committed
125
	if [[ -z ${1} ]]; then
gsell's avatar
gsell committed
126
		die 42 "${FUNCNAME}: Missing group argument."
gsell's avatar
gsell committed
127
	fi
gsell's avatar
gsell committed
128 129
	if [[ ! -d ${PMODULES_ROOT}/${PMODULES_TEMPLATES_DIR}/${1} ]]; then
		die 43 "${1}: group does not exist."
gsell's avatar
gsell committed
130
	fi
gsell's avatar
gsell committed
131 132 133
	MODULE_GROUP=$1
}

gsell's avatar
gsell committed
134 135 136 137 138 139 140
##############################################################################
#
# install module in given group
#
# $1: group
#
pmodules.set_build_dependencies() {
141
	MODULE_BUILD_DEPENDENCIES=("$@")
142 143
}

gsell's avatar
gsell committed
144 145
pmodules.set_docfiles() {
	MODULE_DOCFILES=("$@")
gsell's avatar
gsell committed
146 147
}

gsell's avatar
gsell committed
148 149
module_is_available() {
	[[ -n $("${MODULECMD}" bash avail "$1" 2>&1 1>/dev/null) ]]
gsell's avatar
gsell committed
150 151
}

gsell's avatar
gsell committed
152 153 154 155 156 157 158 159
##############################################################################
#
# test whether a module is loaded or not
#
# $1: module name
#
is_loaded() {
        [[ :${LOADEDMODULES}: =~ :$1: ]]
gsell's avatar
gsell committed
160 161
}

162

gsell's avatar
gsell committed
163
load_build_dependencies() {
164
	for m in "${MODULE_BUILD_DEPENDENCIES[@]}"; do
165 166
		[[ -z $m ]] && continue
		if [[ ! $m =~ "*/*" ]]; then
gsell's avatar
gsell committed
167 168 169 170
			local _V=$(echo -n $m | tr [:lower:] [:upper:] )_VERSION
			if [[ -n ${!_V} ]]; then
		    		m=$m/${!_V}
			else
gsell's avatar
gsell committed
171
				echo "$m: warning: No version set, loading default ..."
gsell's avatar
gsell committed
172
			fi
173
		fi
gsell's avatar
gsell committed
174
		is_loaded "$m" && continue
175 176
		if ! module_is_available "$m"; then
		        debug "${m}: module not available"
gsell's avatar
gsell committed
177
			local rels=( ${releases//:/ } )
178 179 180 181 182
			for rel in "${rels[@]}"; do
				debug "${m}: check release \"${rel}\""
				eval $("${MODULECMD}" bash use ${rel})
				if module_is_available "${m}"; then
					die 1 "${m}: module available with release \"${rel}\", add this release with \"module use ${rel}\" and re-run build script."
183 184
				fi
			done
185 186 187
			[[ ${dry_run} == yes ]] && {
				die 1 "${m}: module does not exist, cannot continue with dry run..."
				}
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215

			echo "$m: module does not exist, trying to build it..."
			local args=( '' )
			set -- ${ARGS[@]}
			while (( $# > 0 )); do
				case $1 in
				-j )
					args+=( "-j $2" )
					shift
					;;
				--jobs=[0-9]* )
					args+=( $1 )
					;;
				-v | --verbose)
					args+=( $1 )
					;;
				--release=* )
					args+=( $1 )
					;;
				--with=*/* )
					args+=( $1 )
					;;
				*=* )
					args+=( $1 )
					;;
				esac
				shift
			done
216
			"${BUILD_SCRIPTSDIR}"/*/"${m/\/*}/build" ${args[@]}
217
			if [[ -z $(module avail "$m" 2>&1) ]]; then
gsell's avatar
gsell committed
218
				die 1 "$m: oops: build failed..."
219 220
			fi
		fi
gsell's avatar
gsell committed
221 222
		# :FIXME: this doesn't work any more!
		local modulepath_root="${PMODULES_ROOT}/${PMODULES_MODULEFILES_DIR}"
223 224
		local tmp=$( module display "${m}" 2>&1 | grep -m1 -- "${modulepath_root}" )
		tmp=${tmp/${modulepath_root}\/}
225 226 227
		tmp=${tmp%%/*}
		local _family=( ${tmp//./ } )
		if [[ ${_family[1]} == deprecated ]]; then
228 229
			# set module release to 'deprecated' if a build dependency
			# is deprecated
230
			DEPEND_RELEASE='deprecated'
231
		elif [[ ${_family[1]} == unstable ]] && [[ -z ${DEPEND_RELEASE} ]]; then
232 233
			# set module release to 'unstable' if a build dependency is
			# unstable and release not yet set
234
			DEPEND_RELEASE='unstable'
235
		fi
gsell's avatar
gsell committed
236 237

		
238 239
		echo "Loading module: ${m}"
		module load "${m}"
240 241 242
	done
}

243
if [[ ${bootstrap} == yes ]]; then
gsell's avatar
gsell committed
244
    load_build_dependencies() {
245 246 247 248
	    :
    }
fi

gsell's avatar
gsell committed
249
write_runtime_dependencies() {
gsell's avatar
gsell committed
250
	local -r fname="${PREFIX}/.dependencies"
251
	info "Writing run-time dependencies to ${fname}"
gsell's avatar
gsell committed
252 253
	local dep
	echo -n "" > "${fname}"
254
	for dep in "${MODULE_DEPENDENCIES[@]}"; do
gsell's avatar
gsell committed
255
		[[ -z $dep ]] && continue
256
		if [[ ! $dep =~ .*/.* ]]; then
257
		    local _V=$(echo -n $dep | tr [:lower:] [:upper:] )_VERSION
gsell's avatar
gsell committed
258 259 260 261 262 263
		    dep=$dep/${!_V}
		fi
		echo "${dep}" >> "${fname}"
	done
}

gsell's avatar
gsell committed
264
write_build_dependencies() {
gsell's avatar
gsell committed
265
	local -r fname="${PREFIX}/.build_dependencies"
266
	info "Writing build dependencies to ${fname}"
gsell's avatar
gsell committed
267 268
	local dep
	echo -n "" > "${fname}"
269
	for dep in "${MODULE_BUILD_DEPENDENCIES[@]}"; do
gsell's avatar
gsell committed
270 271
		[[ -z $dep ]] && continue
		if [[ ! $dep =~ "*/*" ]]; then
272
		    local _V=$(echo -n $dep | tr [:lower:] [:upper:] )_VERSION
gsell's avatar
gsell committed
273 274 275 276 277 278
		    dep=$dep/${!_V}
		fi
		echo "${dep}" >> "${fname}"
	done
}

279 280 281 282
##############################################################################
# 
# cleanup environment
#
gsell's avatar
gsell committed
283
pmodules.cleanup_env() {
284

gsell's avatar
gsell committed
285 286 287 288 289 290 291
	C_INCLUDE_PATH=''
	CPLUS_INCLUDE_PATH=''
	CPP_INCLUDE_PATH=''
	LIBRARY_PATH=''
	LD_LIBRARY_PATH=''
	DYLD_LIBRARY_PATH=''

292 293 294 295 296
	CFLAGS=''
	CPPFLAGS=''
	CXXFLAGS=''
	LIBS=''
	LDFLAGS=''
297 298 299 300 301 302 303 304
}

##############################################################################
#
# load default versions
#
 _setup_env1() {
	local varname=''
305 306 307 308
	while read _name _version; do
		[[ -z ${_name} ]] && continue
		[[ -z ${_version} ]] && continue
		[[ "${_name:0:1}" == '#' ]] && continue
309 310 311 312 313
		var_name=$(echo ${_name} | tr [:lower:] [:upper:])_VERSION
		# don't set version, if already set
		if [[ -z ${!var_name} ]]; then
			eval ${var_name}="${_version}"
		fi
314 315 316 317
	done < "${BUILD_VERSIONSFILE}"

}

gsell's avatar
gsell committed
318 319 320 321 322 323
#
# find tarball 
# $1: download directory
# $2: name without version
# $3: version
#
gsell's avatar
gsell committed
324
find_tarball() {
gsell's avatar
gsell committed
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
	local -r dir=$1
	local -r name=$2
	local -r version=$3

	TARBALL=""
	local ext
	for ext in tar tar.gz tgz tar.bz2 tar.xz; do
		local fname="${dir}/${name}-${OS}-${version}.${ext}"
		if [[ -r "${fname}" ]]; then
			TARBALL="${fname}"
			break
		fi
		local fname="${dir}/${name}-${version}.${ext}"
		if [[ -r "${fname}" ]]; then
			TARBALL="${fname}"
			break
		fi
	done
	if [[ -z ${TARBALL} ]]; then
		error "tar-ball for $P/$V not found."
		exit 43
	fi
}

349
#setup module specific environment
gsell's avatar
gsell committed
350
setup_env2() {
gsell's avatar
gsell committed
351 352
	if [[ -z ${MODULE_GROUP} ]]; then
		die 1 "$P: group not set."
gsell's avatar
gsell committed
353 354 355
	fi

	# overwrite environment variables with values we got on the cmd line
gsell's avatar
gsell committed
356
	eval "${ENVIRONMENT_ARGS}"
gsell's avatar
gsell committed
357

358 359
	# this allows us to specify the version as PKGNAME_VERSION=1.2.3 on
	# the cmd-line
gsell's avatar
gsell committed
360 361 362 363 364 365 366 367
        if [[ -z $V ]]; then
		V=$(eval echo \$${_P}_VERSION)
	fi

	# oops, we need a version
	if [[ -z $V ]]; then
		die 1 "$P: Missing version."
	fi
368
	MODULE_SRCDIR="${BUILD_TMPDIR}/src/${P/_serial}-$V"
369
	MODULE_BUILDDIR="${BUILD_TMPDIR}/build/$P-$V"
gsell's avatar
gsell committed
370 371

	# build module name
372 373
	# :FIXME: the MODULE_PREFIX should be derived from MODULE_NAME
	# :FIXME: this should be read from a configuration file
gsell's avatar
gsell committed
374
	case ${MODULE_GROUP} in
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417
		Tools )
			MODULE_RPREFIX="${P}/${V}"
			MODULE_NAME="${P}/${V}"
			;;
		Programming )
			MODULE_RPREFIX="${P}/${V}"
			MODULE_NAME="${P}/${V}"
			;;
		Libraries )
			MODULE_RPREFIX="${P}/${V}"
			MODULE_NAME="${P}/${V}"
			;;
		System )
			MODULE_RPREFIX="${P}/${V}"
			MODULE_NAME="${P}/${V}"
			;;
		Compiler )
			MODULE_RPREFIX="${P}/${V}"
			MODULE_RPREFIX+="/${COMPILER}/${COMPILER_VERSION}"
			
			MODULE_NAME="${COMPILER}/${COMPILER_VERSION}/"
			MODULE_NAME+="${P}/${V}"
			;;
		MPI )
			MODULE_RPREFIX="${P}/${V}/"
			MODULE_RPREFIX+="${MPI}/${MPI_VERSION}/"
			MODULE_RPREFIX+="${COMPILER}/${COMPILER_VERSION}"
			
			MODULE_NAME="${COMPILER}/${COMPILER_VERSION}/"
			MODULE_NAME+="${MPI}/${MPI_VERSION}/"
			MODULE_NAME+="${P}/${V}"
			;;
		HDF5 )
			MODULE_RPREFIX="${P}/${V}"
			MODULE_RPREFIX+="/${HDF5}/${HDF5_VERSION}"
			MODULE_RPREFIX+="/${MPI}/${MPI_VERSION}"
			MODULE_RPREFIX+="/${COMPILER}/${COMPILER_VERSION}"
			
			MODULE_NAME="${COMPILER}/${COMPILER_VERSION}/"
			MODULE_NAME+="${MPI}/${MPI_VERSION}/"
			MODULE_NAME+="${HDF5}/${HDF5_VERSION}/"
			MODULE_NAME+="${P}/${V}"
			;;
418 419 420 421 422 423 424 425 426 427 428
		OPAL )
			MODULE_RPREFIX="${P}/${V}"
			MODULE_RPREFIX+="/${OPAL}/${OPAL_VERSION}"
			MODULE_RPREFIX+="/${MPI}/${MPI_VERSION}"
			MODULE_RPREFIX+="/${COMPILER}/${COMPILER_VERSION}"
			
			MODULE_NAME="${COMPILER}/${COMPILER_VERSION}/"
			MODULE_NAME+="${MPI}/${MPI_VERSION}/"
			MODULE_NAME+="${OPAL}/${OPAL_VERSION}/"
			MODULE_NAME+="${P}/${V}"
			;;
429 430 431 432 433 434
		HDF5_serial )
			MODULE_RPREFIX="${P}/${V}"
			MODULE_RPREFIX+="/hdf5_serial/${HDF5_SERIAL_VERSION}"
			MODULE_RPREFIX+="/${COMPILER}/${COMPILER_VERSION}"
			
			MODULE_NAME="${COMPILER}/${COMPILER_VERSION}/"
gsell's avatar
gsell committed
435
			MODULE_NAME+="hdf5_serial/${HDF5_SERIAL_VERSION}/"
436 437 438
			MODULE_NAME+="${P}/${V}"
			;;
		* )
gsell's avatar
gsell committed
439
			die 1 "$P: oops: unknown group: ${MODULE_GROUP}"
440
			;;
gsell's avatar
gsell committed
441 442
	esac

gsell's avatar
gsell committed
443
	# set PREFIX of module
gsell's avatar
gsell committed
444
	PREFIX="${PMODULES_ROOT}/${MODULE_GROUP}/${MODULE_RPREFIX}"
gsell's avatar
gsell committed
445

446 447
	# get module release if already installed
	local saved_modulepath=${MODULEPATH}
448 449 450
	rels=( ${releases//:/ } )
	for rel in "${rels[@]}"; do
		eval $("${MODULECMD}" bash unuse ${rel})
451
	done
452 453 454
	for rel in "${rels[@]}"; do
		eval $("${MODULECMD}" bash use ${rel})
		if module_is_available "${P}/${V}"; then
455
			cur_module_release=${rel}
456
			info "${P}/${V}: already available and released as \"${rel}\""
457 458 459 460 461 462 463 464 465 466
			break
		fi
	done
	MODULEPATH=${saved_modulepath}

	# set release of module
	# release is deprecated
	#   - if a build-dependency is deprecated or 
	#   - the module already exists and is deprecated or
	#   - is forced to be deprecated by setting this on the command line
467 468 469 470
	if [[ "${depend_release}" == 'deprecated' ]] || \
		[[ "${cur_module_release}" == 'deprecated' ]] \
		|| [[ "${MODULE_RELEASE}" == 'deprecated' ]]; then
		MODULE_RELEASE='deprecated'
471 472 473 474 475
		info "${P}/${V}: will be released as \"deprecated\""
	#
	# release is stable
	#   - if all build-dependency are stable or
	#   - the module already exists and is stable
476 477
	#   - an unstable release of the module exists and the release is
	#     changed to stable on the command line
478 479 480 481
	elif [[ "${depend_release}" == 'stable' ]] \
		|| [[ "${cur_module_release}" == 'stable' ]] \
		|| [[ "${MODULE_RELEASE}" == 'stable' ]]; then
		MODULE_RELEASE='stable'
482 483 484 485
		info "${P}/${V}: will be released as \"stable\""
	#
	# release is unstable
	#   - if a build-dependency is unstable or 
486 487
	#   - if the module does not exists and no other release-type is
	#     given on the command line
488 489
	#   - and all the cases I didn't think of
	else
490
		MODULE_RELEASE='unstable'
491 492
		info "${P}/${V}: will be released as \"unstable\""
	fi
493 494

	# directory for README's, license files etc
gsell's avatar
gsell committed
495 496
	DOCDIR="${PREFIX}/share/doc/$P"

497
	# set tar-ball and flags for tar
gsell's avatar
gsell committed
498
	find_tarball "${BUILD_DOWNLOADSDIR}" "${P/_serial}" "${V}"
499

gsell's avatar
gsell committed
500 501
}

502
# redefine function for bootstrapping
gsell's avatar
gsell committed
503
setup_env2_bootstrap() {
gsell's avatar
gsell committed
504 505
	if [[ -z ${MODULE_GROUP} ]]; then
		die 1 "$P: group not set."
506
	fi
507

508
        if [[ -z $V ]]; then
509
		V=$(eval echo \$${_P}_VERSION)
510
	fi
511

512 513
	# oops, we need a version
	if [[ -z $V ]]; then
514
		die 1 "$P: Missing version."
515 516 517
	fi
	MODULE_SRCDIR="${BUILD_TMPDIR}/src/${P/_serial}-$V"
	MODULE_BUILDDIR="${BUILD_TMPDIR}/build/$P-$V"
gsell's avatar
gsell committed
518
	MODULE_GROUP='Tools'
519 520
	MODULE_NAME="Pmodules/${PMODULES_VERSION}"
	# set PREFIX of module
gsell's avatar
gsell committed
521
	PREFIX="${PMODULES_ROOT}/${MODULE_GROUP}/${MODULE_NAME}"
522 523 524 525 526 527 528 529
	
	MODULE_RELEASE='unstable'
	info "${MODULE_NAME}: will be released as \"${MODULE_RELEASE}\""

	# directory for README's, license files etc
	DOCDIR="${PREFIX}/share/doc/$P"

	# set tar-ball and flags for tar
gsell's avatar
gsell committed
530 531
	find_tarball "${BUILD_DOWNLOADSDIR}" "${P/_serial}" "${V}"

532 533 534 535 536 537 538 539 540
	C_INCLUDE_PATH="${PREFIX}/include"
	CPLUS_INCLUDE_PATH="${PREFIX}/include"
	CPP_INCLUDE_PATH="${PREFIX}/include"
	LIBRARY_PATH="${PREFIX}/lib"
	LD_LIBRARY_PATH="${PREFIX}/lib"
	DYLD_LIBRARY_PATH="${PREFIX}/lib"

	PATH+=":${PREFIX}/bin"
}
541

gsell's avatar
gsell committed
542
prep() {
gsell's avatar
gsell committed
543 544

	# untar sources
545 546
	if [[ ! -d ${MODULE_SRCDIR} ]]; then
		mkdir -p "${BUILD_TMPDIR}/src"
547
		(cd "${BUILD_TMPDIR}/src" && tar xvf "${TARBALL}")
gsell's avatar
gsell committed
548 549 550
	fi

	# create build directory
551
	mkdir -p "${MODULE_BUILDDIR}"
gsell's avatar
gsell committed
552 553 554

}

gsell's avatar
gsell committed
555
pmodules.pre_configure() {
gsell's avatar
gsell committed
556 557 558
	:
}

gsell's avatar
gsell committed
559
pmodules.configure() {
560
	${MODULE_SRCDIR}/configure \
gsell's avatar
gsell committed
561 562 563
		--prefix="${PREFIX}"
}

gsell's avatar
gsell committed
564
pmodules.build() {
gsell's avatar
gsell committed
565 566 567
	make -j${JOBS}
}

gsell's avatar
gsell committed
568
pmodules.install() {
gsell's avatar
gsell committed
569 570 571
	make install
}

gsell's avatar
gsell committed
572
pmodules.post_install() {
gsell's avatar
gsell committed
573 574 575
	:
}

gsell's avatar
gsell committed
576
pmodules.install_doc() {
577
	info "Installing documentation to ${DOCDIR}"
578
	install -m 0755 -d "${DOCDIR}"
579
	install -m0444 "${MODULE_DOCFILES[@]/#/${MODULE_SRCDIR}/}" "${BUILDSCRIPT}" "${DOCDIR}"
gsell's avatar
gsell committed
580 581
}

gsell's avatar
gsell committed
582
set_legacy_link() {
gsell's avatar
gsell committed
583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601
	local -r link_name="${PMODULES_ROOT}/${PMODULES_MODULEFILES_DIR}/${MODULE_GROUP}/${MODULE_NAME}"
	local -r dir_name=${link_name%/*}
	local -r release_file="${dir_name}/.release-${MODULE_NAME##*/}"
	if [[ ! -e "${_path}" ]]; then
	    (
		    info "Setting new sym-link \"${link_name}\" ..."
		    mkdir -p "${dir_name}"
		    cd "${dir_name}"
		    local x
		    IFS='/' x=( ${dir_name/${PMODULES_ROOT}\/${PMODULES_MODULEFILES_DIR}\/} )
		    local n=${#x[@]}
		    local -r _target="../"$(eval printf "../%.s" {1..${n}})${PMODULES_TEMPLATES_DIR##*/}/"${MODULE_GROUP}/${P}/modulefile"
		    ln -fs "${_target}" "${MODULE_NAME##*/}"
	    )
	fi
	info "${MODULE_NAME}: set release to '${MODULE_RELEASE}'"
	echo "${MODULE_RELEASE}" > "${release_file}"
}

gsell's avatar
gsell committed
602
set_link() {
gsell's avatar
gsell committed
603
	local -r link_name="${PMODULES_ROOT}/${MODULE_GROUP}/${PMODULES_MODULEFILES_DIR}/${MODULE_NAME}"
604 605 606 607 608 609 610 611
	local -r dir_name=${link_name%/*}
	local -r release_file="${dir_name}/.release-${MODULE_NAME##*/}"
	if [[ ! -e "${_path}" ]]; then
	    (
		    info "Setting new sym-link \"${link_name}\" ..."
		    mkdir -p "${dir_name}"
		    cd "${dir_name}"
		    local x
gsell's avatar
gsell committed
612
		    IFS='/' x=( ${dir_name/${PMODULES_ROOT}\/${MODULE_GROUP}\/} )
613
		    local n=${#x[@]}
gsell's avatar
gsell committed
614
		    local -r _target="../"$(eval printf "../%.s" {1..${n}})${PMODULES_TEMPLATES_DIR##*/}/"${MODULE_GROUP}/${P}/modulefile"
615 616
		    ln -fs "${_target}" "${MODULE_NAME##*/}"
	    )
617
	fi
618 619
	info "${MODULE_NAME}: set release to '${MODULE_RELEASE}'"
	echo "${MODULE_RELEASE}" > "${release_file}"
gsell's avatar
gsell committed
620 621
}

gsell's avatar
gsell committed
622
pmodules.cleanup_build() {
623 624 625 626 627 628 629 630
	[[ -n "${MODULE_BUILDDIR}" ]]     \
		|| die 1 "Oops: internal error: MODULE_BUILDDIR is set to empty string..."
	[[ "${MODULE_BUILDDIR}" == "/" ]] \
		&& die 1 "Oops: internal error: MODULE_BUILDDIR is set to '/'..."
	[[ -d "/${MODULE_BUILDDIR}" ]]    \
		|| die 1 "Oops: internal error: MODULE_BUILDDIR=${MODULE_BUILDDIR} is not a directory..."
	echo "Cleaning up '/${MODULE_BUILDDIR}'..."
	rm -rf  "/${MODULE_BUILDDIR}"
gsell's avatar
gsell committed
631 632
}

gsell's avatar
gsell committed
633
pmodules.cleanup_src() {
634
    (
635 636
	[[ -d /${MODULE_SRCDIR} ]] || return 0
	cd "/${MODULE_SRCDIR}/..";
637 638
	if [[ $(pwd) != / ]]; then
		echo "Cleaning up $(pwd)"
639
		rm -rf ${MODULE_SRCDIR##*/}
640 641
	fi
    );
642
	return 0
643 644
}

gsell's avatar
gsell committed
645
check_compiler() {
646 647
	test -z ${MODULE_SUPPORTED_COMPILERS} && return 0
	for cc in ${MODULE_SUPPORTED_COMPILERS[@]}; do
gsell's avatar
gsell committed
648 649 650 651 652 653
		if [[ ${COMPILER}/${COMPILER_VERSION} =~ ${cc} ]]; then
			return 0
		fi
	done
	die 0 "Package cannot be build with ${COMPILER}/${COMPILER_VERSION}."
}
654

655
# unfortunatelly we need sometime an OS depended post-install
gsell's avatar
gsell committed
656
post_install_linux() {
657 658 659
	cd "${PREFIX}"
	# solve multilib problem with LIBRARY_PATH on 64bit Linux
	[[ -d "lib" ]] && [[ ! -d "lib64" ]] && ln -s lib lib64
660
	return 0
661 662
}

gsell's avatar
gsell committed
663
post_install() {
664
	info "Run post-installation for ${OS} ..."
gsell's avatar
gsell committed
665
	[[ "${OS}" == "Linux" ]] && post_install_linux
666
	info "Post-installation done ..."
gsell's avatar
gsell committed
667
	return 0
668
}
669

gsell's avatar
gsell committed
670
pmodules.make_all() {
gsell's avatar
gsell committed
671
	local building='no'
672
	echo "${P}:"
673
	_setup_env1
gsell's avatar
gsell committed
674
	load_build_dependencies
675
	# setup module specific environment
676
	if [[ ${bootstrap} == no ]]; then
gsell's avatar
gsell committed
677
		setup_env2
678
	else
gsell's avatar
gsell committed
679
		setup_env2_bootstrap
680
	fi
681

682
	if [[ ! -d "${PREFIX}" ]] || [[ ${force_rebuild} == 'yes' ]]; then
gsell's avatar
gsell committed
683
		building='yes'
684
 		echo "Building $P/$V ..."
685
		[[ ${dry_run} == yes ]] && die 0 ""
gsell's avatar
gsell committed
686 687
		check_compiler
		prep
688
		cd "${MODULE_SRCDIR}"
gsell's avatar
gsell committed
689
		pmodules.pre_configure
690
		cd "${MODULE_BUILDDIR}"
gsell's avatar
gsell committed
691 692 693 694 695 696
		pmodules.configure
		pmodules.build
		pmodules.install
		pmodules.post_install
		pmodules.install_doc
		post_install
697
		if [[ ${bootstrap} == 'no' ]]; then
gsell's avatar
gsell committed
698 699
			write_runtime_dependencies
			write_build_dependencies
700
		fi
gsell's avatar
gsell committed
701 702
		[[ ${enable_cleanup_build} == yes ]] && pmodules.cleanup_build
		[[ ${enable_cleanup_src} == yes ]] && pmodules.cleanup_src
703
		
gsell's avatar
gsell committed
704
	else
705
 		echo "Not rebuilding $P/$V ..."
gsell's avatar
gsell committed
706
	fi
707
	if [[ ${bootstrap} == 'no' ]]; then
gsell's avatar
gsell committed
708
		if [[ -d "${PMODULES_ROOT}/${PMODULES_MODULEFILES_DIR}" ]]; then
gsell's avatar
gsell committed
709
			set_legacy_link
gsell's avatar
gsell committed
710
		fi
gsell's avatar
gsell committed
711
		set_link
712
	fi
gsell's avatar
gsell committed
713
	return 0
gsell's avatar
gsell committed
714 715
}

716 717 718 719 720 721 722
##############################################################################
#
debug_on='no'
force_rebuild='no'
ENVIRONMENT_ARGS=''
dry_run='no'
bootstrap='no'
gsell's avatar
gsell committed
723 724
enable_cleanup_build='yes'
enable_cleanup_src='no'
725

gsell's avatar
gsell committed
726
pmodules.cleanup_env
727

728 729 730
# array collecting all modules specified on the command line via '--with=module'
with_modules=()

731 732 733 734
if [[ -r "${BUILDSCRIPT_DIR}/with_modules" ]]; then
	with_modules+=( $(cat "${BUILDSCRIPT_DIR}/with_modules") )
fi

735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756
while (( $# > 0 )); do
	case $1 in
	-j )
		JOBS=$2
		shift
		;;
	--jobs=[0-9]* )
		JOBS=${1/--jobs=}
		;;
	-v | --verbose)
		debug_on='yes'
		;;
	-f | --force-rebuild )
		force_rebuild='yes'
		;;
	-b | --bootstrap )
		bootstrap='yes'
		force_rebuild='yes'
		;;
	-? | -h | --help )
		usage
		;;
gsell's avatar
gsell committed
757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772
	--disable-cleanup )
		enable_cleanup_build='no'
		enable_cleanup_src='no'
		;;
	--enable-cleanup-build )
		enable_cleanup_build='yes'
		;;
	--disable-cleanup-build )
		enable_cleanup_build='no'
		;;
	--enable-cleanup-src )
		enable_cleanup_src='yes'
		;;
	--disable-cleanup-src )
		enable_cleanup_src='no'
		;;
773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798
	--dry-run )
		dry_run='yes'
		;;
	--release=* )
		MODULE_RELEASE=${1/--release=}
		;;
	--with=*/* )
		with_modules+=( ${1/--with=} )
		;;
	*=* )
		eval $1
		ENVIRONMENT_ARGS="${ENVIRONMENT_ARGS} $1"
		;;
	* )
		V=$1
		;;
	esac
	shift
done

if [[ ${debug_on} == yes ]]; then
	trap 'echo "$BASH_COMMAND"' DEBUG
fi

# while bootstraping the module command is not yet available
if [[ ${bootstrap} == no ]]; then
gsell's avatar
gsell committed
799
        source	"${PMODULES_ROOT}/${PMODULES_CONFIG_DIR}/profile.bash"
800 801 802 803 804 805 806 807 808 809 810 811 812 813 814
	MODULECMD="${PMODULES_HOME}/bin/modulecmd"
	[[ -x ${MODULECMD} ]] || die 1 "${MODULECMD}: no such executable"
	module use unstable
	module purge
	for m in "${with_modules[@]}"; do
		if module_is_available "$m"; then
			echo "Loading module: ${m}"
			module load "${m}"
		else
			die 44 "$m: module not available!"
		fi
	done
fi

P=$(basename $(dirname "${BUILDSCRIPT}"))
gsell's avatar
gsell committed
815
P=${P%.*}
816 817 818 819 820 821
_P=$(echo $P | tr [:lower:] [:upper:])
_P=${_P//-/_}
_V=${_P}_VERSION

eval "${ENVIRONMENT_ARGS}"

gsell's avatar
gsell committed
822 823
if [[ -n ${PMODULES_DEFINED_RELEASES} ]]; then
        declare -r releases="${PMODULES_DEFINED_RELEASES}"
824 825 826 827 828
else
	# set defaults, if file doesn't exist or isn't readable
	declare -r releases=":unstable:stable:deprecated:"
fi

829 830 831 832 833
# Local Variables:
# mode: sh
# sh-basic-offset: 8
# tab-width: 8
# End: