Thanks! At least on my Mac installation, conda's gcc package seems to be broken. Let me report that I was able to build IMP with conda & clang using the following workaround: * adding -DCMAKE_CXX_FLAGS="-std=c++17" as you suggested * switching IMP's random number generator from boost to std in IMP/kernel/include/random.h due to some weird constexpr issue, due to a conflict between conda's boost::mt19337::min()/max() functions and llvm's std::shuffle(), which requires them to return a constexpr (this was fixed in the latest boost versions) I tested for speed, and std::mt19337 is as fast or even faster on my mac. This is the change, l did not dare to check it in. Let me know if you think we should stick with the boost version or try to add this change - it doesn't break anything but could affect speed on some systems, perhaps for better but not necessarily. It required C11. // For some constexpr related reason, clang + C11 don't work // well with the boost random number generator #if defined(__clang__) && __cplusplus >= 201103 #include <random> #else #include <boost/random/mersenne_twister.hpp> #endif IMPKERNEL_BEGIN_NAMESPACE #ifndef SWIG // the RNG is defined explicitly in pyext/IMP_kernel.random.i #if defined(__clang__) && __cplusplus >= 201103 class RandomNumberGenerator : public std::mt19937 { typedef std::mt19937 T; #else class RandomNumberGenerator : public ::boost::mt19937 { typedef ::boost::mt19937 T; #endif On Tue, Dec 13, 2022 at 8:39 PM Ben Webb <> wrote: > On 12/13/22 3:48 AM, Barak Raveh wrote: > > I have been trying to build IMP from source on Conda on my mac. It > > mostly goes well except in one file it gets flustered by a for-range > > loop (see *Build output *below). If I build using the same cmd-line just > > with /--std=c++11/, or /std=c++14/, or /std=c++17/, it works just fine. > > Moreover, cmake does detect that it should work with C++11 (see *CMake > > output* below). Any ideas? > > If you're in a conda environment, you should probably use the conda > compilers so you're building IMP with the same compiler as its > dependencies - looks like you're using the system-provided compiler > here. This is done by "conda install gxx_linux-64" on Linux followed by > "source ${CONDA_PREFIX}/etc/conda/activate.d/activate-gxx_linux-64.sh" > (it'll be a little different on a Mac though). > > Otherwise, I would just force a C++ standard by passing > -DCMAKE_CXX_FLAGS="-std=c++17" or similar to your CMake invocation. > Modern clang is supposed to compile for recent C++ (I think C++14) by > default, but maybe it is getting confused by one of your other compile > flags somewhere. > > Ben > -- > https://salilab.org/~ben/ > "It is a capital mistake to theorize before one has data." > - Sir Arthur Conan Doyle > -- Barak
// For some constexpr related reason, clang + C11 don't work                     Â
// well with the boost random number generator                            Â
#if defined(__clang__) && __cplusplus >= 201103
#include <random>
#else
#include <boost/random/mersenne_twister.hpp>
#endif
IMPKERNEL_BEGIN_NAMESPACE
#ifndef SWIG // the RNG is defined explicitly in pyext/IMP_kernel.random.i              Â
#if defined(__clang__) && __cplusplus >= 201103
class RandomNumberGenerator : public std::mt19937 {
  typedef std::mt19937 T;
#else
class RandomNumberGenerator : public ::boost::mt19937 {
  typedef ::boost::mt19937 T;
#endif
On 12/13/22 3:48 AM, Barak Raveh wrote:
> I have been trying to build IMP from source on Conda on my mac. It
> mostly goes well except in one file it gets flustered by a for-range
> loop (see *Build output *below). If I build using the same cmd-line just
> with /--std=c++11/, or /std=c++14/, or /std=c++17/, it works just fine.
> Moreover, cmake does detect that it should work with C++11 (see *CMake
> output* below). Any ideas?
If you're in a conda environment, you should probably use the conda
compilers so you're building IMP with the same compiler as its
dependencies - looks like you're using the system-provided compiler
here. This is done by "conda install gxx_linux-64" on Linux followed by
"source ${CONDA_PREFIX}/etc/conda/activate.d/activate-gxx_linux-64.sh"
(it'll be a little different on a Mac though).
Otherwise, I would just force a C++ standard by passing
-DCMAKE_CXX_FLAGS="-std=c++17" or similar to your CMake invocation.
Modern clang is supposed to compile for recent C++ (I think C++14) by
default, but maybe it is getting confused by one of your other compile
flags somewhere.
    Ben
--
" target="_blank">Â Â Â Â Â Â Â Â Â Â Â https://salilab.org/~ben/
"It is a capital mistake to theorize before one has data."
    - Sir Arthur Conan Doyle