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.

This commit is contained in:
stefan schippers 2025-01-05 01:29:04 +01:00
parent 09813f8e1e
commit fd5fec64aa
8 changed files with 96 additions and 41 deletions

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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));

View File

@ -11,6 +11,7 @@ install: FORCE
uninstall: FORCE
$(SCCBOX) rm -f "$(XSHAREDIR)"/utile/*
$(SCCBOX) rm -f "$(XSHAREDIR)"/utile
clean:

View File

@ -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");
}

View File

@ -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 <KeyRelease> "
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 <KeyRelease> "
@ -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 <Button> {
if { [%W cget -type] eq "menubar" && [info exists tk::Priv(menuActivated)]} {
%W activate none

View File

@ -44,14 +44,16 @@ install: FORCE
$(SCCBOX) install -f -d gschem_import/sym/*.sym "$(XDOCDIR)"/gschem_import/sym
uninstall: FORCE
$(SCCBOX) rm -f "$(system_library_dir)"/* "$(XDOCDIR)"/examples/* "$(XDOCDIR)"/pcb/* \
"$(XDOCDIR)"/ngspice/* "$(XDOCDIR)"/symgen/* "$(XDOCDIR)"/logic/* "$(XDOCDIR)"/xTAG/* \
"$(XDOCDIR)"/rom8k/* "$(XDOCDIR)"/xschem_simulator/* "$(XDOCDIR)"/binto7seg/* \
"$(XDOCDIR)"/rulz-r8c33/* "$(XDOCDIR)"/generators/* "$(XDOCDIR)"/inst_sch_select/* \
"$(XDOCDIR)"/gschem_import/*.sym \
"$(XDOCDIR)"/gschem_import/*.sch \
"$(XDOCDIR)"/gschem_import/sym/*.sym \
"$(XDOCDIR)"/gschem_import/sym
$(SCCBOX) rm -f "$(system_library_dir)"/* \
"$(system_library_dir)" \
"$(XDOCDIR)"/examples/* "$(XDOCDIR)"/pcb/* \
"$(XDOCDIR)"/ngspice/* "$(XDOCDIR)"/symgen/* "$(XDOCDIR)"/logic/* "$(XDOCDIR)"/xTAG/* \
"$(XDOCDIR)"/rom8k/* "$(XDOCDIR)"/xschem_simulator/* "$(XDOCDIR)"/binto7seg/* \
"$(XDOCDIR)"/rulz-r8c33/* "$(XDOCDIR)"/generators/* "$(XDOCDIR)"/inst_sch_select/* \
"$(XDOCDIR)"/gschem_import/*.sym \
"$(XDOCDIR)"/gschem_import/*.sch \
"$(XDOCDIR)"/gschem_import/sym/*.sym \
"$(XDOCDIR)"/gschem_import/sym
clean:
distclean: