Index: math/libflame/Makefile =================================================================== --- math/libflame/Makefile +++ math/libflame/Makefile @@ -2,170 +2,53 @@ # $FreeBSD$ PORTNAME= libflame -DISTVERSION= r7421 -PORTREVISION= 7 +DISTVERSION= 1.0-g20180606 CATEGORIES= math -MASTER_SITES= http://www.cs.utexas.edu/users/%SUBDIR%/:1,2 LOCAL/bf:3 -MASTER_SITE_SUBDIR= flame/snapshots/:1 field/docs/:2 -DISTFILES= ${DISTNAME}${EXTRACT_SUFX}:3 libflame.pdf:3 -EXTRACT_ONLY= ${DISTNAME}${EXTRACT_SUFX} -MAINTAINER= ports@FreeBSD.org +MAINTAINER= jmd@FreeBSD.org COMMENT= FLAME dense linear algebra library -LICENSE= LGPL21 +LICENSE= BSD3CLAUSE +ONLY_FOR_ARCHS= amd64 +ONLY_FOR_ARCHS_REASON_amd64= for now only supported on amd64 due to build issues + BUILD_DEPENDS= bash:shells/bash GNU_CONFIGURE= yes -USE_CSTD= c99 USES= gmake +USE_CSTD= c99 -CONFIGURE_ARGS= --enable-dynamic-build --enable-static-build +USE_GITHUB= yes +GH_ACCOUNT= flame +GH_PROJECT= libflame +GH_TAGNAME= f4e27a7 -OPTIONS_DEFINE= BLAS3_CNTL BUILTIN_BLAS CBLAS EXTERNAL_LAPACK GOTOBLAS \ - LAPACK2FLAME LAPACK_SUBPROBLEMS OPENMP SHARED STATIC \ - SUPERMATRIX THREADS DOCS EXAMPLES -OPTIONS_DEFAULT= BLAS3_CNTL LAPACK2FLAME SHARED SUPERMATRIX THREADS -BLAS3_CNTL_DESC= Set Level-3 BLAS variant and blocksize -BUILTIN_BLAS_DESC= Build the (suboptimal) internal BLAS -CBLAS_DESC= Build an interface to an external C BLAS -EXTERNAL_LAPACK_DESC= Build an interface to an external LAPACK -GOTOBLAS_DESC= Build a full GotoBLAS interface -LAPACK2FLAME_DESC= Build a LAPACK compatibility layer -LAPACK_SUBPROBLEMS_DESC= Use an external LAPACK for subproblems -OPENMP_DESC= Use multithreading via OpenMP -SHARED_DESC= Build a shared library and PIC archive -STATIC_DESC= Build a non-PIC archive -SUPERMATRIX_DESC= Task scheduling and parallel execution +OPTIONS_RADIO= PARALLELIZATION +OPTIONS_RADIO_PARALLELIZATION= NONE THREADS OPENMP +OPTIONS_DEFAULT= THREADS +NONE_DESC= serial libflame +THREADS_DESC= pthread based parallelization +OPENMP_DESC= OpenMP based parallelization .include -.if ${PORT_OPTIONS:MBLAS3_CNTL} -CONFIGURE_ARGS+= --enable-blas3-front-end-cntl-trees -.else -CONFIGURE_ARGS+= --disable-blas3-front-end-cntl-trees -.endif +# enable dynamic build always +CONFIGURE_ARGS= --enable-dynamic-build +# our shell is also prone to the argument list too long bug +CONFIGURE_ARGS+= --enable-max-arg-list-hack +# use libflame as a LAPACK +CONFIGURE_ARGS+= --enable-lapack2flame +# add our CFLAGS to theirs +CONFIGURE_ARGS+= --with-extra-cflags="${CFLAGS}" -.if ${PORT_OPTIONS:MBUILTIN_BLAS} -IGNORE= : BUILTIN_BLAS is an experimental option, for testing purposes only -.if ${PORT_OPTIONS:MCBLAS} || ${PORT_OPTIONS:MGOTOBLAS} -IGNORE= : BUILTIN_BLAS is incompatible with CBLAS and GOTOBLAS -.endif -CONFIGURE_ARGS+= --enable-builtin-blas -.else -CONFIGURE_ARGS+= --disable-builtin-blas -.endif - -.if ${PORT_OPTIONS:MCBLAS} -IGNORE= : CBLAS yields an incomplete library, and is for testing purposes only -.if ${PORT_OPTIONS:MGOTOBLAS} -IGNORE= : CBLAS is incompatible with GOTOBLAS -.endif -CONFIGURE_ARGS+= --enable-cblas-interfaces -.else -CONFIGURE_ARGS+= --disable-cblas-interfaces -.endif - -.if ${PORT_OPTIONS:MEXTERNAL_LAPACK} -CONFIGURE_ARGS+= --enable-external-lapack-interfaces -.else -CONFIGURE_ARGS+= --disable-external-lapack-interfaces -.endif - -.if ${PORT_OPTIONS:MGOTOBLAS} -CONFIGURE_ARGS+= --enable-goto-interfaces -WITH_BLAS= gotoblas -.else -CONFIGURE_ARGS+= --disable-goto-interfaces .for b in M K N .if defined(${b}_BLOCKSIZE) CONFIGURE_ARGS+= --enable-default-${b:tl}-blocksize=${${b}_BLOCKSIZE} .endif .endfor -.endif -.if ${PORT_OPTIONS:MLAPACK2FLAME} -.if ${PORT_OPTIONS:MLAPACK_SUBPROBLEMS} -IGNORE= : LAPACK2FLAME is incompatible with LAPACK_SUBPROBLEMS -.endif -CONFIGURE_ARGS+= --enable-lapack2flame -.else -CONFIGURE_ARGS+= --disable-lapack2flame -.endif - -.if ${PORT_OPTIONS:MLAPACK_SUBPROBLEMS} -.if ! ${PORT_OPTIONS:MEXTERNAL_LAPACK} -IGNORE= : LAPACK_SUBPROBLEMS requires EXTERNAL_LAPACK -.endif -CONFIGURE_ARGS+= --enable-external-lapack-for-subproblems -.else -CONFIGURE_ARGS+= --disable-external-lapack-for-subproblems -.endif - -.if ${PORT_OPTIONS:MEXTERNAL_LAPACK} || ! ${PORT_OPTIONS:MBUILTIN_BLAS} -.if ${PORT_OPTIONS:MCBLAS} -.if exists(${LOCALBASE}/lib/libatlas.so) -WITH_BLAS?= atlas_c -.else -WITH_BLAS?= reference_c -.endif -.if !(${WITH_BLAS} == "atlas_c" || ${WITH_BLAS} == "reference_c") -IGNORE= : CBLAS is incompatible with WITH_BLAS = ${WITH_BLAS} -.endif -.elif exists(${LOCALBASE}/lib/libgoto2.so) -WITH_BLAS?= gotoblas -.elif exists(${LOCALBASE}/lib/libatlas.so) -WITH_BLAS?= atlas -.else -WITH_BLAS?= reference -.endif #WITH_CBLAS -.endif #WITH_EXTERNAL_LAPACK or WITH_BUILTIN_BLAS - -.if ! ${PORT_OPTIONS:MBUILTIN_BLAS} -.if ${WITH_BLAS} == atlas -LIB_DEPENDS+= libatlas.so:math/atlas -BLAS= -lptf77blas -.elif ${WITH_BLAS} == atlas_c -LIB_DEPENDS+= libatlas.so:math/atlas -BLAS= -lptcblas -.elif ${WITH_BLAS} == gotoblas -LIB_DEPENDS+= libgoto2p:math/gotoblas -BLAS= -lgoto2p -.elif ${WITH_BLAS} == reference -LIB_DEPENDS+= libblas.so:math/blas -BLAS= -lblas -.elif ${WITH_BLAS} == reference_c -LIB_DEPENDS+= libgslcblas.so:math/gsl -BLAS= -lgslcblas -.endif #WITH_BLAS -.endif #WITH_BUILTIN_BLAS - -.if ${PORT_OPTIONS:MEXTERNAL_LAPACK} -.if !empty(WITH_BLAS:Matlas*) -.if ${PORT_OPTIONS:MBUILTIN_BLAS} -LIB_DEPENDS+= libatlas.so:math/atlas -.endif -LAPACK= -lalapack -lptcblas -lptf77blas -.elif ${WITH_BLAS} == gotoblas -.if ${PORT_OPTIONS:MBUILTIN_BLAS} -LIB_DEPENDS+= libgoto2p:math/gotoblas -.endif -LAPACK= -lgoto2p -.elif !empty(WITH_BLAS:Mreference*) -LIB_DEPENDS+= liblapack.so:math/lapack -LAPACK= -llapack -.if ${PORT_OPTIONS:MBUILTIN_BLAS} || ${PORT_OPTIONS:MCBLAS} -LIB_DEPENDS+= libblas.so:math/blas -LAPACK+= -lblas -.endif -.endif #WITH_BLAS -.endif #WITH_EXTERNAL_LAPACK - .if ${PORT_OPTIONS:MOPENMP} -.if ${PORT_OPTIONS:MTHREADS} -IGNORE= OPENMP is incompatible with THREADS -.endif .if !empty(CC:M*clang*) IGNORE= clang does not support OPENMP, use THREADS instead .endif @@ -175,162 +58,27 @@ CONFIGURE_ARGS+= --enable-multithreading=openmp .elif ${PORT_OPTIONS:MTHREADS} CONFIGURE_ARGS+= --enable-multithreading=pthreads -.else +.elif ${PORT_OPTIONS:MNONE} CONFIGURE_ARGS+= --enable-multithreading=no .endif -.if ${PORT_OPTIONS:MSHARED} USE_LDCONFIG= yes -.endif -.for o in SHARED STATIC -.if ${PORT_OPTIONS:M${o}} -PLIST_SUB+= ${o}="" -.else -PLIST_SUB+= ${o}="@comment " -.endif -.endfor - -.if ${PORT_OPTIONS:MSUPERMATRIX} CONFIGURE_ARGS+= --enable-supermatrix -.else -CONFIGURE_ARGS+= --disable-supermatrix -.endif .if !(defined(USE_GCC) || !empty(CC:M*gcc4*)) CONFIGURE_ARGS+= --disable-autodetect-f77-ldflags \ --disable-autodetect-f77-name-mangling .endif -.if !empty(MACHINE_CPU:Msse3) -CFLAGS+= -msse3 -LDFLAGS+= -msse3 -CONFIGURE_ARGS+= --enable-vector-intrinsics=sse -.else -CONFIGURE_ARGS+= --enable-vector-intrinsics=none -.endif +CONFIGURE_ARGS+= --disable-ldim-alignment -.if ${ARCH} == "sparc64" -PICFLAG?= -fPIC -.else -PICFLAG?= -fpic +.if ${OPSYS} == FreeBSD && ${OSVERSION} < 1200060 +IGNORE= requires a newer linker such as lld .endif -CFLAGS+= ${PICFLAG} -LDFLAGS+= ${PICFLAG} -Wl,-x -.if defined(MEMORY_ALIGNMENT) -CONFIGURE_ARGS+= --enable-memory-alignment=${MEMORY_ALIGNMENT} -.if defined(LDIM_ALIGNMENT) -CONFIGURE_ARGS+= --enable-ldim-alignment -.endif -.endif +post-install: + @${MKDIR} ${STAGEDIR}${PREFIX}/include/libflame + @${CP} ${WRKSRC}/include_local/* ${STAGEDIR}/${PREFIX}/include/libflame/ -.if ${PORT_OPTIONS:MDOCS} -PORTDOCS= libflame.pdf -.endif - -.if ${PORT_OPTIONS:MEXAMPLES} -PORTEXAMPLES= * -.endif - -SHLIB_MAJOR?= 0 - -post-patch: - @${FIND} ${WRKSRC} -type f \( -name '*.sh' -o -name '*.sh.in' \) | \ - ${XARGS} ${REINPLACE_CMD} -E \ - -e 's@(#!)(/bin/bash)@\1${LOCALBASE}\2@' - @${FIND} ${WRKSRC} -type f \( -name 'makefile' -o -name 'config.mk.in' \) | \ - ${XARGS} ${REINPLACE_CMD} \ - -e 's@-fPIC@${PICFLAG}@g' - @${REINPLACE_CMD} \ - -e '\@MK_INCL_DIR_INST_W_ARCH_VERS[[:blank:]]*:=@ \ - s@-$$(ARCH_VERS)@/libflame@' \ - -e '\@MK_FLAMEC_...S_INST_W_ARCH_VERS[[:blank:]]*:=@ \ - {N; s@-$$(ARCH_VERS)@@; s@\.so@&.${SHLIB_MAJOR}@2;}' \ - -e '\@^$$(MK_INCL_DIR_INST):@,\@^endif@d' \ - -e '\@^$$(INSTALL_PREFIX)/lib/%\.a:@,\@^endif@d' \ - -e 's@^\($$(INSTALL_PREFIX)/lib/%\)\(-$$(ARCH_VERS)\)\(\.a:\)@\1\3@' \ - -e '\@^$$(INSTALL_PREFIX)/lib/%.*\.so:@ \ - s@\(-$$(ARCH_VERS)\)\(\.so\)@\2.${SHLIB_MAJOR}@' \ - ${WRKSRC}/Makefile - @${REINPLACE_CMD} -e 's@gcc)@cc|gcc*)@g' \ - ${WRKSRC}/configure - @${REINPLACE_CMD} \ - -e '\@FLA_LIB_PATH[[:blank:]]*:=@ \ - s@$$(INSTALL_PREFIX)/lib@../lib/$$(HOST)@' \ - -e '\@FLA_INC_PATH[[:blank:]]*:=@ \ - s@$$(INSTALL_PREFIX)@${WRKDIR}@' \ - -e '\@HOST[[:blank:]]*:=@ \ - s@sh $$(BUILD_DIRPATH)/ac-utils/config.guess@cat ../config.sys_type@' \ - ${WRKSRC}/test/Makefile - -pre-configure: - @${FIND} ${WRKSRC} -type f \( -name '*.bak' -o -name '*.fbsd10bak' \ - -o -name '*.orig' \) -delete - -post-configure: -.if ${PORT_OPTIONS:MSTATIC} - @${CP} -af ${WRKSRC} ${WRKSRC}_STATIC - @${REINPLACE_CMD} -e 's@${PICFLAG}@@' \ - -e '\@FLA_ENABLE_DYNAMIC_BUILD[[:blank:]]*:=@s@yes@no@' \ - ${WRKSRC}_STATIC/config/*/config.mk -.endif -.if ${PORT_OPTIONS:MSHARED} - @${REINPLACE_CMD} \ - -e '\@MK_FLAMEC_LIBS_INST.*[[:blank:]]*:=@ \ - {N; s@$$(INSTALL_PREFIX)/lib/%@&_pic@;}' \ - -e '\@^$$(INSTALL_PREFIX)/lib/%\.a:@s@%@&_pic@1' \ - ${WRKSRC}/Makefile -.endif - -do-build: -.for o in SHARED STATIC -.if ${PORT_OPTIONS:M${o}} - @${PRINTF} "\n\n\n===> Building ${o:tl} library:\n\n\n\n" - @cd ${WRKSRC}${o:S|^|_|:M*STATIC}; ${SETENV} ${MAKE_ENV} ${MAKE_CMD} \ - ${_MAKE_JOBS} ${MAKE_ARGS} libs -.endif -.endfor - -do-install: - @cd ${WRKSRC}; ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${_MAKE_JOBS} \ - ${MAKE_ARGS} install-headers -.if ${PORT_OPTIONS:MSHARED} - @cd ${WRKSRC}/lib; ${STRIP_CMD} */libflame.so - @cd ${WRKSRC}; ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${_MAKE_JOBS} \ - ${MAKE_ARGS} install-libs install-lib-symlinks -.endif -.if ${PORT_OPTIONS:MSTATIC} - @cd ${WRKSRC}_STATIC; ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${_MAKE_JOBS} \ - ${MAKE_ARGS} install-libs -.endif -.if ${PORT_OPTIONS:MDOCS} - @${MKDIR} ${STAGEDIR}${DOCSDIR} - @${INSTALL_DATA} ${DISTDIR}/${DIST_SUBDIR}/${PORTDOCS} ${STAGEDIR}${DOCSDIR} -.endif -.if ${PORT_OPTIONS:MEXAMPLES} - @${MKDIR} ${STAGEDIR}${EXAMPLESDIR} - @cd ${WRKSRC}/examples; ${COPYTREE_SHARE} \* ${STAGEDIR}${EXAMPLESDIR} -.endif - -.if defined(MAINTAINER_MODE) -BUILD_DEPENDS += ${RUN_DEPENDS} -CONFIGURE_ARGS+= --enable-verbose-make-output - -check regression-test test: build - @cd ${WRKSRC}; ${SETENV} ${MAKE_ENV} ${MAKE_CMD} ${_MAKE_JOBS} \ - ${MAKE_ARGS} MK_INCL_DIR_INST_W_ARCH_VERS="${WRKDIR}/include" \ - install-headers -.for o in SHARED STATIC -.if ${PORT_OPTIONS:M${o}} - @${PRINTF} "\n\n\n===> Testing ${o:tl} library:\n\n\n\n" - @cd ${WRKSRC}${o:S|^|_|:M*STATIC}/test; ${SETENV} ${MAKE_ENV} \ - ${MAKE_CMD} ${_MAKE_JOBS} ${MAKE_ARGS} \ - LIBBLAS="-L${LOCALBASE}/lib ${BLAS} -lm" \ - LIBLAPACK="-L${LOCALBASE}/lib ${LAPACK}" test_libflame ; \ - ./test_libflame.x -.endif -.endfor - -.endif #MAINTAINER_MODE .include Index: math/libflame/distinfo =================================================================== --- math/libflame/distinfo +++ math/libflame/distinfo @@ -1,4 +1,3 @@ -SHA256 (libflame-r7421.tar.gz) = 5c42ffe69f40fb46aa9bcf289a3d124700f31cfa231587207c568dd0274e01bb -SIZE (libflame-r7421.tar.gz) = 3953831 -SHA256 (libflame.pdf) = 8f628171d4778144a7732bacf4dfa3dc35098b9f4238c29dc8bc9b3b05e8718f -SIZE (libflame.pdf) = 1290721 +TIMESTAMP = 1528342205 +SHA256 (flame-libflame-1.0-g20180606-f4e27a7_GH0.tar.gz) = 1290c116d7c35662fdf586af420dd6d1ea026f7ff196a5456a63d431650e3723 +SIZE (flame-libflame-1.0-g20180606-f4e27a7_GH0.tar.gz) = 19154057 Index: math/libflame/files/patch-Makefile.diff =================================================================== --- math/libflame/files/patch-Makefile.diff +++ math/libflame/files/patch-Makefile.diff @@ -0,0 +1,162 @@ +--- Makefile.orig 2018-06-02 13:26:25.000000000 -0400 ++++ Makefile 2018-06-06 22:23:38.079036000 -0400 +@@ -79,7 +79,7 @@ + # Construct the architecture-version string, which will be used to name the + # libraries upon installation. + VERSION := $(shell cat version) +-ARCH_VERS := $(ARCH)-$(VERSION) ++ARCH_VERS := + + # --- Library names --- + ALL_FLAMEC_LIB_NAME := libflame.a +@@ -117,25 +117,25 @@ + # --- Define install target names for static libraries --- + MK_FLAMEC_LIBS := $(MK_ALL_FLAMEC_LIB) + MK_FLAMEC_LIBS_INST := $(patsubst $(BASE_LIB_DIR)/%.a, \ +- $(INSTALL_PREFIX)/lib/%.a, \ ++ $(STAGEDIR)$(INSTALL_PREFIX)/lib/%.a, \ + $(MK_FLAMEC_LIBS)) + MK_FLAMEC_LIBS_INST_W_ARCH_VERS := $(patsubst $(BASE_LIB_DIR)/%.a, \ +- $(INSTALL_PREFIX)/lib/%-$(ARCH_VERS).a, \ ++ $(STAGEDIR)$(INSTALL_PREFIX)/lib/%.a, \ + $(MK_FLAMEC_LIBS)) + #MK_FLAMEC_LIBS_INST_W_ARCH_ONLY := $(patsubst $(BASE_LIB_DIR)/%.a, \ +-# $(INSTALL_PREFIX)/lib/%-$(ARCH).a, \ ++# $(STAGEDIR)$(INSTALL_PREFIX)/lib/%.a, \ + # $(MK_FLAMEC_LIBS)) + + # --- Define install target names for dynamic libraries --- + MK_FLAMEC_DLLS := $(MK_ALL_FLAMEC_DLL) + MK_FLAMEC_DLLS_INST := $(patsubst $(BASE_LIB_DIR)/%.so, \ +- $(INSTALL_PREFIX)/lib/%.so, \ ++ $(STAGEDIR)$(INSTALL_PREFIX)/lib/%.so, \ + $(MK_FLAMEC_DLLS)) + MK_FLAMEC_DLLS_INST_W_ARCH_VERS := $(patsubst $(BASE_LIB_DIR)/%.so, \ +- $(INSTALL_PREFIX)/lib/%-$(ARCH_VERS).so, \ ++ $(STAGEDIR)$(INSTALL_PREFIX)/lib/%.so, \ + $(MK_FLAMEC_DLLS)) + #MK_FLAMEC_DLLS_INST_W_ARCH_ONLY := $(patsubst $(BASE_LIB_DIR)/%.so, \ +-# $(INSTALL_PREFIX)/lib/%-$(ARCH).so, \ ++# $(STAGEDIR)$(INSTALL_PREFIX)/lib/%-$(ARCH).so, \ + # $(MK_FLAMEC_DLLS)) + + # --- Determine which libraries to build --- +@@ -159,9 +159,9 @@ + endif + + # --- Set the include directory names --- +-MK_INCL_DIR_INST := $(INSTALL_PREFIX)/include +-MK_INCL_DIR_INST_W_ARCH_VERS := $(INSTALL_PREFIX)/include-$(ARCH_VERS) +-#MK_INCL_DIR_INST_W_ARCH_ONLY := $(INSTALL_PREFIX)/include-$(ARCH) ++MK_INCL_DIR_INST := $(STAGEDIR)$(INSTALL_PREFIX)/include ++MK_INCL_DIR_INST_W_ARCH_VERS := $(STAGEDIR)$(INSTALL_PREFIX)/include ++#MK_INCL_DIR_INST_W_ARCH_ONLY := $(STAGEDIR)$(INSTALL_PREFIX)/include-$(ARCH) + + + +@@ -452,22 +452,22 @@ + @$(INSTALL) -m 0644 $(MK_HEADER_FILES) $(@) + endif + +-$(INSTALL_PREFIX)/lib/%-$(ARCH_VERS).a: $(BASE_LIB_DIR)/%.a ++$(STAGEDIR)$(INSTALL_PREFIX)/lib/%.a: $(BASE_LIB_DIR)/%.a + ifeq ($(FLA_ENABLE_VERBOSE_MAKE_OUTPUT),yes) + $(INSTALL) -m 0755 -d $(@D) + $(INSTALL) -m 0644 $< $@ + else +- @echo "Installing $(@F) into $(INSTALL_PREFIX)/lib/" ++ @echo "Installing $(@F) into $(STAGEDIR)$(INSTALL_PREFIX)/lib/" + @$(INSTALL) -m 0755 -d $(@D) + @$(INSTALL) -m 0644 $< $@ + endif + +-$(INSTALL_PREFIX)/lib/%-$(ARCH_VERS).so: $(BASE_LIB_DIR)/%.so ++$(STAGEDIR)$(INSTALL_PREFIX)/lib/%.so: $(BASE_LIB_DIR)/%.so + ifeq ($(FLA_ENABLE_VERBOSE_MAKE_OUTPUT),yes) + $(INSTALL) -m 0755 -d $(@D) + $(INSTALL) -m 0644 $< $@ + else +- @echo "Installing $(@F) into $(INSTALL_PREFIX)/lib/" ++ @echo "Installing $(@F) into $(STAGEDIR)$(INSTALL_PREFIX)/lib/" + @$(INSTALL) -m 0755 -d $(@D) + @$(INSTALL) -m 0644 $< $@ + endif +@@ -475,30 +475,30 @@ + + + # --- Install-symlinks rules --- +-install-lib-symlinks: check-config $(MK_LIBS_INST) ++#install-lib-symlinks: check-config $(MK_LIBS_INST) ++# ++#install-header-symlinks: check-config $(MK_INCL_DIR_INST) ++# ++#$(MK_INCL_DIR_INST): $(MK_INCL_DIR_INST_W_ARCH_VERS) ++#ifeq ($(FLA_ENABLE_VERBOSE_MAKE_OUTPUT),yes) ++# $(SYMLINK) $(