Нашёл! Китайсы - косячнеги! Из-за #include внутри юзерского lwipopts.h меняются местами тела файлов debug.h и lwipopts.h - то есть наличие определения проверяется перед созданием. У китайсав получилось так
#include "lwip/opt.h" /* udp.c */
#include "lwipopts.h"
//#include "lwipopts.h"
#include "lwip/debug.h"
//#include "lwip/opt.h" /* guarded */
// BODY DEBUG.H
// BODY LWIPOPTS.H
//#include "lwip/debug.h" /* guarded */
//#include "lwip/opt.h" /* guarded */
А должно быть так
#include "lwip/opt.h"
#include "lwipopts.h"
// BODY LWIPOPTS.H
#include "lwip/debug.h"
// BODY DEBUG.H
//#include "opt.h" /* guarded */