libpmodules.bash 20 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
##############################################################################
#
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
function usage() {
	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 107 108 109 110 111 112 113 114
##############################################################################
#
# test whether a module is loaded or not
#
# $1: module name
#
em.is_loaded() {
        [[ :${LOADEDMODULES}: =~ :$1: ]]
}

115 116
function em.set_release() {
	is_release "$1" || die 1 "$P: unknown release type: $1"
117
	[[ "$1" == "deprecated" ]] && die 0 "$P: is deprecated, we don't rebuild it."
118
	MODULE_RELEASE="$1"
gsell's avatar
gsell committed
119 120
}

121 122 123
function em.supported_os() {
	for os in "$@"; do
		[[ ${os} == ${OS} ]] && return 0
gsell's avatar
gsell committed
124
	done
125
	die 0 "${P}: Not available for ${OS}."
gsell's avatar
gsell committed
126 127
}

gsell's avatar
gsell committed
128
function em.add_to_group() {
gsell's avatar
gsell committed
129
	if [[ -z ${1} ]]; then
gsell's avatar
gsell committed
130
		die 42 "${FUNCNAME}: Missing group argument."
gsell's avatar
gsell committed
131
	fi
gsell's avatar
gsell committed
132 133
	if [[ ! -d ${PMODULES_ROOT}/${PMODULES_TEMPLATES_DIR}/${1} ]]; then
		die 43 "${1}: group does not exist."
gsell's avatar
gsell committed
134
	fi
gsell's avatar
gsell committed
135 136 137 138 139
	MODULE_GROUP=$1
}

em.add_to_family() {
	em.add_to_group "$@"
gsell's avatar
gsell committed
140 141
}

142
function em.set_build_dependencies() {
143
	MODULE_BUILD_DEPENDENCIES=("$@")
144 145
}

gsell's avatar
gsell committed
146
function em.set_runtime_dependencies() {
147
	MODULE_DEPENDENCIES=("$@")
gsell's avatar
gsell committed
148 149
}

gsell's avatar
gsell committed
150
function em.set_supported_compilers() {
151
	MODULE_SUPPORTED_COMPILERS=("$@")
gsell's avatar
gsell committed
152 153 154
}

function em.set_docfiles() {
155
	MODULE_DOCFILES=("$@")
gsell's avatar
gsell committed
156 157
}

158
function module_is_available() {
159
	[[ -n $("${MODULECMD}" bash avail "$1" 2>&1 1>/dev/null) ]]
160 161
}

162
function _load_build_dependencies() {
163
	for m in "${MODULE_BUILD_DEPENDENCIES[@]}"; do
164 165
		[[ -z $m ]] && continue
		if [[ ! $m =~ "*/*" ]]; then
gsell's avatar
gsell committed
166 167 168 169
			local _V=$(echo -n $m | tr [:lower:] [:upper:] )_VERSION
			if [[ -n ${!_V} ]]; then
		    		m=$m/${!_V}
			else
gsell's avatar
gsell committed
170
				echo "$m: warning: No version set, loading default ..."
gsell's avatar
gsell committed
171
			fi
172
		fi
173
		em.is_loaded "$m" && continue
174 175
		if ! module_is_available "$m"; then
		        debug "${m}: module not available"
gsell's avatar
gsell committed
176
			local rels=( ${releases//:/ } )
177 178 179 180 181
			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."
182 183
				fi
			done
184 185 186
			[[ ${dry_run} == yes ]] && {
				die 1 "${m}: module does not exist, cannot continue with dry run..."
				}
187 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

			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
215
			"${BUILD_SCRIPTSDIR}"/*/"${m/\/*}/build" ${args[@]}
216
			if [[ -z $(module avail "$m" 2>&1) ]]; then
gsell's avatar
gsell committed
217
				die 1 "$m: oops: build failed..."
218 219
			fi
		fi
gsell's avatar
gsell committed
220 221
		# :FIXME: this doesn't work any more!
		local modulepath_root="${PMODULES_ROOT}/${PMODULES_MODULEFILES_DIR}"
222 223
		local tmp=$( module display "${m}" 2>&1 | grep -m1 -- "${modulepath_root}" )
		tmp=${tmp/${modulepath_root}\/}
224 225 226
		tmp=${tmp%%/*}
		local _family=( ${tmp//./ } )
		if [[ ${_family[1]} == deprecated ]]; then
227 228
			# set module release to 'deprecated' if a build dependency
			# is deprecated
229
			DEPEND_RELEASE='deprecated'
230
		elif [[ ${_family[1]} == unstable ]] && [[ -z ${DEPEND_RELEASE} ]]; then
231 232
			# set module release to 'unstable' if a build dependency is
			# unstable and release not yet set
233
			DEPEND_RELEASE='unstable'
234
		fi
gsell's avatar
gsell committed
235 236

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

242 243 244 245 246 247
if [[ ${bootstrap} == yes ]]; then
    function _load_build_dependencies() {
	    :
    }
fi

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

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

278 279 280 281 282
##############################################################################
# 
# cleanup environment
#
em.cleanup_env() {
283

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

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

##############################################################################
#
# load default versions
#
 _setup_env1() {
	local varname=''
304 305 306 307
	while read _name _version; do
		[[ -z ${_name} ]] && continue
		[[ -z ${_version} ]] && continue
		[[ "${_name:0:1}" == '#' ]] && continue
308 309 310 311 312
		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
313 314 315 316
	done < "${BUILD_VERSIONSFILE}"

}

gsell's avatar
gsell committed
317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
#
# find tarball 
# $1: download directory
# $2: name without version
# $3: version
#
function find_tarball() {
	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
}

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

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

357 358
	# this allows us to specify the version as PKGNAME_VERSION=1.2.3 on
	# the cmd-line
gsell's avatar
gsell committed
359 360 361 362 363 364 365 366
        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
367
	MODULE_SRCDIR="${BUILD_TMPDIR}/src/${P/_serial}-$V"
368
	MODULE_BUILDDIR="${BUILD_TMPDIR}/build/$P-$V"
gsell's avatar
gsell committed
369 370

	# build module name
371 372
	# :FIXME: the MODULE_PREFIX should be derived from MODULE_NAME
	# :FIXME: this should be read from a configuration file
gsell's avatar
gsell committed
373
	case ${MODULE_GROUP} in
374 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
		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}"
			;;
417 418 419 420 421 422 423 424 425 426 427
		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}"
			;;
428 429 430 431 432 433
		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
434
			MODULE_NAME+="hdf5_serial/${HDF5_SERIAL_VERSION}/"
435 436 437
			MODULE_NAME+="${P}/${V}"
			;;
		* )
gsell's avatar
gsell committed
438
			die 1 "$P: oops: unknown group: ${MODULE_GROUP}"
439
			;;
gsell's avatar
gsell committed
440 441
	esac

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

445 446
	# get module release if already installed
	local saved_modulepath=${MODULEPATH}
447 448 449
	rels=( ${releases//:/ } )
	for rel in "${rels[@]}"; do
		eval $("${MODULECMD}" bash unuse ${rel})
450
	done
451 452 453
	for rel in "${rels[@]}"; do
		eval $("${MODULECMD}" bash use ${rel})
		if module_is_available "${P}/${V}"; then
454
			cur_module_release=${rel}
455
			info "${P}/${V}: already available and released as \"${rel}\""
456 457 458 459 460 461 462 463 464 465
			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
466 467 468 469
	if [[ "${depend_release}" == 'deprecated' ]] || \
		[[ "${cur_module_release}" == 'deprecated' ]] \
		|| [[ "${MODULE_RELEASE}" == 'deprecated' ]]; then
		MODULE_RELEASE='deprecated'
470 471 472 473 474
		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
475 476
	#   - an unstable release of the module exists and the release is
	#     changed to stable on the command line
477 478 479 480
	elif [[ "${depend_release}" == 'stable' ]] \
		|| [[ "${cur_module_release}" == 'stable' ]] \
		|| [[ "${MODULE_RELEASE}" == 'stable' ]]; then
		MODULE_RELEASE='stable'
481 482 483 484
		info "${P}/${V}: will be released as \"stable\""
	#
	# release is unstable
	#   - if a build-dependency is unstable or 
485 486
	#   - if the module does not exists and no other release-type is
	#     given on the command line
487 488
	#   - and all the cases I didn't think of
	else
489
		MODULE_RELEASE='unstable'
490 491
		info "${P}/${V}: will be released as \"unstable\""
	fi
492 493

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

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

gsell's avatar
gsell committed
499 500
}

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

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

511 512
	# oops, we need a version
	if [[ -z $V ]]; then
513
		die 1 "$P: Missing version."
514 515 516
	fi
	MODULE_SRCDIR="${BUILD_TMPDIR}/src/${P/_serial}-$V"
	MODULE_BUILDDIR="${BUILD_TMPDIR}/build/$P-$V"
gsell's avatar
gsell committed
517
	MODULE_GROUP='Tools'
518 519
	MODULE_NAME="Pmodules/${PMODULES_VERSION}"
	# set PREFIX of module
gsell's avatar
gsell committed
520
	PREFIX="${PMODULES_ROOT}/${MODULE_GROUP}/${MODULE_NAME}"
521 522 523 524 525 526 527 528
	
	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
529 530
	find_tarball "${BUILD_DOWNLOADSDIR}" "${P/_serial}" "${V}"

531 532 533 534 535 536 537 538 539
	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"
}
540

541
function _prep() {
gsell's avatar
gsell committed
542 543

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

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

}

function em.pre_configure() {
	:
}

function em.configure() {
559
	${MODULE_SRCDIR}/configure \
gsell's avatar
gsell committed
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
		--prefix="${PREFIX}"
}

function em.build() {
	make -j${JOBS}
}

function em.install() {
	make install
}

function em.post_install() {
	:
}

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

gsell's avatar
gsell committed
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600
function _set_legacy_link() {
	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
601
function _set_link() {
gsell's avatar
gsell committed
602
	local -r link_name="${PMODULES_ROOT}/${MODULE_GROUP}/${PMODULES_MODULEFILES_DIR}/${MODULE_NAME}"
603 604 605 606 607 608 609 610
	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
611
		    IFS='/' x=( ${dir_name/${PMODULES_ROOT}\/${MODULE_GROUP}\/} )
612
		    local n=${#x[@]}
gsell's avatar
gsell committed
613
		    local -r _target="../"$(eval printf "../%.s" {1..${n}})${PMODULES_TEMPLATES_DIR##*/}/"${MODULE_GROUP}/${P}/modulefile"
614 615
		    ln -fs "${_target}" "${MODULE_NAME##*/}"
	    )
616
	fi
617 618
	info "${MODULE_NAME}: set release to '${MODULE_RELEASE}'"
	echo "${MODULE_RELEASE}" > "${release_file}"
gsell's avatar
gsell committed
619 620
}

621
function em.cleanup_build() {
622 623 624 625 626 627 628 629
	[[ -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
630 631
}

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

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

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

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

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

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

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

725 726
em.cleanup_env

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

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

734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755
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
756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771
	--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'
		;;
772 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
	--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
798
        source	"${PMODULES_ROOT}/${PMODULES_CONFIG_DIR}/profile.bash"
799 800 801 802 803 804 805 806 807 808 809 810 811 812 813
	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
814
P=${P%.*}
815 816 817 818 819 820
_P=$(echo $P | tr [:lower:] [:upper:])
_P=${_P//-/_}
_V=${_P}_VERSION

eval "${ENVIRONMENT_ARGS}"

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

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