Witam
W unit testach potrzebuję takiej funkcjonalności. W Cmaku robię:
set(CMAKE_CXX_FLAGS "-DBIN_PATH=${EXECUTABLE_OUTPUT_PATH} ${CMAKE_CXX_FLAGS}")
i chciałbym w programie C++ w unit testach użyć:
#define convert_flag_to_string(s) str(s)
#define str(s) std::string(#s)
std::cout << "path to configuration directory: " << convert_flag_to_string(BIN_PATH) << std::endl;
No i problem jest taki że w pewnym środowisku gdzie jest sdka mi to nie działa, jak w ścieżce występuje keyword "linux" to mi kurde zamienia to na el "l".
Czyli np. dla takiego debugowego kejsa:
set(CMAKE_CXX_FLAGS "-DBIN_PATH=${EXECUTABLE_OUTPUT_PATH} ${CMAKE_CXX_FLAGS}")
SET(VAR_A "aa 1inux bb")
SET(VAR_B "aa linux bb ")
SET(VAR_C "aa kinux bb")
set(CMAKE_CXX_FLAGS "-DKIN_PATH=${VAR_A} ${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "-DLIN_PATH=${VAR_B} ${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "-DMIN_PATH=${VAR_C} ${CMAKE_CXX_FLAGS}")
otrzymuję w programie:
std::cout << convert_flag_to_string(KIN_PATH) pokazuje keyword "aa 1inux bb" //expected
std::cout << convert_flag_to_string(LIN_PATH) pokazuje keyword "aa l bb" //WTF???
std::cout << convert_flag_to_string(MIN_PATH) pokazuje keyword "aa kinux bb" //expected
Nie rozumiem czemu jak w stringu występuje keyword "linux" to na poziomie programu otrzymuję literkę el "l". To jest jakaś magia. Przez to utki mi nie działają bo mi nie znajduje ścieżki do konfiguracji. Czy to znaczy że w #define convert_flag_to_string trzeba coś poprawić?
Na poziomie programu musze mieć bezwzględną ścieżkę, takie coś aby założyć że folder jest w tej samej lokalizacji co binarka z utkami a więc użyć "./" to nie zawsze zadziała z tymi utkami, stąd próbuję przekazać poprzez flagę kompilacji tą bezwględną ścieżkę.
użycie target_compile_definition i tam przekazanie flagi też nie pomaga, jest taki sam rezultat, jeszcze w poniedziałek spróbuję w cmaku użyć configure_file, wtedy nie muszę define'a convert_flag_to_string używać, ale mega dziwny kejs z tą zamianą słowa "linux" na l.