From fd5fec64aa73d2514c1c841effee4ce225678719 Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Sun, 5 Jan 2025 01:29:04 +0100 Subject: [PATCH] make uninstall: remove empty directories (share/xschem and share/doc/xschem); make command `xschem help` work also if running in src/ directory; use XSCHEM_SHAREDIR shell variable (if defined and directory existing), else set XCSCHEM_SHAREDIR to `pwd` if started from src/ dir, else set compile set XSCHEM_SHAREDIR. xschemrc can override this XSCHEM_SHAREDIR setting. --- Makefile | 2 +- doc/Makefile | 1 + src/Makefile.in | 6 ++++ src/scheduler.c | 14 ++++++-- src/utile/Makefile | 1 + src/xinit.c | 71 ++++++++++++++++++++++++++++++----------- src/xschem.tcl | 24 +++++++------- xschem_library/Makefile | 18 ++++++----- 8 files changed, 96 insertions(+), 41 deletions(-) diff --git a/Makefile b/Makefile index 38a841bb..7411baf9 100644 --- a/Makefile +++ b/Makefile @@ -29,9 +29,9 @@ install_pdf: FORCE cd doc && $(MAKE) install_pdf uninstall: FORCE - cd src && $(MAKE) uninstall cd xschem_library && $(MAKE) uninstall cd doc && $(MAKE) uninstall cd src/utile && $(MAKE) uninstall + cd src && $(MAKE) uninstall FORCE: diff --git a/doc/Makefile b/doc/Makefile index 7174753d..53e8256e 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -17,6 +17,7 @@ uninstall: FORCE $(SCCBOX) rm -f "$(XDOCDIR)"/xschem_man/* $(SCCBOX) rm -f "$(XDOCDIR)"/* $(SCCBOX) rm -f "$(MANDIR)"/man1/xschem.1 + $(SCCBOX) rm -f "$(XDOCDIR)" clean: diff --git a/src/Makefile.in b/src/Makefile.in index f7a9453d..858c8659 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -101,6 +101,12 @@ foreach /local/n in /local/install_shares $(SCCBOX) rm "$(XSHAREDIR)"/@/local/n@ @] end +print [@ + $(SCCBOX) rm "$(XSHAREDIR)"/systemlib + $(SCCBOX) rm "$(XSHAREDIR)"/xschem_library + $(SCCBOX) rm "$(XSHAREDIR)" +@] + print [@ FORCE: diff --git a/src/scheduler.c b/src/scheduler.c index ea7d1a69..e66b69d7 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -97,13 +97,16 @@ int get_instance(const char *s) static void xschem_cmd_help(int argc, const char **argv) { char prog[PATH_MAX]; + const char *xschem_sharedir=tclgetvar("XSCHEM_SHAREDIR"); + #ifdef __unix__ + int running_in_src_dir = tclgetintvar("running_in_src_dir"); + #endif if( get_file_path("x-www-browser")[0] == '/' ) goto done; if( get_file_path("firefox")[0] == '/' ) goto done; if( get_file_path("chromium")[0] == '/' ) goto done; if( get_file_path("chrome")[0] == '/' ) goto done; if( get_file_path("xdg-open")[0] == '/' ) goto done; #ifndef __unix__ - const char *xschem_sharedir=tclgetvar("XSCHEM_SHAREDIR"); wchar_t app[MAX_PATH] = {0}; wchar_t w_url[PATH_MAX]; char url[PATH_MAX]="", url2[PATH_MAX]=""; @@ -123,8 +126,13 @@ static void xschem_cmd_help(int argc, const char **argv) done: my_strncpy(prog, tclresult(), S(prog)); #ifdef __unix__ - tclvareval("launcher {", "file://", XSCHEM_SHAREDIR, - "/../doc/xschem/xschem_man/developer_info.html#cmdref", "} ", prog, NULL); + if(running_in_src_dir) { + tclvareval("launcher {", "file://", xschem_sharedir, + "/../doc/xschem_man/developer_info.html#cmdref", "} ", prog, NULL); + } else { + tclvareval("launcher {", "file://", xschem_sharedir, + "/../doc/xschem/xschem_man/developer_info.html#cmdref", "} ", prog, NULL); + } #else my_snprintf(url2, S(url2), "file://%s#cmdref", url); MultiByteToWideChar(CP_ACP, 0, url2, -1, w_url, S(w_url)); diff --git a/src/utile/Makefile b/src/utile/Makefile index db6f2ea7..a38c7de5 100644 --- a/src/utile/Makefile +++ b/src/utile/Makefile @@ -11,6 +11,7 @@ install: FORCE uninstall: FORCE $(SCCBOX) rm -f "$(XSHAREDIR)"/utile/* + $(SCCBOX) rm -f "$(XSHAREDIR)"/utile clean: diff --git a/src/xinit.c b/src/xinit.c index bb4d5b6e..5dd8e26c 100644 --- a/src/xinit.c +++ b/src/xinit.c @@ -2285,6 +2285,7 @@ void tclmainloop(void) int Tcl_AppInit(Tcl_Interp *inter) { const char *tmp_ptr; + char *xschem_sharedir=NULL; char name[PATH_MAX]; /* overflow safe 20161122 */ char tmp[2*PATH_MAX+100]; /* 20161122 overflow safe */ #ifndef __unix__ @@ -2296,6 +2297,9 @@ int Tcl_AppInit(Tcl_Interp *inter) int running_in_src_dir; int fs; + char xschemtcl[PATH_MAX]; + char systemlib[PATH_MAX]; + char xschemexec[PATH_MAX]; #ifdef __unix__ const char* home_buff; #endif @@ -2324,6 +2328,18 @@ int Tcl_AppInit(Tcl_Interp *inter) } Tcl_CreateExitHandler(tclexit, 0); #ifdef __unix__ + /* XSCHEM_SHAREDIR set in shell variable */ + if ((xschem_sharedir=getenv("XSCHEM_SHAREDIR")) != NULL && !stat(xschem_sharedir, &buf)) { + tclsetvar("XSCHEM_SHAREDIR", xschem_sharedir); + /* running in ./src/ directory */ + } else if( !stat("./xschem.tcl", &buf) && !stat("./systemlib", &buf) && !stat("./xschem", &buf)) { + tclsetvar("XSCHEM_SHAREDIR",pwd_dir); + /* compile-time set XSCHEM_SHAREDIR */ + } else /* if(!stat(XSCHEM_SHAREDIR, &buf)) */ { + tclsetvar("XSCHEM_SHAREDIR", XSCHEM_SHAREDIR); + } + /* if still not found rely on xschemrc for setting this needed path */ + my_snprintf(tmp, S(tmp),"regsub -all {~/} {%s} {%s/}", XSCHEM_LIBRARY_PATH, home_dir); tcleval(tmp); tclsetvar("XSCHEM_LIBRARY_PATH", tclresult()); @@ -2336,51 +2352,60 @@ int Tcl_AppInit(Tcl_Interp *inter) tclsetvar("USER_CONF_DIR", user_conf_dir); /* test if running xschem in src/ dir (usually for testing) */ + my_snprintf(xschemtcl, S(xschemtcl), "%s/%s", tclgetvar("XSCHEM_SHAREDIR"), "xschem.tcl"); + my_snprintf(systemlib, S(systemlib), "%s/%s", tclgetvar("XSCHEM_SHAREDIR"), "systemlib"); + my_snprintf(xschemexec, S(xschemexec), "%s/%s", tclgetvar("XSCHEM_SHAREDIR"), "xschem"); running_in_src_dir = 0; - if( !stat("./xschem.tcl", &buf) && !stat("./systemlib", &buf) && !stat("./xschem", &buf)) { + if( !stat(xschemtcl, &buf) && !stat(systemlib, &buf) && !stat(xschemexec, &buf)) { running_in_src_dir = 1; - tclsetvar("XSCHEM_SHAREDIR",pwd_dir); /* for testing xschem builds in src dir*/ /* set builtin library path if running in src/ */ my_snprintf(tmp, S(tmp), "set XSCHEM_LIBRARY_PATH %s/xschem_library", user_conf_dir); tcleval(tmp); my_snprintf(tmp, S(tmp), - "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/devices", pwd_dir); + "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/devices", + tclgetvar("XSCHEM_SHAREDIR")); tcleval(tmp); my_snprintf(tmp, S(tmp), - "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/examples", pwd_dir); + "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/examples", + tclgetvar("XSCHEM_SHAREDIR")); tcleval(tmp); my_snprintf(tmp, S(tmp), - "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/ngspice", pwd_dir); + "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/ngspice", + tclgetvar("XSCHEM_SHAREDIR")); tcleval(tmp); my_snprintf(tmp, S(tmp), - "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/logic", pwd_dir); + "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/logic", + tclgetvar("XSCHEM_SHAREDIR")); tcleval(tmp); my_snprintf(tmp, S(tmp), - "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/xschem_simulator", pwd_dir); + "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/xschem_simulator", + tclgetvar("XSCHEM_SHAREDIR")); tcleval(tmp); my_snprintf(tmp, S(tmp), - "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/generators", pwd_dir); + "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/generators", + tclgetvar("XSCHEM_SHAREDIR")); tcleval(tmp); my_snprintf(tmp, S(tmp), - "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/inst_sch_select", pwd_dir); + "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/inst_sch_select", + tclgetvar("XSCHEM_SHAREDIR")); tcleval(tmp); my_snprintf(tmp, S(tmp), - "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/binto7seg", pwd_dir); + "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/binto7seg", + tclgetvar("XSCHEM_SHAREDIR")); tcleval(tmp); my_snprintf(tmp, S(tmp), - "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/pcb", pwd_dir); + "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/pcb", + tclgetvar("XSCHEM_SHAREDIR")); tcleval(tmp); my_snprintf(tmp, S(tmp), - "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/rom8k", pwd_dir); + "append XSCHEM_LIBRARY_PATH : [file dirname \"%s\"]/xschem_library/rom8k", + tclgetvar("XSCHEM_SHAREDIR")); tcleval(tmp); - } else if( !stat(XSCHEM_SHAREDIR, &buf) ) { - tclsetvar("XSCHEM_SHAREDIR",XSCHEM_SHAREDIR); - /* ... else give up searching, may set later after loading xschemrc */ } tclsetintvar("running_in_src_dir", running_in_src_dir); -#else +#else /* windows */ char *up_hier=NULL, *win_xschem_library_path=NULL; #define WIN_XSCHEM_LIBRARY_PATH_NUM 11 const char *WIN_XSCHEM_LIBRARY_PATH[WIN_XSCHEM_LIBRARY_PATH_NUM] = { @@ -2432,7 +2457,6 @@ int Tcl_AppInit(Tcl_Interp *inter) tclsetvar("XSCHEM_LIBRARY_PATH", win_xschem_library_path_clean); my_free(_ALLOC_ID_, &win_xschem_library_path); my_free(_ALLOC_ID_, &up_hier); - char *xschem_sharedir=NULL; if ((xschem_sharedir=getenv("XSCHEM_SHAREDIR")) != NULL) { if (!stat(xschem_sharedir, &buf)) { tclsetvar("XSCHEM_SHAREDIR", xschem_sharedir); @@ -2478,7 +2502,7 @@ int Tcl_AppInit(Tcl_Interp *inter) } } - + fprintf(errfp, "Using run time directory XSCHEM_SHAREDIR = %s\n", tclgetvar("XSCHEM_SHAREDIR")); /* Execute tcl script given on command line with --preinit, before sourcing xschemrc */ if(cli_opt_preinit_command) { tcleval(cli_opt_preinit_command); @@ -2548,6 +2572,17 @@ int Tcl_AppInit(Tcl_Interp *inter) } /* END SOURCING xschemrc */ + + /* test again if running xschem in src/ dir after xschemrc settings */ + my_snprintf(xschemtcl, S(xschemtcl), "%s/%s", tclgetvar("XSCHEM_SHAREDIR"), "xschem.tcl"); + my_snprintf(systemlib, S(systemlib), "%s/%s", tclgetvar("XSCHEM_SHAREDIR"), "systemlib"); + my_snprintf(xschemexec, S(xschemexec), "%s/%s", tclgetvar("XSCHEM_SHAREDIR"), "xschem"); + running_in_src_dir = 0; + if( !stat(xschemtcl, &buf) && !stat(systemlib, &buf) && !stat(xschemexec, &buf)) { + running_in_src_dir = 1; + } + tclsetintvar("running_in_src_dir", running_in_src_dir); + if(!sel_file[0]) { my_snprintf(sel_file, S(sel_file), "%s/%s", user_conf_dir, ".selection.sch"); } diff --git a/src/xschem.tcl b/src/xschem.tcl index a65697c8..e2ef5c13 100644 --- a/src/xschem.tcl +++ b/src/xschem.tcl @@ -1768,9 +1768,9 @@ proc simconf_add {tool} { ############ cellview -# this proc prints symbol bindings (default binding or "schematic" attr in symbol) +# proc cellview prints symbol bindings (default binding or "schematic" attr in symbol) # of all symbols used in current and sub schematics. -proc cellview_setlabels {w sym_sch default_sch sym_spice_sym_def} { +proc cellview_setlabels {w symbol sym_sch default_sch sym_spice_sym_def} { global dark_gui_colorscheme if {$dark_gui_colorscheme} { set symfg SeaGreen1 @@ -1792,6 +1792,8 @@ proc cellview_setlabels {w sym_sch default_sch sym_spice_sym_def} { # .... } elseif {[$w get] eq $sym_sch} { $w configure -bg $symbg + } else { + puts "need to update:[$w get] --> $sym_sch" } } } @@ -1813,8 +1815,8 @@ proc cellview {} { update raise .cv frame .cv.top - label .cv.top.sym -text { SYMBOL} -width 20 -bg grey60 -anchor w -padx 4 -font $font - label .cv.top.sch -text SCHEMATIC -width 50 -bg grey60 -anchor w -padx 4 -font $font + label .cv.top.sym -text { SYMBOL} -width 30 -bg grey60 -anchor w -padx 4 -font $font + label .cv.top.sch -text SCHEMATIC -width 45 -bg grey60 -anchor w -padx 4 -font $font label .cv.top.pad -text { } -width 1 -bg grey60 -font $font pack .cv.top.sym .cv.top.sch -side left -fill x -expand 1 pack .cv.top.pad -side left -fill x @@ -1841,10 +1843,10 @@ proc cellview {} { if {$type eq {subcircuit}} { frame $sf.f$i pack $sf.f$i -side top -fill x - label $sf.f$i.l -text $symbol -width 20 -anchor w -padx 4 -borderwidth 1 \ + label $sf.f$i.l -text $symbol -width 30 -anchor w -padx 4 -borderwidth 1 \ -relief sunken -pady 1 -font $font # puts $sf.f$i.s - entry $sf.f$i.s -width 50 -borderwidth 1 -relief sunken -font $font + entry $sf.f$i.s -width 45 -borderwidth 1 -relief sunken -font $font balloon $sf.f$i.s $abs_sch button $sf.f$i.b -text Sch -padx 4 -borderwidth 1 -pady 0 -font $font \ -command " @@ -1859,9 +1861,9 @@ proc cellview {} { $sf.f$i.s insert 0 {defined in symbol spice_sym_def} } bind $sf.f$i.s " - cellview_setlabels %W [list $sym_sch] [list $default_sch] [list $sym_spice_sym_def] + cellview_setlabels %W [list $symbol] [list $sym_sch] [list $default_sch] [list $sym_spice_sym_def] " - cellview_setlabels $sf.f$i.s $sym_sch $default_sch $sym_spice_sym_def + cellview_setlabels $sf.f$i.s $symbol $sym_sch $default_sch $sym_spice_sym_def pack $sf.f$i.l $sf.f$i.s -side left -fill x -expand 1 pack $sf.f$i.b -side left } @@ -1892,7 +1894,7 @@ proc traversal_setlabels {w parent_sch instname inst_sch sym_sch default_sch ins # update schematic if {$parent_sch ne {}} { set current [xschem get current_name] - puts "traversal_update_schematic: $w parent: $parent_sch $instname def: $sym_sch $inst_sch --> [$w get]" + # puts "traversal_update_schematic: $w parent: $parent_sch $instname def: $sym_sch $inst_sch --> [$w get]" if { $inst_sch ne [$w get] } { puts "update attr" xschem load $parent_sch noundoreset nodraw @@ -1904,7 +1906,7 @@ proc traversal_setlabels {w parent_sch instname inst_sch sym_sch default_sch ins xschem set_modify 3 ;# set only modified flag to force a save, do not update window/tab titles xschem save set inst_sch [$w get] - puts "inst_sch set to: $inst_sch" + # puts "inst_sch set to: $inst_sch" xschem load $current noundoreset nodraw bind $w " @@ -8878,7 +8880,7 @@ if {$text_replace_selection && $OS != "Windows"} { ## allow to unpost menu entries when clicking a posted menu -if { [info tclversion] >= 8.6 } { +if { [info exists has_x] && [info tclversion] >= 8.6 } { bind Menu