*** empty log message ***

This commit is contained in:
Dave Goodwin 2004-08-03 10:25:03 +00:00
parent 9e04c554b4
commit 3e7e28b6fb
17 changed files with 146 additions and 76 deletions

View file

@ -393,6 +393,18 @@ extern "C" {
return -10;
}
int DLL_EXPORT th_elementPotentials(int n, int lenm, double* lambda) {
thermo_t* thrm = th(n);
int nel = thrm->nElements();
if (lenm >= nel) {
equilibrate(*thrm, "TP");
thrm->getElementPotentials(lambda);
return 0;
}
else
return -10;
}
int DLL_EXPORT th_setPressure(int n, double p) {
try {
if (p < 0.0) throw CanteraError("th_setPressure",

View file

@ -64,6 +64,7 @@ extern "C" {
double DLL_IMPORT th_cp_mass(int n);
double DLL_IMPORT th_cv_mass(int n);
int DLL_IMPORT th_chemPotentials(int n, int lenm, double* murt);
int DLL_IMPORT th_elementPotentials(int n, int lenm, double* lambda);
int DLL_IMPORT th_getEnthalpies_RT(int n, int lenm, double* h_rt);
int DLL_IMPORT th_getEntropies_R(int n, int lenm, double* s_r);
int DLL_IMPORT th_getCp_R(int n, int lenm, double* cp_r);

View file

@ -10,11 +10,13 @@
SUFFIXES=
SUFFIXES= .cpp .d .o
SUFFIXES= .cpp .d .o .f90 .mod
CXX_FLAGS = @CXXFLAGS@ $(CXX_OPT)
OBJS = fct.o fctxml.o
OBJS = fct.o fctxml.o fctxml_interface.o cantera_xml.o
MODULES = fctxml.mod cantera_xml.mod
DEPENDS = $(OBJS:.o=.d)
@ -24,6 +26,9 @@ FORT_LIBS = @FLIBS@
# the C++ compiler
CXX = @CXX@
# the Fortran 90/95 compiler
F90 = @F90@
# external libraries
EXT_LIBS = @LOCAL_LIBS@
@ -43,14 +48,20 @@ CXX_INCLUDES = -I$(CANTERA_INCDIR)
LCXX_FLAGS = -L$(CANTERA_LIBDIR) @CXXFLAGS@
# how to compile C++ source files to object files
.@CXX_EXT@.@OBJ_EXT@:
%.o : %.cpp
$(CXX) -c $< $(CXX_INCLUDES) $(CXX_FLAGS)
%.o : %.f90
$(F90) -c $< $(FORT_FLAGS)
%.mod : %.f90
$(F90) -c $< $(FORT_FLAGS)
LIB_NAME=libfct.a
FTLIB = @buildlib@/$(LIB_NAME)
lib: $(OBJS) $(LIB_DEPS)
lib: $(MODULES) $(OBJS) $(LIB_DEPS)
$(RM) $(FTLIB)
@ARCHIVE@ $(FTLIB) $(OBJS)
@ -60,6 +71,9 @@ clean:
install:
@INSTALL@ $(FTLIB) @prefix@/lib/cantera
win-install:
@INSTALL@ ../../../lib/clib.lib @prefix@/lib/cantera
%.d:
g++ -MM $(CXX_INCLUDES) $*.cpp > $*.d

View file

@ -1,25 +1,17 @@
// Build as a DLL under Windows
#ifdef WIN32
#define DLL_EXPORT __declspec(dllexport)
#pragma warning(disable:4786)
#pragma warning(disable:4503)
#else
#define DLL_EXPORT
#endif
#include "flib_defs.h"
// Cantera includes
#include "ctml.h"
#include "importCTML.h"
#include "../../clib/src/Cabinet.h"
//#include "Storage.h"
// Values returned for error conditions
#define ERR -999
#define DERR -999.999
Cabinet<XML_Node>* Cabinet<XML_Node>::__storage = 0;
//Cabinet<XML_Node>* Cabinet<XML_Node>::__storage = 0;
inline XML_Node* _xml(const integer* i) {
return Cabinet<XML_Node>::cabinet(false)->item(*i);
@ -41,14 +33,16 @@ extern "C" {
}
int DLL_EXPORT fxml_get_xml_file_(const char* file, ftnlen filelen) {
//try {
try {
XML_Node* x = get_XML_File(string(file, filelen));
int ix = Cabinet<XML_Node>::cabinet(false)->add(x);
cout << "ix = " << ix << endl;
return ix;
//}
//catch (CanteraError) {
//cout << "error...." << endl; return 23; }
}
catch (CanteraError) {
handleError();
return -1;
}
}
int DLL_EXPORT fxml_clear_() {
@ -57,7 +51,7 @@ extern "C" {
close_XML_File("all");
return 0;
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); return -1;}
}
int DLL_EXPORT fxml_del_(const integer* i) {
@ -78,14 +72,14 @@ extern "C" {
return Cabinet<XML_Node>::cabinet(false)->assign(*i,*j);
}
int DLL_EXPORT fxml_preprocess_and_build_(const integer* i,
const char* file, ftnlen filelen) {
try {
get_CTML_Tree(_xml(i), string(file, filelen));
return 0;
}
catch (CanteraError) { return -1; }
}
// int DLL_EXPORT fxml_preprocess_and_build_(const integer* i,
// const char* file, ftnlen filelen) {
// try {
// get_CTML_Tree(_xml(i), string(file, filelen));
// return 0;
// }
// catch (CanteraError) { handleError(); return -1;}
// }
@ -102,7 +96,7 @@ extern "C" {
throw CanteraError("fxml_attrib","node "
" has no attribute '"+ky+"'");
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}
@ -114,7 +108,7 @@ extern "C" {
XML_Node& node = *_xml(i);
node.addAttribute(ky, val);
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}
@ -125,7 +119,7 @@ extern "C" {
XML_Node& node = *_xml(i);
node.addComment(c);
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}
@ -135,7 +129,7 @@ extern "C" {
const string v = node.name();
strncpy(tag, v.c_str(), taglen);
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}
@ -145,7 +139,7 @@ extern "C" {
const string v = node.value();
strncpy(value, v.c_str(), valuelen);
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}
@ -155,7 +149,7 @@ extern "C" {
XML_Node& c = node.child(string(loc, loclen));
return Cabinet<XML_Node>::cabinet()->add(&c);
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}
@ -165,7 +159,7 @@ extern "C" {
XML_Node& c = node.child(*m);
return Cabinet<XML_Node>::cabinet()->add(&c);
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}
@ -179,7 +173,7 @@ extern "C" {
else
throw CanteraError("fxml_find_id","id not found: "+string(id, idlen));
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}
@ -194,7 +188,7 @@ extern "C" {
throw CanteraError("fxml_findByName","name "+string(nm, nmlen)
+" not found");
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}
@ -203,7 +197,8 @@ extern "C" {
XML_Node& node = *_xml(i);
return node.nChildren();
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}
int DLL_EXPORT fxml_addchild_(const integer* i, const char* name,
@ -214,7 +209,7 @@ extern "C" {
string(value,valuelen));
return Cabinet<XML_Node>::cabinet()->add(&c);
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}
@ -225,7 +220,7 @@ extern "C" {
XML_Node& c = node.addChild(chld);
return Cabinet<XML_Node>::cabinet()->add(&c);
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}
@ -243,7 +238,7 @@ extern "C" {
}
return 0;
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}
@ -268,7 +263,7 @@ extern "C" {
}
//n = nv;
}
catch (CanteraError) { return -1; }
catch (CanteraError) { handleError(); }
return 0;
}

View file

@ -288,4 +288,21 @@ class Phase:
return Numeric.asarray(fs)
else:
return f
def selectElements(self, f, elements):
"""Given an array 'f' of floating-point element properties,
return a Numeric array of those values corresponding to elements
listed in 'elements'.
>>> f = ph.elementPotentials()
>>> lam_o, lam_h = ph.selectElements(f, ['O', 'H'])
"""
if elements:
fs = []
k = 0
for s in elements:
k = self.elementIndex(s)
fs.append(f[k])
return Numeric.asarray(fs)
else:
return f

View file

@ -130,6 +130,18 @@ class ThermoPhase(Phase):
underlying kernel thermo manager."""
mu = _cantera.thermo_getarray(self._phase_id,20)
return self.selectSpecies(mu, species)
def elementPotentials(self, elements = []):
"""Element potentials of the elements.
This method returns an array containing the element potentials
[J/kmol]. The element potentials are only defined for
equilibrium states. This method first sets the composition to
a state of equilibrium holding T and P constant, then computes
the element potentials for this equilibrium state. """
lamb = _cantera.thermo_getarray(self._phase_id,21)
return self.selectElements(lamb, elements)
def enthalpies_RT(self, species = []):
"""Pure species non-dimensional enthalpies.

View file

@ -7,6 +7,8 @@ except:
libs = []
platform = sys.platform
flibs = '@FLIBS@'
bllibstr = "@BLAS_LAPACK_LIBS@"
bllibs = bllibstr.replace('-l',' ')
bllist = bllibs.split()

View file

@ -186,16 +186,22 @@ thermo_getarray(PyObject *self, PyObject *args)
return NULL;
int nsp = th_nSpecies(th);
int nel = phase_nElements(th);
int xlen = (job == 21 ? nel : nsp);
// array attributes
int iok = -22;
PyArrayObject* x =
(PyArrayObject*)PyArray_FromDims(1, &nsp, PyArray_DOUBLE);
(PyArrayObject*)PyArray_FromDims(1, &xlen, PyArray_DOUBLE);
double* xd = (double*)x->data;
switch (job) {
case 20:
iok = th_chemPotentials(th,nsp,xd);
break;
case 21:
iok = th_elementPotentials(th,nel,xd);
break;
case 23:
iok = th_getEnthalpies_RT(th,nsp,xd);
break;

View file

@ -161,14 +161,9 @@ matlab:
ifeq ($(build_matlab),1)
cd Cantera/matlab; @MAKE@
else
@echo 'NOT installing the Matlab toolbox'
@echo 'NOT building the Matlab toolbox'
endif
#win-matlab:
#ifeq ($(build_matlab),1)
# cd Cantera/matlab; @MAKE@ win
#endif
matlab-install:
ifeq ($(build_matlab),1)
cd Cantera/matlab; @MAKE@ install
@ -200,11 +195,13 @@ finish-install:
chown -R @username@ @ct_demodir@/f77
ifeq ($(os_is_win),0)
# if not a 'compact' installation, then add some symbolic links for convenience.
ifeq ($(compact_install),0)
rm -fR @prefix@/cantera/demos
rm -fR @prefix@/cantera/data
rm -fR @prefix@/cantera/templates
rm -fR @prefix@/cantera/tutorials
ifeq ($(compact_install),0)
ln -s @ct_demodir@ @prefix@/cantera/demos
ln -s @ct_datadir@ @prefix@/cantera/data
ln -s @ct_templdir@ @prefix@/cantera/templates
@ -220,11 +217,6 @@ else
@INSTALL@ @buildbin@/* @ct_bindir@
endif
#@INSTALL@ bin/ctmkmf @ct_bindir@/ctnew
#@INSTALL@ bin/cxx_examples @ct_demodir@/c++
example_codes:
(cd examples/cxx; @MAKE@)
(cd Cantera/cxx; @MAKE@)
@ -272,6 +264,7 @@ endif
changes:
cvs2cl.pl --prune
cvs commit -m' ' ChangeLog
export: changes
@INSTALL@ -d $(export_dir)

View file

@ -70,4 +70,7 @@ typedef int ftnlen; // Fortran hidden string length type
#undef INCL_PURE_FLUIDS
//--------------------- compile options ----------------------------
#undef USE_PCH
#endif

15
config/configure vendored
View file

@ -271,7 +271,7 @@ PACKAGE_STRING=
PACKAGE_BUGREPORT=
ac_unique_file="Cantera.README"
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CVF_LIBDIR local_inst local_python_inst python_prefix ctversion homedir ct_libdir ct_incdir ct_incroot ct_bindir ct_datadir ct_demodir ct_templdir ct_mandir ct_tutdir ct_docdir ct_dir COMPACT_INSTALL CANTERA_LIBDIR CANTERA_INCDIR CT_TOOLS_BIN CANTERA_BINDIR CANTERA_EXAMPLES_DIR CANTERA_DATADIR build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os username ctroot buildinc buildlib buildbin MAKE ARCHIVE DO_RANLIB RANLIB SOEXT SHARED PIC LCXX_FLAGS LCXX_END_LIBS USERDIR INCL_USER_CODE KERNEL BUILD_CK LIB_DIR build_lapack build_blas BLAS_LAPACK_LIBS BLAS_LAPACK_DIR LOCAL_LIB_DIRS LOCAL_LIBS CANTERA_PARTICLES_DIR BUILD_PARTICLES CT_SHARED_LIB BUILD_F90 PYTHON_CMD WIN_PYTHON_CMD BUILD_PYTHON MATLAB_CMD BUILD_MATLAB BUILD_CLIB export_name INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT CC CFLAGS ac_ct_CC F77 FFLAGS ac_ct_F77 FLIBS precompile_headers CXX_DEPENDS OS_IS_DARWIN OS_IS_WIN OS_IS_CYGWIN SHARED_CTLIB mex_ext F77_EXT CXX_EXT OBJ_EXT EXE_EXT local_math_libs math_libs SO LDSHARED LIBOBJS LTLIBOBJS'
ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CVF_LIBDIR local_inst local_python_inst python_prefix ctversion homedir ct_libdir ct_incdir ct_incroot ct_bindir ct_datadir ct_demodir ct_templdir ct_mandir ct_tutdir ct_docdir ct_dir COMPACT_INSTALL CANTERA_LIBDIR CANTERA_INCDIR CT_TOOLS_BIN CANTERA_BINDIR CANTERA_EXAMPLES_DIR CANTERA_DATADIR build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os username ctroot buildinc buildlib buildbin MAKE ARCHIVE DO_RANLIB RANLIB SOEXT SHARED PIC LCXX_FLAGS LCXX_END_LIBS USERDIR INCL_USER_CODE KERNEL BUILD_CK LIB_DIR build_lapack build_blas BLAS_LAPACK_LIBS BLAS_LAPACK_DIR LOCAL_LIB_DIRS LOCAL_LIBS CANTERA_PARTICLES_DIR BUILD_PARTICLES CT_SHARED_LIB BUILD_F90 F90 F77FLAGS PYTHON_CMD WIN_PYTHON_CMD BUILD_PYTHON MATLAB_CMD BUILD_MATLAB BUILD_CLIB export_name INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT CC CFLAGS ac_ct_CC F77 FFLAGS ac_ct_F77 FLIBS precompile_headers CXX_DEPENDS OS_IS_DARWIN OS_IS_WIN OS_IS_CYGWIN SHARED_CTLIB mex_ext F77_EXT CXX_EXT OBJ_EXT EXE_EXT local_math_libs math_libs SO LDSHARED LIBOBJS LTLIBOBJS'
ac_subst_files=''
# Initialize some variables set by options.
@ -1781,6 +1781,7 @@ fi
BUILD_CLIB=1
#
# Python Interface
@ -3263,6 +3264,10 @@ if test -n "$GCC"; then
msg=`rm -f *h.gch; $CXX testpch.h &> /dev/null`
if test -f testpch.h.gch; then
precompile_headers=yes
cat >>confdefs.h <<\_ACEOF
#define USE_PCH 1
_ACEOF
fi
fi
echo "$as_me:$LINENO: result: ${precompile_headers}" >&5
@ -3385,7 +3390,7 @@ fi
# Provide some information about the compiler.
echo "$as_me:3388:" \
echo "$as_me:3393:" \
"checking for Fortran 77 compiler version" >&5
ac_compiler=`set X $ac_compile; echo $2`
{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
@ -3562,7 +3567,7 @@ _ACEOF
# flags.
ac_save_FFLAGS=$FFLAGS
FFLAGS="$FFLAGS $ac_verb"
(eval echo $as_me:3565: \"$ac_link\") >&5
(eval echo $as_me:3570: \"$ac_link\") >&5
ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | grep -v 'Driving:'`
echo "$ac_f77_v_output" >&5
FFLAGS=$ac_save_FFLAGS
@ -3642,7 +3647,7 @@ _ACEOF
# flags.
ac_save_FFLAGS=$FFLAGS
FFLAGS="$FFLAGS $ac_cv_prog_f77_v"
(eval echo $as_me:3645: \"$ac_link\") >&5
(eval echo $as_me:3650: \"$ac_link\") >&5
ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | grep -v 'Driving:'`
echo "$ac_f77_v_output" >&5
FFLAGS=$ac_save_FFLAGS
@ -4576,6 +4581,8 @@ s,@CANTERA_PARTICLES_DIR@,$CANTERA_PARTICLES_DIR,;t t
s,@BUILD_PARTICLES@,$BUILD_PARTICLES,;t t
s,@CT_SHARED_LIB@,$CT_SHARED_LIB,;t t
s,@BUILD_F90@,$BUILD_F90,;t t
s,@F90@,$F90,;t t
s,@F77FLAGS@,$F77FLAGS,;t t
s,@PYTHON_CMD@,$PYTHON_CMD,;t t
s,@WIN_PYTHON_CMD@,$WIN_PYTHON_CMD,;t t
s,@BUILD_PYTHON@,$BUILD_PYTHON,;t t

View file

@ -439,7 +439,8 @@ if test "$BUILD_F90_INTERFACE" != "n"; then
BUILD_F90=1
fi
AC_SUBST(BUILD_F90)
AC_SUBST(F90)
AC_SUBST(F77FLAGS)
BUILD_CLIB=1
#
@ -528,6 +529,7 @@ if test -n "$GCC"; then
msg=`rm -f *h.gch; $CXX testpch.h &> /dev/null`
if test -f testpch.h.gch; then
precompile_headers=yes
AC_DEFINE(USE_PCH)
fi
fi
AC_MSG_RESULT(${precompile_headers})

8
configure vendored
View file

@ -247,11 +247,16 @@ SHARED=${SHARED:="-shared"}
# the Fortran 77 and Fortran 90 compilers. You only need a Fortran 90
# compiler if you are building the Fortran 90 interface.
F77=${F77:=g77}
F90=${F90:=f90}
F90=${F90:=f95}
# Fortran compiler flags
FFLAGS=${FFLAGS:='-O2'}
# additional flags required to compile fixed-format F77 procedures
# in the 'ext' directory
#F77FLAGS=${F77FLAGS:='-w -dusty -fixed -save'}
# the additional Fortran flags required for linking, if any
#LFORT_FLAGS="-lF77 -lFI77"
@ -335,6 +340,7 @@ export F77_EXT
export F90
export F90_EXT
export FFLAGS
export F77FLAGS
export LAPACK_NAMES
export LCXX_FLAGS
export LCXX_END_LIBS

View file

@ -7,7 +7,7 @@ BLASLIB = @buildlib@/libctblas.a
SUFFIXES=
SUFFIXES= .f .o
F_FLAGS = @FFLAGS@ $(F77_FLAGS)
F_FLAGS = @FFLAGS@ @F77FLAGS@
OBJS = \
dasum.o \
@ -46,11 +46,12 @@ dtrmv.o \
dtrsm.o \
dtrsv.o \
dzasum.o \
dznrm2.o \
idamax.o \
lsame.o \
xerbla.o
# dznrm2.o \
#SRCS = $(OBJS:.o=.cpp)
@ -58,8 +59,8 @@ xerbla.o
$(BLASLIB): $(OBJS)
@ARCHIVE@ $(BLASLIB) $(OBJS) > /dev/null
.f.o:
@F77@ -c $< $(F77_INCLUDES) $(F_FLAGS)
%.o : %.f
@F77@ -c $< $(F_FLAGS)
clean:
$(RM) $(OBJS) $(BLASLIB)

View file

@ -7,7 +7,7 @@ LAPACKLIB = @buildlib@/libctlapack.a
SUFFIXES=
SUFFIXES= .f .o
F_FLAGS = @FFLAGS@ $(F77_FLAGS)
F_FLAGS = @FFLAGS@ @F77FLAGS@
OBJS = \
dbdsqr.o \
@ -69,7 +69,7 @@ all: $(LAPACKLIB)
$(LAPACKLIB): $(OBJS)
@ARCHIVE@ $(LAPACKLIB) $(OBJS) > /dev/null
.f.o:
%.o : %.f
@F77@ -c $< $(F77_INCLUDES) $(F_FLAGS)

View file

@ -10,7 +10,7 @@ LIB = @buildlib@/libctmath.a
SUFFIXES=
SUFFIXES= .f .d .o
F_FLAGS = @FFLAGS@ $(F77_FLAGS)
F_FLAGS = @FFLAGS@ @F77FLAGS@
OBJS = \
mach.o \
@ -40,10 +40,10 @@ SRCS = $(OBJS:.o=.cpp)
$(LIB): $(OBJS)
@ARCHIVE@ $(LIB) $(OBJS) > /dev/null
.cpp.o:
%.o : %.cpp
@CXX@ -c $< @DEFS@ @CXXFLAGS@ $(INCLUDES)
.f.o:
%.o : %.f
@F77@ -c $< $(F_FLAGS)
clean:

View file

@ -7,10 +7,9 @@ LIB = @buildlib@/librecipes.a
SUFFIXES=
SUFFIXES= .f .d .o
F_FLAGS = @FFLAGS@ $(F77_FLAGS)
F_FLAGS = @FFLAGS@ @F77FLAGS@
OBJS = simp1.o simp2.o simp3.o simplx.o
#splie2.o splin2.o spline.o splint.o
SRCS = $(OBJS:.o=.cpp)
@ -19,8 +18,8 @@ all: $(LIB)
$(LIB): $(OBJS)
@ARCHIVE@ $(LIB) $(OBJS) > /dev/null
.f.o:
@F77@ -c $< $(F77_INCLUDES) $(F_FLAGS)
%.o : %.f
@F77@ -c $< $(F_FLAGS)
clean:
$(RM) $(OBJS) $(LIB)