From a950834e95b4e574d3751bff3f96bec34279082f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kim=20Nguy=E1=BB=85n?= Date: Wed, 17 Jul 2013 14:32:56 +0200 Subject: [PATCH] Make remake change to the directory where ./remake (and the Remakefile) are. --- remake.cpp | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/remake.cpp b/remake.cpp index 558ff3a..aea5353 100644 --- a/remake.cpp +++ b/remake.cpp @@ -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); -- 2.17.1