diff --git a/CHANGELOG.md b/CHANGELOG.md index e18c817e..0480c96c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,32 @@ ## 3.7.0 (Upcoming) ### Major changes: ### Minor changes: +* Removed cli callback vector functions. Set COMPAT_COMPAT_CLIV if you need to keep these functions in clixon_custom.h. + * Replace functions as follows in CLI SPEC files: + * cli_setv --> cli_set + * cli_mergev --> cli_merge + * cli_delv --> cli_del + * cli_debug_cliv --> cli_debug_cli + * cli_debug_backendv --> cli_debug_backend + * cli_set_modev --> cli_set_mode + * cli_start_shellv --> cli_start_shell + * cli_quitv --> cli_quit + * cli_commitv --> cli_commit + * cli_validatev --> cli_validate + * compare_dbsv --> compare_dbs + * load_config_filev --> load_config_file + * save_config_filev --> save_config_file + * delete_allv --> delete_all + * discard_changesv --> discard_changes + * cli_notifyv --> cli_notify + * show_yangv --> show_yang + * show_confv_xpath --> show_conf_xpath + +* Added --enable-debug. * Added cligen variable translation. * See FAQ and example ### Corrected Bugs -* Fixed JSON unbalanced braces resultin assert. +* Fixed JSON unbalanced braces resulting in assert. ## 3.6.1 (29 May 2018) @@ -460,7 +482,7 @@ If you submit "nopresence" without a leaf, it will automatically be removed: Instead use the rpc calls in clixon_proto_client.[ch] In clients (eg cli/netconf) replace xmldb_get() in client code with clicon_rpc_get_config(). - pIf you use the vector arguments of xmldb_get(), replace as follows: + If you use the vector arguments of xmldb_get(), replace as follows: xmldb_get(h, db, api_path, &xt, &xvec, &xlen); with clicon_rpc_get_config(h, dbstr, api_path, &xt); diff --git a/apps/cli/cli_common.c b/apps/cli/cli_common.c index a80c722d..c0a18f4c 100644 --- a/apps/cli/cli_common.c +++ b/apps/cli/cli_common.c @@ -184,7 +184,7 @@ cli_signal_flush(clicon_handle h) cli_signal_block (h); } -/*! Modify xml database from a callback using xml key format strings +/*! Modify xml datastore from a callback using xml key format strings * @param[in] h Clicon handle * @param[in] cvv Vector of cli string and instantiated variables * @param[in] argv Vector. First element xml key format string, eg "/aaa/%s" @@ -283,8 +283,15 @@ cli_dbxml(clicon_handle h, return retval; } +/*! Set datastore xml entry + * @param[in] h Clicon handle + * @param[in] cvv Vector of cli string and instantiated variables + * @param[in] argv Vector. First element xml key format string, eg "/aaa/%s" + */ int -cli_set(clicon_handle h, cvec *cvv, cvec *argv) +cli_set(clicon_handle h, + cvec *cvv, + cvec *argv) { int retval = 1; @@ -294,13 +301,16 @@ cli_set(clicon_handle h, cvec *cvv, cvec *argv) done: return retval; } -int cli_setv(clicon_handle h, cvec *vars, cvec *argv) -{ - return cli_set(h, vars, argv); -} +/*! Merge datastore xml entry + * @param[in] h Clicon handle + * @param[in] cvv Vector of cli string and instantiated variables + * @param[in] argv Vector. First element xml key format string, eg "/aaa/%s" + */ int -cli_merge(clicon_handle h, cvec *cvv, cvec *argv) +cli_merge(clicon_handle h, + cvec *cvv, + cvec *argv) { int retval = -1; @@ -310,13 +320,16 @@ cli_merge(clicon_handle h, cvec *cvv, cvec *argv) done: return retval; } -int cli_mergev(clicon_handle h, cvec *vars, cvec *argv) -{ - return cli_merge(h, vars, argv); -} +/*! Create datastore xml entry + * @param[in] h Clicon handle + * @param[in] cvv Vector of cli string and instantiated variables + * @param[in] argv Vector. First element xml key format string, eg "/aaa/%s" + */ int -cli_create(clicon_handle h, cvec *cvv, cvec *argv) +cli_create(clicon_handle h, + cvec *cvv, + cvec *argv) { int retval = -1; @@ -326,11 +339,16 @@ cli_create(clicon_handle h, cvec *cvv, cvec *argv) done: return retval; } -/*! +/*! Remove datastore xml entry + * @param[in] h Clicon handle + * @param[in] cvv Vector of cli string and instantiated variables + * @param[in] argv Vector. First element xml key format string, eg "/aaa/%s" * @see cli_del */ int -cli_remove(clicon_handle h, cvec *cvv, cvec *argv) +cli_remove(clicon_handle h, + cvec *cvv, + cvec *argv) { int retval = -1; @@ -341,8 +359,15 @@ cli_remove(clicon_handle h, cvec *cvv, cvec *argv) return retval; } +/*! Delete datastore xml + * @param[in] h Clicon handle + * @param[in] cvv Vector of cli string and instantiated variables + * @param[in] argv Vector. First element xml key format string, eg "/aaa/%s" + */ int -cli_del(clicon_handle h, cvec *cvv, cvec *argv) +cli_del(clicon_handle h, + cvec *cvv, + cvec *argv) { int retval = -1; @@ -352,11 +377,6 @@ cli_del(clicon_handle h, cvec *cvv, cvec *argv) done: return retval; } -int cli_delv(clicon_handle h, cvec *vars, cvec *argv) -{ - return cli_del(h, vars, argv); -} - /*! Set debug level on CLI client (not backend daemon) * @param[in] h Clicon handle @@ -388,10 +408,6 @@ cli_debug_cli(clicon_handle h, done: return retval; } -int cli_debug_cliv(clicon_handle h, cvec *vars, cvec *argv) -{ - return cli_debug_cli(h, vars, argv); -} /*! Set debug level on backend daemon (not CLI) * @param[in] h Clicon handle @@ -422,10 +438,6 @@ cli_debug_backend(clicon_handle h, done: return retval; } -int cli_debug_backendv(clicon_handle h, cvec *vars, cvec *argv) -{ - return cli_debug_backend(h, vars, argv); -} /*! Set debug level on restconf daemon * @param[in] h Clicon handle @@ -479,10 +491,6 @@ cli_set_mode(clicon_handle h, done: return retval; } -int cli_set_modev(clicon_handle h, cvec *vars, cvec *argv) -{ - return cli_set_mode(h, vars, argv); -} /*! Start bash from cli callback * XXX Application specific?? @@ -540,10 +548,6 @@ cli_start_shell(clicon_handle h, return 0; } -int cli_start_shellv(clicon_handle h, cvec *vars, cvec *argv) -{ - return cli_start_shell(h, vars, argv); -} /*! Generic quit callback */ @@ -555,10 +559,6 @@ cli_quit(clicon_handle h, cligen_exiting_set(cli_cligen(h), 1); return 0; } -int cli_quitv(clicon_handle h, cvec *vars, cvec *argv) -{ - return cli_quit(h, vars, argv); -} /*! Generic commit callback * @param[in] argv No arguments expected @@ -576,10 +576,6 @@ cli_commit(clicon_handle h, done: return retval; } -int cli_commitv(clicon_handle h, cvec *vars, cvec *argv) -{ - return cli_commit(h, vars, argv); -} /*! Generic validate callback */ @@ -596,10 +592,6 @@ cli_validate(clicon_handle h, done: return retval; } -int cli_validatev(clicon_handle h, cvec *vars, cvec *argv) -{ - return cli_validate(h, vars, argv); -} /*! Compare two dbs using XML. Write to file and run diff */ @@ -709,10 +701,6 @@ compare_dbs(clicon_handle h, return retval; } -int compare_dbsv(clicon_handle h, cvec *vars, cvec *argv) -{ - return compare_dbs(h, vars, argv); -} /*! Load a configuration file to candidate database * Utility function used by cligen spec file @@ -724,7 +712,7 @@ int compare_dbsv(clicon_handle h, cvec *vars, cvec *argv) * @note file is assumed to have a dummy top-tag, eg * @code * # cligen spec - * load file , load_config_filev("name2","merge"); + * load file , load_config_file("name2","merge"); * @endcode * @see save_config_file */ @@ -804,10 +792,6 @@ load_config_file(clicon_handle h, close(fd); return ret; } -int load_config_filev(clicon_handle h, cvec *vars, cvec *argv) -{ - return load_config_file(h, vars, argv); -} /*! Copy database to local file * Utility function used by cligen spec file @@ -889,10 +873,6 @@ save_config_file(clicon_handle h, fclose(f); return retval; } -int save_config_filev(clicon_handle h, cvec *vars, cvec *argv) -{ - return save_config_file(h, vars, argv); -} /*! Delete all elements in a database * Utility function used by cligen spec file @@ -922,10 +902,6 @@ delete_all(clicon_handle h, done: return retval; } -int delete_allv(clicon_handle h, cvec *vars, cvec *argv) -{ - return delete_all(h, vars, argv); -} /*! Discard all changes in candidate and replace with running */ @@ -935,12 +911,8 @@ discard_changes(clicon_handle h, cvec *argv) { return clicon_rpc_discard_changes(h); -} -int discard_changesv(clicon_handle h, cvec *vars, cvec *argv) -{ - return discard_changes(h, vars, argv); -} +} /*! Copy from one database to another, eg running->startup * @param[in] argv a string: " " Copy from db1 to db2 */ @@ -1024,7 +996,7 @@ cli_notification_cb(int s, * and is XXX * Example code: Start logging of mystream and show logs as xml * @code - * cmd("comment"), cli_notifyv("mystream","1","xml"); + * cmd("comment"), cli_notify("mystream","1","xml"); * @endcode * XXX: format is a memory leak */ @@ -1062,10 +1034,79 @@ cli_notify(clicon_handle h, done: return retval; } + +/* Backward compatible Set if you want to enable "v" cli callback functions, + * such as cli_setv() + * This was obsoleted in 3.7. + * @see include/clixon_custom.h + */ +#ifdef COMPAT_CLIV +int cli_setv(clicon_handle h, cvec *vars, cvec *argv) +{ + return cli_set(h, vars, argv); +} +int cli_mergev(clicon_handle h, cvec *vars, cvec *argv) +{ + return cli_merge(h, vars, argv); +} +int cli_delv(clicon_handle h, cvec *vars, cvec *argv) +{ + return cli_del(h, vars, argv); +} +int cli_debug_cliv(clicon_handle h, cvec *vars, cvec *argv) +{ + return cli_debug_cli(h, vars, argv); +} +int cli_debug_backendv(clicon_handle h, cvec *vars, cvec *argv) +{ + return cli_debug_backend(h, vars, argv); +} +int cli_set_modev(clicon_handle h, cvec *vars, cvec *argv) +{ + return cli_set_mode(h, vars, argv); +} +int cli_start_shellv(clicon_handle h, cvec *vars, cvec *argv) +{ + return cli_start_shell(h, vars, argv); +} +int cli_quitv(clicon_handle h, cvec *vars, cvec *argv) +{ + return cli_quit(h, vars, argv); +} +int cli_commitv(clicon_handle h, cvec *vars, cvec *argv) +{ + return cli_commit(h, vars, argv); +} +int cli_validatev(clicon_handle h, cvec *vars, cvec *argv) +{ + return cli_validate(h, vars, argv); + +} +int compare_dbsv(clicon_handle h, cvec *vars, cvec *argv) +{ + return compare_dbs(h, vars, argv); +} +int load_config_filev(clicon_handle h, cvec *vars, cvec *argv) +{ + return load_config_file(h, vars, argv); +} +int save_config_filev(clicon_handle h, cvec *vars, cvec *argv) +{ + return save_config_file(h, vars, argv); +} +int delete_allv(clicon_handle h, cvec *vars, cvec *argv) +{ + return delete_all(h, vars, argv); +} +int discard_changesv(clicon_handle h, cvec *vars, cvec *argv) +{ + return discard_changes(h, vars, argv); +} int cli_notifyv(clicon_handle h, cvec *vars, cvec *argv) { return cli_notify(h, vars, argv); } +#endif /* COMPAT_CLIV */ /*! Lock database * diff --git a/apps/cli/cli_show.c b/apps/cli/cli_show.c index f4753f3c..ed92d5de 100644 --- a/apps/cli/cli_show.c +++ b/apps/cli/cli_show.c @@ -409,10 +409,6 @@ show_yang(clicon_handle h, yang_print(stdout, yn); return 0; } -int show_yangv(clicon_handle h, cvec *vars, cvec *argv) -{ - return show_yang(h, vars, argv); -} /*! Generic show configuration CLIGEN callback * Utility function used by cligen spec file @@ -598,13 +594,19 @@ done: return retval; } -int show_confv_xpath(clicon_handle h, cvec *vars, cvec *argv) -{ - return show_conf_xpath(h, vars, argv); -} - int cli_show_version(clicon_handle h, cvec *vars, cvec *argv) { cli_output(stdout, "%s\n", CLIXON_VERSION_STRING); return 0; } + +#ifdef COMPAT_CLIV +int show_yangv(clicon_handle h, cvec *vars, cvec *argv) +{ + return show_yang(h, vars, argv); +} +int show_confv_xpath(clicon_handle h, cvec *vars, cvec *argv) +{ + return show_conf_xpath(h, vars, argv); +} +#endif /* COMPAT_CLIV */ diff --git a/apps/cli/clixon_cli_api.h b/apps/cli/clixon_cli_api.h index 3946cfdc..713ea521 100644 --- a/apps/cli/clixon_cli_api.h +++ b/apps/cli/clixon_cli_api.h @@ -72,57 +72,51 @@ int cli_notification_register(clicon_handle h, char *stream, enum format_enum fo int cli_set(clicon_handle h, cvec *vars, cvec *argv); -int cli_setv(clicon_handle h, cvec *vars, cvec *argv); int cli_merge(clicon_handle h, cvec *vars, cvec *argv); -int cli_mergev(clicon_handle h, cvec *vars, cvec *argv); int cli_create(clicon_handle h, cvec *vars, cvec *argv); int cli_remove(clicon_handle h, cvec *vars, cvec *argv); int cli_del(clicon_handle h, cvec *vars, cvec *argv); -int cli_delv(clicon_handle h, cvec *vars, cvec *argv); int cli_debug_cli(clicon_handle h, cvec *vars, cvec *argv); -int cli_debug_cliv(clicon_handle h, cvec *vars, cvec *argv); + int cli_debug_backend(clicon_handle h, cvec *vars, cvec *argv); -int cli_debug_backendv(clicon_handle h, cvec *vars, cvec *argv); + int cli_debug_restconf(clicon_handle h, cvec *vars, cvec *argv); int cli_set_mode(clicon_handle h, cvec *vars, cvec *argv); -int cli_set_modev(clicon_handle h, cvec *vars, cvec *argv); + int cli_start_shell(clicon_handle h, cvec *vars, cvec *argv); -int cli_start_shellv(clicon_handle h, cvec *vars, cvec *argv); + int cli_quit(clicon_handle h, cvec *vars, cvec *argv); -int cli_quitv(clicon_handle h, cvec *vars, cvec *argv); + int cli_commit(clicon_handle h, cvec *vars, cvec *argv); -int cli_commitv(clicon_handle h, cvec *vars, cvec *argv); int cli_validate(clicon_handle h, cvec *vars, cvec *argv); -int cli_validatev(clicon_handle h, cvec *vars, cvec *argv); + int compare_dbs(clicon_handle h, cvec *vars, cvec *argv); -int compare_dbsv(clicon_handle h, cvec *vars, cvec *argv); int load_config_file(clicon_handle h, cvec *vars, cvec *argv); -int load_config_filev(clicon_handle h, cvec *vars, cvec *argv); int save_config_file(clicon_handle h, cvec *vars, cvec *argv); -int save_config_filev(clicon_handle h, cvec *vars, cvec *argv); + int delete_all(clicon_handle h, cvec *vars, cvec *argv); -int delete_allv(clicon_handle h, cvec *vars, cvec *argv); + int discard_changes(clicon_handle h, cvec *vars, cvec *argv); -int discard_changesv(clicon_handle h, cvec *vars, cvec *argv); + int cli_notify(clicon_handle h, cvec *cvv, cvec *argv); -int cli_notifyv(clicon_handle h, cvec *cvv, cvec *argv); + int db_copy(clicon_handle h, cvec *cvv, cvec *argv); @@ -141,11 +135,32 @@ int expandv_dbvar(void *h, char *name, cvec *cvv, cvec *argv, /* cli_show.c: CLIgen new vector arg callbacks */ int show_yang(clicon_handle h, cvec *vars, cvec *argv); -int show_yangv(clicon_handle h, cvec *vars, cvec *argv); + int show_conf_xpath(clicon_handle h, cvec *cvv, cvec *argv); -int show_confv_xpath(clicon_handle h, cvec *cvv, cvec *argv); + int cli_show_config(clicon_handle h, cvec *cvv, cvec *argv); +#ifdef COMPAT_CLIV +int cli_setv(clicon_handle h, cvec *vars, cvec *argv); +int cli_mergev(clicon_handle h, cvec *vars, cvec *argv); +int cli_delv(clicon_handle h, cvec *vars, cvec *argv); +int cli_debug_cliv(clicon_handle h, cvec *vars, cvec *argv); +int cli_debug_backendv(clicon_handle h, cvec *vars, cvec *argv); +int cli_set_modev(clicon_handle h, cvec *vars, cvec *argv); +int cli_start_shellv(clicon_handle h, cvec *vars, cvec *argv); +int cli_quitv(clicon_handle h, cvec *vars, cvec *argv); +int cli_commitv(clicon_handle h, cvec *vars, cvec *argv); +int cli_validatev(clicon_handle h, cvec *vars, cvec *argv); +int compare_dbsv(clicon_handle h, cvec *vars, cvec *argv); +int load_config_filev(clicon_handle h, cvec *vars, cvec *argv); +int save_config_filev(clicon_handle h, cvec *vars, cvec *argv); +int delete_allv(clicon_handle h, cvec *vars, cvec *argv); +int discard_changesv(clicon_handle h, cvec *vars, cvec *argv); +int cli_notifyv(clicon_handle h, cvec *cvv, cvec *argv); +int show_yangv(clicon_handle h, cvec *vars, cvec *argv); +int show_confv_xpath(clicon_handle h, cvec *cvv, cvec *argv); +#endif /* COMPAT_CLIV */ + #endif /* _CLIXON_CLI_API_H_ */ diff --git a/configure b/configure index 6667152b..cdc7a30b 100755 --- a/configure +++ b/configure @@ -634,13 +634,8 @@ EXEEXT ac_ct_CC with_restconf RANLIB -AR -EXE_SUFFIX SH_SUFFIX -AR_SUFFIX -OBJ_SUFFIX INSTALLFLAGS -INSTALL_LIB INSTALL INSTALL_DATA INSTALL_SCRIPT @@ -710,6 +705,7 @@ SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking +enable_debug with_cligen with_restconf with_configfile @@ -1344,6 +1340,12 @@ if test -n "$ac_init_help"; then cat <<\_ACEOF +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-debug Build with debug symbols, default: no + Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) @@ -2444,11 +2446,6 @@ test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - - - - - # If yes, compile apps/restconf # ac_ext=c @@ -3382,6 +3379,27 @@ CPPFLAGS="-DHAVE_CONFIG_H ${CPPFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: result: compiler is $CC" >&5 $as_echo "compiler is $CC" >&6; } +# Debug flag +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; + if test "$enableval" = no; then + ac_enable_debug=no + else + ac_enable_debug=yes + fi + +else + ac_enable_debug=no +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: debug is $ac_enable_debug" >&5 +$as_echo "debug is $ac_enable_debug" >&6; } +if test "$ac_enable_debug" = "yes"; then + CFLAGS="-g -Wall" + INSTALLFLAGS="" +fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: CPPFLAGS is $CPPFLAGS" >&5 $as_echo "CPPFLAGS is $CPPFLAGS" >&6; } @@ -3643,11 +3661,7 @@ _ACEOF fi -EXE_SUFFIX="" -OBJ_SUFFIX=".o" -AR_SUFFIX=".a" SH_SUFFIX=".so" -AR="ar" # This is for cligen diff --git a/configure.ac b/configure.ac index 978cb921..433291fb 100644 --- a/configure.ac +++ b/configure.ac @@ -81,16 +81,11 @@ AC_SUBST(INCLUDES) AC_SUBST(CPPFLAGS) AC_PROG_INSTALL AC_SUBST(INSTALL) -AC_SUBST(INSTALL_LIB) AC_SUBST(INSTALL_DATA) AC_SUBST(INSTALL_PROGRAM) AC_SUBST(INSTALLFLAGS) AC_SUBST(LIBS) -AC_SUBST(OBJ_SUFFIX) -AC_SUBST(AR_SUFFIX) AC_SUBST(SH_SUFFIX) -AC_SUBST(EXE_SUFFIX) -AC_SUBST(AR) AC_SUBST(RANLIB) AC_SUBST(with_restconf) # If yes, compile apps/restconf # @@ -100,6 +95,21 @@ AC_PROG_CPP CPPFLAGS="-DHAVE_CONFIG_H ${CPPFLAGS}" AC_MSG_RESULT(compiler is $CC) +# Debug flag +AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug],[Build with debug symbols, default: no]),[ + if test "$enableval" = no; then + ac_enable_debug=no + else + ac_enable_debug=yes + fi + ], + [ ac_enable_debug=no]) + +AC_MSG_RESULT(debug is $ac_enable_debug) +if test "$ac_enable_debug" = "yes"; then + CFLAGS="-g -Wall" + INSTALLFLAGS="" +fi AC_MSG_RESULT(CPPFLAGS is $CPPFLAGS) AC_MSG_RESULT(CFLAGS is $CFLAGS) @@ -119,11 +129,7 @@ if test "$prefix" = "NONE"; then fi AC_CHECK_LIB(m, main) -EXE_SUFFIX="" -OBJ_SUFFIX=".o" -AR_SUFFIX=".a" SH_SUFFIX=".so" -AR="ar" # This is for cligen AC_ARG_WITH(cligen, [ --with-cligen=dir Use CLIGEN here ] ) diff --git a/doc/FAQ.md b/doc/FAQ.md index 2ac6dab8..09459599 100644 --- a/doc/FAQ.md +++ b/doc/FAQ.md @@ -342,7 +342,7 @@ plugin_credentials(clicon_handle h, To authenticate, the callback needs to return the value 1 and supply a username. -See [../apps/example/example_restconf.c] plugin_credentials() for +See [../apps/example/example_restconf.c] example_restconf_credentials() for an example of HTTP basic auth. ## How do I write a CLI translator function diff --git a/include/clixon_custom.h b/include/clixon_custom.h index eaad25ac..92b12204 100644 --- a/include/clixon_custom.h +++ b/include/clixon_custom.h @@ -43,6 +43,7 @@ int strverscmp (__const char *__s1, __const char *__s2); #endif - - - +/* Set if you want to enable "v" cli callback functions, such as cli_setv() + * This was obsoleted in 3.7 + */ +#undef COMPAT_CLIV diff --git a/lib/src/Makefile.in b/lib/src/Makefile.in index b26efee5..3360934e 100644 --- a/lib/src/Makefile.in +++ b/lib/src/Makefile.in @@ -52,6 +52,8 @@ CLIXON_MINOR = @CLIXON_VERSION_MINOR@ VPATH = @srcdir@ CC = @CC@ CFLAGS = -fPIC @CFLAGS@ +INSTALL = @INSTALL@ +INSTALL_LIB = @INSTALL@ INSTALLFLAGS = @INSTALLFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ @@ -182,8 +184,8 @@ install: install-lib install-include: install-lib: $(MYLIB) - install -m 0755 -d $(DESTDIR)$(libdir) - install -m 0644 $(INSTALLFLAGS) $(MYLIB) $(DESTDIR)$(libdir) + $(INSTALL) -m 0755 -d $(DESTDIR)$(libdir) + $(INSTALL_LIB) -m 0644 $(INSTALLFLAGS) $(MYLIB) $(DESTDIR)$(libdir) ln -sf $(MYLIB) $(DESTDIR)$(libdir)/$(MYLIBSO) # -l:libclixon.so.3 ln -sf $(MYLIBSO) $(DESTDIR)$(libdir)/$(MYLIBLINK) # -l:libclixon.so