Make remake change to the directory where ./remake (and the Remakefile) are.
authorKim Nguyễn <kn@lri.fr>
Wed, 17 Jul 2013 12:32:56 +0000 (14:32 +0200)
committerKim Nguyễn <kn@lri.fr>
Wed, 17 Jul 2013 16:09:16 +0000 (18:09 +0200)
remake.cpp

index 558ff3a..aea5353 100644 (file)
@@ -783,9 +783,34 @@ static std::ostream &operator<<(std::ostream &out, escape_string const &se)
 /**
  * Initialize #working_dir.
  */
-void init_working_dir()
+void init_working_dir(char *argv0, bool client_mode)
 {
        char buf[1024];
+        std::string cmd(argv0);
+#ifdef WINDOWS
+        char dirsep = '\\';
+#else
+        char dirsep = '/';
+#endif
+
+        if (!client_mode)
+        {
+                size_t pos = cmd.find_last_of(dirsep);
+                if (pos != std::string::npos)
+                {
+                        std::string dir = cmd.substr(0, pos+1);
+                        if (chdir(dir.c_str()) != 0)
+                        {
+                                perror("Failed to change working directory");
+                                exit(EXIT_FAILURE);
+                        }
+                        else
+                        {
+                                std::cout << "Entering directory `"
+                                          << dir << "'" << std::endl;
+                        }
+                }
+        }
        char *res = getcwd(buf, sizeof(buf));
        if (!res)
        {
@@ -2807,7 +2832,8 @@ void usage(int exit_status)
  */
 int main(int argc, char *argv[])
 {
-       init_working_dir();
+        char *sn = getenv("REMAKE_SOCKET");
+       init_working_dir(argv[0], sn);
 
        std::string remakefile = "Remakefile";
        string_list targets;
@@ -2892,7 +2918,7 @@ int main(int argc, char *argv[])
 #endif
 
        // Run as client if REMAKE_SOCKET is present in the environment.
-       if (char *sn = getenv("REMAKE_SOCKET")) client_mode(sn, targets);
+       if (sn) client_mode(sn, targets);
 
        // Otherwise run as server.
        server_mode(remakefile, targets);