I know what you tell, but I want not to do this at runtime but at compilation time.
I don't think I understand this.
I want to use a gui not arduino ide.
To do what? If the objective of the GUI is to change the programming on the Arduino, it will need to invoke the compiler, the linker, and the uploader. The use of #define statements, or not, is up to you.
If the idea is to send some data to the Arduino, and have it change what it does, AT RUN TIME, then the use of #defines makes no sense, since the code on the Arduino has no #defines in it. They are stripped out before the compiler even starts, but the preprocessor.