ekg / seqwish

alignment to variation graph inducer
MIT License
143 stars 18 forks source link

Building Seqwish on macOS #117

Open kojix2 opened 10 months ago

kojix2 commented 10 months ago

Hi

I compiled Seqwish on macOS.

I followed the recommended commands for compiling ODGI on macOS

See: https://github.com/pangenome/odgi/pull/494

CC=/opt/homebrew/opt/llvm/bin/clang \
  CXX=/opt/homebrew/opt/llvm/bin/clang++ \
  LDFLAGS=-L/opt/homebrew/lib \
  cmake . -Bbuild
CC=/opt/homebrew/opt/llvm/bin/clang \
  CXX=/opt/homebrew/opt/llvm/bin/clang++ \
  LDFLAGS=-L/opt/homebrew/lib \
  cmake --build build -- -j

I modified CMakeLists.txt as follows. There was a linking error, but I removed -latomic, as I read it's unnecessary on macOS.

--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -48,10 +48,10 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # untested
   # adapted from https://stackoverflow.com/questions/46414660/macos-cmake-and-openmp
   # find_package(OpenMP) does not work reliably on macOS, so we do its work ourselves
   set (OpenMP_C "${CMAKE_C_COMPILER}")
-  set (OpenMP_C_FLAGS " -Xpreprocessor -fopenmp -I/opt/local/include/libomp -I/usr/local/include -L/opt/local/lib/libomp -L/usr/local/lib")
+  set (OpenMP_C_FLAGS " -Xpreprocessor -fopenmp -I/opt/homebrew/Cellar/libomp/17.0.4/include/ -I/usr/local/include -L/opt/homebrew/Cellar/libomp/17.0.4/lib/ -L/usr/local/lib")
   set (OpenMP_C_LIB_NAMES "libomp" "libgomp" "libiomp5")
   set (OpenMP_CXX "${CMAKE_CXX_COMPILER}")
-  set (OpenMP_CXX_FLAGS " -Xpreprocessor -fopenmp -I/opt/local/include/libomp -I/usr/local/include -L/opt/local/lib/libomp -L/usr/local/lib")
+  set (OpenMP_CXX_FLAGS " -Xpreprocessor -fopenmp -I/opt/homebrew/Cellar/libomp/17.0.4/include/ -I/usr/local/include -L/opt/homebrew/Cellar/libomp/17.0.4/lib/ -L/usr/local/lib")
   set (OpenMP_CXX_LIB_NAMES "libomp" "libgomp" "libiomp5")
   set (OpenMP_libomp_LIBRARY "omp")
   set (OpenMP_libgomp_LIBRARY "gomp")
@@ -256,7 +256,6 @@ target_link_libraries(seqwish
   "${sdsl-lite_LIB}/libsdsl.a"
   "${sdsl-lite-divsufsort_LIB}/libdivsufsort.a"
   "${sdsl-lite-divsufsort_LIB}/libdivsufsort64.a"
-  "-latomic"
   Threads::Threads
   jemalloc
   z)

get_current_dir_name() does not work on macOS:

--- a/src/main.cpp
+++ b/src/main.cpp
@@ -116,7 +116,7 @@ int main(int argc, char** argv) {
     if (tmp_base) {
         temp_file::set_dir(args::get(tmp_base));
     } else {
-        char* cwd = get_current_dir_name();
+   char* cwd = getcwd(NULL, 0);
         temp_file::set_dir(std::string(cwd));
         free(cwd);
     }
--- a/src/tempfile.cpp
+++ b/src/tempfile.cpp
@@ -96,7 +96,7 @@ namespace temp_file {

         // Get the default temp dir from environment variables.
         if (temp_dir.empty()) {
-            char* cwd = get_current_dir_name();
+       char* cwd = getcwd(NULL, 0);
             temp_dir = std::string(cwd);
             free(cwd);
             /*const char *system_temp_dir = nullptr;

I encountered an error with std::min(), but I am not familiar with the C++ language. After consulting with ChatGPT, I made the following change:

--- a/paryfor.hpp
+++ b/paryfor.hpp
@@ -768,13 +768,13 @@ void parallel_for(const I& begin,
     for (uint64_t t = 0; t < nthreads; ++t) {
         workers.emplace_back(worker, t);
     }
-    std::pair<I, I> todo_range = std::make_pair(begin, std::min(begin + chunk_size, end));
+    std::pair<I, I> todo_range = std::make_pair(begin, std::min(begin + static_cast<I>(chunk_size), end));
     I& todo_i = todo_range.first;
     I& todo_j = todo_range.second;
     while (todo_i != end) {
         if (queue.try_push(todo_range)) {
-            todo_i = std::min(todo_i + chunk_size, end);
-            todo_j = std::min(todo_j + chunk_size, end);
+       todo_i = std::min(todo_i + static_cast<I>(chunk_size), end);
+       todo_j = std::min(todo_j + static_cast<I>(chunk_size), end);
         } else {
             std::this_thread::sleep_for(std::chrono::nanoseconds(1));
         }

These changes allow us to generate executables for M2 Mac.

I am not sure if it actually compiles correctly. But I write here because I know that GitHub issues are the first place people come to look for information. Someone will add more information on how to compile on macOS.