- kernel/register.h, kernel/driver.cc: refactor rewrite_yosys_exe()/get_share_file_n...
authorSiesh1oo <siesh1oo@siesh1oo.no>
Wed, 12 Mar 2014 17:33:37 +0000 (18:33 +0100)
committerSiesh1oo <siesh1oo@siesh1oo.no>
Wed, 12 Mar 2014 17:33:37 +0000 (18:33 +0100)
        This refactoring improves robustness and allows OSX support with only 7 new lines of code, and easy extension for other systems.
 - passes/abc/abc.cc, passes/cmds/show.cc, passes/techmap/techmap.cc: use new, refactored semantics.
 - Makefile: no need to add $(PWD) to $(PATH) anymore.

Makefile
kernel/driver.cc
kernel/register.h
passes/abc/abc.cc
passes/cmds/show.cc
passes/techmap/techmap.cc

index f7b466fdc8866310a2e19ae4bd8c99a4612a1810..b7bf4485c789292491838fb1ffc9d783a9ed8904 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -26,8 +26,6 @@ CXXFLAGS = -Wall -Wextra -ggdb -I"$(shell pwd)" -I${DESTDIR}/include -MD -D_YOSY
 LDFLAGS = -L${DESTDIR}/lib
 LDLIBS = -lstdc++ -lreadline -lm -ldl
 
-export PATH := $(PWD):$(DESTDIR)/bin:$(PATH)
-
 ifeq (Darwin,$(findstring Darwin,$(shell uname)))
        # add macports include and library path to search directories, don't use '-rdynamic' and '-lrt':
        CXXFLAGS += -I/opt/local/include
index ce95cad4fee9a4b2ca8e95be106fd2b522af19c1..da4962b82480b27ef6e10ccc74ca4dfb17eeb6c8 100644 (file)
@@ -24,6 +24,7 @@
 #include <unistd.h>
 #include <libgen.h>
 #include <dlfcn.h>
+#include <limits.h>
 #include <errno.h>
 
 #include <algorithm>
@@ -427,42 +428,46 @@ extern RTLIL::Design *yosys_get_design()
        return yosys_design;
 }
 
-std::string rewrite_yosys_exe(std::string exe)
+#if defined(__linux__)
+std::string proc_self_dirname ()
 {
-       char buffer[1024];
-       ssize_t buflen = readlink("/proc/self/exe", buffer, sizeof(buffer)-1);
-
-       if (buflen < 0)
-               return exe;
-
-       buffer[buflen] = 0;
-       std::string newexe = stringf("%s/%s", dirname(buffer), exe.c_str());
-       if (access(newexe.c_str(), X_OK) == 0)
-               return newexe;
-
-       return exe;
+       char path [PATH_MAX];
+       ssize_t buflen = readlink("/proc/self/exe", path, sizeof(path));
+       if (buflen < 0) {
+               log_cmd_error("readlink(\"/proc/self/exe\") failed: %s", strerror(errno));
+               log_abort();
+       }
+       while (buflen > 0 && path[buflen-1] != '/')
+               buflen--;
+       return std::string(path, buflen);
 }
-
-std::string get_share_file_name(std::string file)
+#elif defined(__APPLE__)
+#include <mach-o/dyld.h>
+std::string proc_self_dirname ()
 {
-       char buffer[1024];
-       ssize_t buflen = readlink("/proc/self/exe", buffer, sizeof(buffer)-1);
-
-       if (buflen < 0)
-               log_error("Can't find file `%s': reading of /proc/self/exe failed!\n", file.c_str());
-
-       buffer[buflen] = 0;
-       const char *dir = dirname(buffer);
-
-       std::string newfile_inplace = stringf("%s/share/%s", dir, file.c_str());
-       if (access(newfile_inplace.c_str(), F_OK) == 0)
-               return newfile_inplace;
-
-       std::string newfile_system = stringf("%s/../share/yosys/%s", dir, file.c_str());
-       if (access(newfile_system.c_str(), F_OK) == 0)
-               return newfile_system;
+       char * path = NULL;
+       uint32_t buflen = 0;
+       while (_NSGetExecutablePath(path, &buflen) != 0)
+               path = (char *) realloc((void *) path, buflen);
+       while (buflen > 0 && path[buflen-1] != '/')
+               buflen--;
+       return std::string(path, buflen);
+}
+#else
+       #error Dont know how to determine process executable base path!
+#endif
 
