Skip to content

Commit bbbb77e

Browse files
committed
Fixed get folder of executable
1 parent 22b1e76 commit bbbb77e

File tree

4 files changed

+69
-35
lines changed

4 files changed

+69
-35
lines changed

src/codegen/codegen.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -160,10 +160,10 @@ static void link(std::string executable_name, std::string object_file_name, std:
160160
"lld",
161161
object_file_name,
162162
name,
163-
utilities::get_folder_of_executable() + "/deps/musl/libc.a",
164-
utilities::get_folder_of_executable() + "/deps/musl/crt1.o",
165-
utilities::get_folder_of_executable() + "/deps/musl/crti.o",
166-
utilities::get_folder_of_executable() + "/deps/musl/crtn.o"
163+
utilities::get_folder_of_executable().string() + "/deps/musl/libc.a",
164+
utilities::get_folder_of_executable().string() + "/deps/musl/crt1.o",
165+
utilities::get_folder_of_executable().string() + "/deps/musl/crti.o",
166+
utilities::get_folder_of_executable().string() + "/deps/musl/crtn.o"
167167
};
168168

169169
std::string output = "";
@@ -1748,7 +1748,7 @@ llvm::Value* codegen::Context::codegen_print_struct_function(ast::Type arg_type,
17481748
);
17491749
}
17501750
else {
1751-
std::string print_function_name = this->get_mangled_function_name(utilities::get_folder_of_executable() + "/std/std" + ".dmd", "printWithoutLineEnding", {struct_type.as_nominal_type().type_definition->fields[i]->type}, ast::Type("None"), false);
1751+
std::string print_function_name = this->get_mangled_function_name(utilities::get_folder_of_executable().string() + "/std/std" + ".dmd", "printWithoutLineEnding", {struct_type.as_nominal_type().type_definition->fields[i]->type}, ast::Type("None"), false);
17521752
llvm::Function* llvm_function = this->module->getFunction(print_function_name);
17531753
assert(llvm_function);
17541754

src/semantic/intrinsics.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ Set<std::string> primitive_types = Set<std::string>({
1212
});
1313

1414
extern Set<std::filesystem::path> std_libs = Set<std::filesystem::path>({
15-
utilities::get_folder_of_executable() + "/std/std" + ".dmd"
15+
utilities::get_folder_of_executable().string() + "/std/std" + ".dmd"
1616
});

src/utilities.cpp

Lines changed: 62 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,6 @@ std::string utilities::get_program_name(std::filesystem::path path) {
3636
return path.stem().string();
3737
}
3838

39-
#ifdef __linux__
40-
std::string utilities::get_executable_name(std::string program_name) {
41-
return program_name;
42-
}
43-
44-
std::string utilities::get_run_command(std::string program_name) {
45-
return "./" + utilities::get_executable_name(program_name);
46-
}
47-
#elif __APPLE__
48-
std::string utilities::get_executable_name(std::string program_name) {
49-
return program_name;
50-
}
51-
52-
std::string utilities::get_run_command(std::string program_name) {
53-
return "./" + utilities::get_executable_name(program_name);
54-
}
55-
#elif _WIN32
56-
std::string utilities::get_executable_name(std::string program_name) {
57-
return program_name + ".exe";
58-
}
59-
60-
std::string utilities::get_run_command(std::string program_name) {
61-
return ".\\" + utilities::get_executable_name(program_name);
62-
}
63-
#endif
64-
6539
std::string utilities::to_str(Set<ast::Type> set) {
6640
std::string output = "{";
6741
for (size_t i = 0; i < set.elements.size(); i++) {
@@ -75,6 +49,66 @@ std::string utilities::to_str(Set<ast::Type> set) {
7549
return output;
7650
}
7751

78-
std::string utilities::get_folder_of_executable() {
79-
return std::filesystem::weakly_canonical(std::filesystem::path(get_run_command("diamond"))).parent_path().string();
52+
#ifdef __linux__
53+
std::filesystem::path get_executable_path() {
54+
return std::filesystem::canonical("/proc/self/exe");
55+
}
56+
57+
std::string utilities::get_executable_name(std::string program_name) {
58+
return program_name;
59+
}
60+
61+
std::string utilities::get_run_command(std::string program_name) {
62+
return "./" + utilities::get_executable_name(program_name);
63+
}
64+
65+
#elif __APPLE__
66+
#include <mach-o/dyld.h>
67+
68+
std::filesystem::path get_executable_path() {
69+
// Get size of path
70+
uint32_t size = 0;
71+
_NSGetExecutablePath(NULL, &size);
72+
73+
// Get string
74+
std::string path;
75+
path.resize(size + 1);
76+
_NSGetExecutablePath(&path[0], &size);
77+
78+
// Return
79+
return std::filesystem::canonical(path);
80+
}
81+
82+
std::string utilities::get_executable_name(std::string program_name) {
83+
return program_name;
84+
}
85+
86+
std::string utilities::get_run_command(std::string program_name) {
87+
return "./" + utilities::get_executable_name(program_name);
88+
}
89+
90+
#elif _WIN32
91+
#include <Windows.h>
92+
93+
std::filesystem::path get_executable_path() {
94+
std::string path;
95+
while (true) {
96+
path.resize(path.size() + MAX_PATH);
97+
auto copied = GetModuleFileNameA(NULL, &path[0], path.size());
98+
if (copied + 1 < path.size()) break;
99+
}
100+
return std::filesystem::canonical(path);
101+
}
102+
103+
std::string utilities::get_executable_name(std::string program_name) {
104+
return program_name + ".exe";
105+
}
106+
107+
std::string utilities::get_run_command(std::string program_name) {
108+
return ".\\" + utilities::get_executable_name(program_name);
109+
}
110+
#endif
111+
112+
std::filesystem::path utilities::get_folder_of_executable() {
113+
return get_executable_path().parent_path();
80114
}

src/utilities.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace utilities {
1515
std::string get_run_command(std::string path);
1616
std::string to_str(Set<ast::Type> set);
1717
std::string get_program_name();
18-
std::string get_folder_of_executable();
18+
std::filesystem::path get_folder_of_executable();
1919
}
2020

2121
#endif

0 commit comments

Comments
 (0)