how to set/unset env variables in spec file
arnaud gaboury
arnaud.gaboury at gmail.com
Tue Sep 8 12:11:20 UTC 2015
On Tue, Sep 8, 2015 at 1:15 PM, Jan Chaloupka <jchaloup at redhat.com> wrote:
> Hi Arnaud,
>
> I am assuming all scripts you are referring to are sourced and run in %build
> section. Can you be more specific which commands are you running? %build
> section is interpreted as a bash script so source and unset should work.
> Without the concrete example it is hard to guess what is going wrong.
These are the two scripts I have to run:
---------------------------------------------
% cat /opt/intel/compilers_and_libraries_2016.0.109/linux/mkl/bin/mklvars.sh
#!/bin/sh
#
# Copyright (C) 2003-2015 Intel Corporation. All rights reserved.
#
# The information and source code contained herein is the exclusive property
# of Intel Corporation and may not be disclosed, examined, or reproduced in
# whole or in part without explicit written authorization from the Company.
#
mkl_help() {
echo ""
echo "Syntax:"
echo " source $SCRIPT_NAME <arch> [MKL_interface] [${MOD_NAME}]"
echo ""
echo " <arch> must be one of the following"
echo " ia32 : Setup for IA-32 architecture"
echo " intel64 : Setup for Intel(R) 64 architecture"
echo " mic : Setup for Intel(R) Many Integrated
Core Architecture"
echo ""
echo " ${MOD_NAME} (optional) - set path to MKL F95 modules"
echo ""
echo " MKL_interface (optional) - MKL programming interface for intel64"
echo " Not applicable without ${MOD_NAME}"
echo " lp64 : 4 bytes integer (default)"
echo " ilp64 : 8 bytes integer"
echo ""
}
set_mkl_env() {
CPRO_PATH=/opt/intel/compilers_and_libraries_2016.0.109/linux
export MKLROOT=${CPRO_PATH}/mkl
typeset SCRIPT_NAME=$0
typeset MOD_NAME=mod
typeset MKL_LP64_ILP64=
typeset MKL_MOD=
typeset MKL_TARGET_ARCH=
typeset MKLVARS_VERBOSE=
typeset MKL_MIC_ARCH=
typeset MKL_BAD_SWITCH=
typeset OLD_LD_LIBRARY_PATH=
typeset OLD_LIBRARY_PATH=
typeset OLD_MIC_LD_LIBRARY_PATH=
typeset OLD_NLSPATH=
typeset OLD_CPATH=
if [ -z "$1" ] ; then
mkl_help
else
while [ -n "$1" ]; do
if [ "$1" = "ia32" ] ; then MKL_TARGET_ARCH=ia32;
elif [ "$1" = "intel64" ] ; then
MKL_TARGET_ARCH=intel64; MKL_MIC_ARCH=mic;
elif [ "$1" = "mic" ] ; then MKL_TARGET_ARCH=mic;
MKL_MIC_ARCH=mic;
elif [ "$1" = "lp64" ] ; then MKL_LP64_ILP64=lp64;
elif [ "$1" = "ilp64" ] ; then MKL_LP64_ILP64=ilp64;
elif [ "$1" = "${MOD_NAME}" ] ; then MKL_MOD=${MOD_NAME};
elif [ "$1" = "verbose" ] ; then MKLVARS_VERBOSE=verbose;
else
MKL_BAD_SWITCH=$1
break 10
fi
shift;
done
if [ -n "${MKL_BAD_SWITCH}" ] ; then
echo
echo "ERROR: Unknown option '${MKL_BAD_SWITCH}'"
mkl_help
else
if [ -z "${MKL_TARGET_ARCH}" ] ; then
echo
echo "ERROR: architecture is not defined. Accepted
values: ia32, intel64, mic"
mkl_help
else
typeset
mkl_ld_arch="${CPRO_PATH}/compiler/lib/${MKL_TARGET_ARCH}:${MKLROOT}/lib/${MKL_TARGET_ARCH}"
typeset
mkl_ld_intel64="${CPRO_PATH}/compiler/lib/intel64:${MKLROOT}/lib/intel64"
typeset
mkl_ld_mic="${CPRO_PATH}/compiler/lib/${MKL_MIC_ARCH}:${MKLROOT}/lib/${MKL_MIC_ARCH}"
if [ -z "${TBBROOT}" ]; then
typeset mkl_tbb_subdir="/gcc4.4"
if [ "${MKL_TARGET_ARCH}" = "mic" ]; then
mkl_tbb_subdir=""; fi
typeset
mkl_ld_arch="${CPRO_PATH}/tbb/lib/${MKL_TARGET_ARCH}${mkl_tbb_subdir}:${mkl_ld_arch}"
typeset
mkl_ld_intel64="${CPRO_PATH}/tbb/lib/intel64/gcc4.4:${mkl_ld_intel64}"
typeset
mkl_ld_mic="${CPRO_PATH}/tbb/lib/${MKL_MIC_ARCH}:${mkl_ld_mic}"
fi
if [ -n "${LD_LIBRARY_PATH}" ] ; then
OLD_LD_LIBRARY_PATH=":${LD_LIBRARY_PATH}"; fi
export LD_LIBRARY_PATH="${mkl_ld_arch}${OLD_LD_LIBRARY_PATH}"
if [ -n "${MKL_MIC_ARCH}" ]; then
if [ "${MKL_TARGET_ARCH}" = "mic" ] ; then
export
LD_LIBRARY_PATH="${mkl_ld_intel64}:${LD_LIBRARY_PATH}"
fi
if [ -d "/opt/intel/mic" ]; then
export
LD_LIBRARY_PATH="/opt/intel/mic/coi/host-linux-release/lib:/opt/intel/mic/myo/lib:${LD_LIBRARY_PATH}"
fi
fi
if [ -n "${LIBRARY_PATH}" ] ; then
OLD_LIBRARY_PATH=":${LIBRARY_PATH}"; fi
if [ "${MKL_TARGET_ARCH}" = "mic" ] ; then
export LIBRARY_PATH="${mkl_ld_inte64}${OLD_LIBRARY_PATH}"
else
export LIBRARY_PATH="${mkl_ld_arch}${OLD_LIBRARY_PATH}"
fi
if [ -n "${MKL_MIC_ARCH}" ]; then
if [ -n "${MIC_LD_LIBRARY_PATH}" ]; then
OLD_MIC_LD_LIBRARY_PATH=":${MIC_LD_LIBRARY_PATH}"; fi
export
MIC_LD_LIBRARY_PATH="${mkl_ld_mic}${OLD_MIC_LD_LIBRARY_PATH}"
if [ -d "/opt/intel/mic" ]; then
export
MIC_LD_LIBRARY_PATH="/opt/intel/mic/coi/device-linux-release/lib:/opt/intel/mic/myo/lib:${MIC_LD_LIBRARY_PATH}"
fi
fi
if [ -n "${NLSPATH}" ] ; then OLD_NLSPATH=":${NLSPATH}"; fi
export
NLSPATH="${MKLROOT}/lib/${MKL_TARGET_ARCH}/locale/%l_%t/%N${OLD_NLSPATH}"
if [ "${MKL_TARGET_ARCH}" = "mic" ] ; then
export
NLSPATH="${MKLROOT}/lib/intel64/locale/%l_%t/%N:${NLSPATH}"
fi
if [ -z "${MANPATH}" ] ; then
export MANPATH="${CPRO_PATH}/man/en_US:`manpath`"
else
export MANPATH="${CPRO_PATH}/man/en_US:${MANPATH}"
fi
if [ -n "$CPATH" ] ; then OLD_CPATH=":${CPATH}"; fi
export CPATH="${MKLROOT}/include${OLD_CPATH}"
if [ "${MKL_MOD}" = "${MOD_NAME}" ] ; then
if [ "${MKL_TARGET_ARCH}" = "ia32" ] ; then
MKL_LP64_ILP64=
else
if [ -z "$MKL_LP64_ILP64" ] ; then
MKL_LP64_ILP64=lp64
fi
fi
export
CPATH="${CPATH}:${MKLROOT}/include/${MKL_TARGET_ARCH}/${MKL_LP64_ILP64}"
if [ "${MKL_TARGET_ARCH}" = "mic" ] ; then
export
CPATH="${CPATH}:${MKLROOT}/include/intel64/${MKL_LP64_ILP64}"
fi
fi
if [ "${MKLVARS_VERBOSE}" = "verbose" ] ; then
echo LD_LIBRARY_PATH=${LD_LIBRARY_PATH}
echo LIBRARY_PATH=${LIBRARY_PATH}
echo MIC_LD_LIBRARY_PATH=${MIC_LD_LIBRARY_PATH}
echo NLSPATH=${NLSPATH}
echo MANPATH=${MANPATH}
echo CPATH=${CPATH}
fi
fi
fi
fi
}
set_mkl_env "$@"
------------------------------------------------------------------------------
% cat /opt/intel/bin/compilervars.sh
#!/bin/sh
#
# Copyright (C) 1985-2015 Intel Corporation. All rights reserved.
#
# The information and source code contained herein is the exclusive property
# of Intel Corporation and may not be disclosed, examined, or reproduced in
# whole or in part without explicit written authorization from the Company.
#
PROD_DIR="/opt/intel/compilers_and_libraries_2016.0.109/linux"
TARGET_ARCH=
TARGET_PLATFORM=linux
if [ -e $PROD_DIR/bin/intel64/icl_fbsd.cfg ]; then
TARGET_ARCH=intel64
TARGET_PLATFORM=freebsd
fi
COMPILERVARS_ARGV=$#
if [ $# -eq 0 ]; then
if [ "$COMPILERVARS_ARCHITECTURE" != '' ]; then
TARGET_ARCH=$COMPILERVARS_ARCHITECTURE
fi
if [ "$COMPILERVARS_PLATFORM" != '' ]; then
TARGET_PLATFORM=$COMPILERVARS_PLATFORM
fi
fi
while [ $# -gt 0 ]
do
opt="$1"
case $opt in
-arch)
shift
TARGET_ARCH="$1"
shift
;;
-platform)
shift
TARGET_PLATFORM="$1"
shift
;;
*)
TARGET_ARCH="$1"
shift
;;
esac
done
if [ ! -e $PROD_DIR/bin/intel64/icl_fbsd.cfg ] && \
[ "$TARGET_ARCH" != "ia32" -a "$TARGET_ARCH" != "intel64" -o \
"$TARGET_PLATFORM" != "android" -a "$TARGET_PLATFORM" != "linux"
-a "$TARGET_PLATFORM" != "mac" ]; then
echo "compilervars.sh <arch> [-arch <arch>] [-platform <platform>]"
echo ""
echo " <arch> must be one of the following:"
echo " ia32 : Set up for IA-32 target."
echo " intel64 : Set up for Intel(R)64 target."
echo " <platform> must be of the following:"
echo " linux : Set to Linux target."
echo " mac : Set to Mac target."
echo " android : Set to Android target."
echo ""
echo "If the arguments to the sourced script are ignored (consult docs"
echo "for your shell) the alternative way to specify target is environment"
echo "variables COMPILERVARS_ARCHITECTURE to pass <arch> to the script"
echo "and COMPILERVARS_PLATFORM to pass <platform>"
return 1
elif [ -e $PROD_DIR/bin/intel64/icl_fbsd.cfg ] && \
[ "$TARGET_ARCH" != "intel64" -o \
"$TARGET_PLATFORM" != "freebsd" ]; then
echo "compilervars.sh <arch> [-arch <arch>] [-platform <platform>]"
echo ""
echo " <arch> must be one of the following:"
echo " intel64 : Set up for Intel(R)64 target."
echo " <platform> must be of the following:"
echo " freebsd : Set to FreeBSD target."
echo ""
echo "If the arguments to the sourced script are ignored (consult docs"
echo "for your shell) the alternative way to specify target is environment"
echo "variables COMPILERVARS_ARCHITECTURE to pass <arch> to the script"
echo "and COMPILERVARS_PLATFORM to pass <platform>"
return 1
fi
if [ "$TARGET_PLATFORM" = "mac" ]; then
TARGET_PLATFORM="linux"
fi
if [ $COMPILERVARS_ARGV -eq 0 ] ; then
#pass default values via COMPILERVARS_*
if [ "$COMPILERVARS_ARCHITECTURE" = '' ]; then
COMPILERVARS_ARCHITECTURE=$TARGET_ARCH
fi
if [ "$COMPILERVARS_PLATFORM" = '' ]; then
COMPILERVARS_PLATFORM=$TARGET_PLATFORM
fi
TARGET_ARCH=
TARGET_PLATFORM=
fi
if [ -e $PROD_DIR/daal/bin/daalvars.sh ]; then
. $PROD_DIR/daal/bin/daalvars.sh $TARGET_ARCH
fi
if [ -e $PROD_DIR/../../debugger_2016/bin/debuggervars.sh ]; then
. $PROD_DIR/../../debugger_2016/bin/debuggervars.sh $TARGET_ARCH
fi
if [ -e $PROD_DIR/tbb/bin/tbbvars.sh ]; then
. $PROD_DIR/tbb/bin/tbbvars.sh $TARGET_ARCH
fi
if [ -e $PROD_DIR/mkl/bin/mklvars.sh ]; then
. $PROD_DIR/mkl/bin/mklvars.sh $TARGET_ARCH
fi
if [ -e $PROD_DIR/ipp/bin/ippvars.sh ]; then
. $PROD_DIR/ipp/bin/ippvars.sh $TARGET_ARCH $TARGET_PLATFORM
fi
if [ -e $PROD_DIR/pkg_bin/compilervars_arch.sh ]; then
. $PROD_DIR/pkg_bin/compilervars_arch.sh $TARGET_ARCH $TARGET_PLATFORM
fi
----------------------------------------------------------
Here is what I did under the %build section in my spec file:
unset R_HOME
source /opt/intel/compilers_and_libraries_2016/linux/mkl/bin/mklvars.sh intel64
source /opt/intel/bin/compilervars.sh intel64
----------------------------------------
% rpmlint SPECS/R.spec
SPECS/R.spec:436: W: macro-in-comment %endif
SPECS/R.spec:458: W: macro-in-comment %endif
SPECS/R.spec:602: W: macro-in-comment %{_libdir}
SPECS/R.spec:608: W: macro-in-comment %lang
SPECS/R.spec:608: W: macro-in-comment %{_libdir}
SPECS/R.spec:828: W: macro-in-comment %{_libdir}
SPECS/R.spec:842: W: macro-in-comment %{_includedir}
SPECS/R.spec:895: W: macro-in-comment %__cat
SPECS/R.spec:895: W: macro-in-comment %{_libdir}
SPECS/R.spec:895: W: macro-in-comment %{_docdir}
SPECS/R.spec:895: W: macro-in-comment %{version}
SPECS/R.spec:897: W: macro-in-comment %{_libdir}
SPECS/R.spec:897: W: macro-in-comment %{_docdir}
SPECS/R.spec:897: W: macro-in-comment %{version}
SPECS/R.spec:900: W: macro-in-comment %__cat
SPECS/R.spec:900: W: macro-in-comment %{_datadir}
SPECS/R.spec:900: W: macro-in-comment %{_docdir}
SPECS/R.spec:900: W: macro-in-comment %{version}
SPECS/R.spec:902: W: macro-in-comment %{_docdir}
SPECS/R.spec:902: W: macro-in-comment %{version}
0 packages and 1 specfiles checked; 0 errors, 20 warnings.
-------------------------------------------------
% rpmbuild -ba SPECS/R.spec
................
make[2]: Entering directory '/home/poisonivy/rpmbuild/BUILD/R-3.2.1/src/unix'
icc -std=c99 -I. -I../../src/include -I../../src/include
-I/usr/local/include -DHAVE_CONFIG_H -fpic -ip -O3
-opt-mem-layout-trans=3 -xHost -mavx -fp-model precise -wd188
-DMKL_ILP64 -qopenmp -parallel
-I/opt/intel/compilers_and_libraries_2016.0.109/linux/mkl/include
-L/opt/intel/compilers_and_libraries_2016.0.109/linux/compiler/lib/intel64
-DR_HOME='"/usr/lib64/R"' \
-o Rscript ./Rscript.c
make[2]: icc: Command not found
..................................
This error does not appear if I run mannually the source of the two
scripts. What puzzles me is that this buid error arrises late in the
make process, and I am surprised the error did not appear much before
as everything is built with Intel Compiler (icc).
As for the unset of R_HOME, it did the trick indeed!
More about my config:
-----------------------------------------------------------------------------------
% cat BUILD/R-3.2.1/CONFIGURE.log | grep -A30 'R is now'
755:R is now configured for x86_64-redhat-linux-gnu
756-
757- Source directory: .
758- Installation directory: /usr
759-
760- C compiler: icc -std=c99 -ip -O3
-opt-mem-layout-trans=3 -xHost -mavx -fp-model precise -wd188
-DMKL_ILP64 -qopenmp -parallel
-I/opt/intel/compilers_and_libraries_2016.0.109/linux/mkl/include
761- Fortran 77 compiler: ifort -ip -O3
-opt-mem-layout-trans=3 -xHost -mavx -fp-model precise -DMKL_ILP64
-qopenmp -parallel
-I/opt/intel/compilers_and_libraries_2016.0.109/linux/mkl/include
762-
763- C++ compiler: icpc -ip -O3 -opt-mem-layout-trans=3
-xHost -mavx -fp-model precise -DMKL_ILP64 -qopenmp-parallel
-I/opt/intel/compilers_and_libraries_2016.0.109/linux/mkl/include
764- C++ 11 compiler: icpc -std=c++11 -ip -O3
-opt-mem-layout-trans=3 -xHost -mavx -fp-model precise -DMKL_ILP64
-qopenmp-parallel
-I/opt/intel/compilers_and_libraries_2016.0.109/linux/mkl/include
765- Fortran 90/95 compiler: ifort -ip -O3 -opt-mem-layout-trans=3
-xHost -mavx -fp-model precise -DMKL_ILP64 -qopenmp -parallel
-I/opt/intel/compilers_and_libraries_2016.0.109/linux/mkl/include
766- Obj-C compiler: gcc -g -O2 -fobjc-exceptions
---------------------------------------------------------------------------------------
( %configure \
%if %{system_tre}
--with-system-tre \
%endif
--with-system-zlib --with-system-bzlib --with-system-pcre \
--with-system-valgrind-headers \
--with-lapack \
--with-blas="$MKL" \
%endif
--with-tcl-config=%{_libdir}/tclConfig.sh \
--with-tk-config=%{_libdir}/tkConfig.sh \
--enable-R-shlib \
--enable-memory-profiling \
--enable-BLAS-shlib \
--enable-prebuilt-html \
------------------------------------------------------
I have a warning too at the begining of the build. No idea where this
option comes from:
configure: WARNING: unrecognized options: --disable-dependency-tracking
Hope these info can help to debug.
>
> Jan
>
> On 09/08/2015 01:07 PM, arnaud gaboury wrote:
>>
>> I am building a rpm package. For make to success and have the correct
>> env variables, I need to source a few scripts and unset a few
>> variables.
>> rpmbuild does not understand the source and unset commands.
>>
>> How shall I proceed to get the desired variables?
>>
>> Thank you
>>
>
> --
> devel mailing list
> devel at lists.fedoraproject.org
> https://admin.fedoraproject.org/mailman/listinfo/devel
> Fedora Code of Conduct: http://fedoraproject.org/code-of-conduct
--
google.com/+arnaudgabourygabx
More information about the devel
mailing list