-       log_error("Can't find file `%s': no `%s' and no `%s' found!\n", file.c_str(), newfile_inplace.c_str(), newfile_system.c_str());
+std::string proc_share_dirname ()
+{
+       std::string proc_self_path = proc_self_dirname();
+       std::string proc_share_path = proc_self_path + "share/";
+       if (access(proc_share_path.c_str(), X_OK) == 0)
+               return proc_share_path;
+       proc_share_path = proc_self_path + "../share/yosys/";
+       if (access(proc_share_path.c_str(), X_OK) == 0)
+               return proc_share_path;
+       log_cmd_error("proc_share_dirname: unable to determine share/ directory!");
+       log_abort();
 }
 
 int main(int argc, char **argv)
index b582f98c966fc6b8f91debef6e84bff58530196d..f3d3f70aec869346f0886a43178a05a1bd14771c 100644 (file)
@@ -36,8 +36,8 @@ extern const char *yosys_version_str;
 
 // implemented in driver.cc
 extern RTLIL::Design *yosys_get_design();
-std::string rewrite_yosys_exe(std::string exe);
-std::string get_share_file_name(std::string file);
+extern std::string proc_self_dirname();
+extern std::string proc_share_dirname();
 const char *create_prompt(RTLIL::Design *design, int recursion_counter);
 
 // from passes/cmds/design.cc
index 286b750cc1e2f2789c58bc936b09cfadb27e2592..30e78e58871b7805df4f9531b835d6373c3415f5 100644 (file)
@@ -969,7 +969,7 @@ struct AbcPass : public Pass {
                log_header("Executing ABC pass (technology mapping using ABC).\n");
                log_push();
 
-               std::string exe_file = rewrite_yosys_exe("yosys-abc");
+               std::string exe_file = proc_self_dirname() + "yosys-abc";
                std::string script_file, liberty_file, constr_file, clk_str;
                bool dff_mode = false, keepff = false, cleanup = true;
                int lut_mode = 0;
index fdccb4bccc20fd778bb1c200022b83972a1a39c5..bf37e5dae9029f4b6e2fc05392f629b7ebd38aeb 100644 (file)
@@ -751,7 +751,8 @@ struct ShowPass : public Pass {
                                log_cmd_error("Shell command failed!\n");
                } else
                if (format.empty()) {
-                       std::string cmd = stringf("fuser -s '%s' || '%s' '%s' &", out_file.c_str(), rewrite_yosys_exe("yosys-svgviewer").c_str(), out_file.c_str());
+                       std::string svgviewer = proc_self_dirname() + "yosys-svgviewer";
+                       std::string cmd = stringf("fuser -s '%s' || '%s' '%s' &", out_file.c_str(), svgviewer.c_str(), out_file.c_str());
                        log("Exec: %s\n", cmd.c_str());
                        if (system(cmd.c_str()) != 0)
                                log_cmd_error("Shell command failed!\n");
index 937f41315fac375eb626976945a133fb7d2ed7a6..0ca601e3b55fcd9f6e19481781034e748d50ec57 100644 (file)
@@ -548,13 +548,14 @@ struct TechmapPass : public Pass {
                int max_iter = -1;
 
                size_t argidx;
+               std::string proc_share_path = proc_share_dirname();
                for (argidx = 1; argidx < args.size(); argidx++) {
                        if (args[argidx] == "-map" && argidx+1 < args.size()) {
                                map_files.push_back(args[++argidx]);
                                continue;
                        }
                        if (args[argidx] == "-share_map" && argidx+1 < args.size()) {
-                               map_files.push_back(get_share_file_name(args[++argidx]));
+                               map_files.push_back(proc_share_path + args[++argidx]);
                                continue;
                        }
                        if (args[argidx] == "-max_iter" && argidx+1 < args.size()) {