#include <cstdlib>
+#if defined(__APPLE__)
+#if __has_include(<crt_externs.h>)
+#include <crt_externs.h> // @manual
+#endif
+#endif
+
extern "C" {
#ifdef _WIN32
// These are technically supposed to be defined linux/limits.h and
int setenv(const char* name, const char* value, int overwrite);
int unsetenv(const char* name);
#elif defined(__APPLE__)
-extern char** environ;
+// environ doesn't work well with dylibs, so use _NSGetEnviron instead.
+#if !__has_include(<crt_externs.h>)
+char*** _NSGetEnviron(void);
+#endif
+#define environ (*_NSGetEnviron())
+#endif
+
+#if !__linux__ && !FOLLY_MOBILE
+int clearenv();
#endif
}