CMake - własny preprocesor uzywając MSVC

Odpowiedz Nowy wątek
2020-05-02 12:50

Rejestracja: 3 lata temu

Ostatnio: 2 tygodnie temu

0

Hej,
Chcę dodać niestandardowy preprocesor dla plików .cpp używając MSVC i CMakeLists.txt.

Próbowałem nadpisać standardowy kompilator:

set(CMAKE_CXX_COMPILER "${CMAKE_CURRENT_SOURCE_DIR}/compiler.bat")

Który by zrobił co ma do zrobienia a następnie wywołałby standardowy.
Niestety wygląda na to, że ta linijka jest ignorowana/ nadpisywana.

Taki preprocesor mógłby np. tworzyć nowe pliki .cpp i .h

edytowany 1x, ostatnio: kq, 2020-05-02 12:51

Pozostało 580 znaków

2020-05-02 13:35

Rejestracja: 1 rok temu

Ostatnio: 11 godzin temu

0

add_custom_command (plus ewentualnie add_custom_target) nie wystarcza ?

edytowany 1x, ostatnio: Bartłomiej Golenko, 2020-05-02 13:36

Pozostało 580 znaków

2020-05-02 18:43

Rejestracja: 3 lata temu

Ostatnio: 2 tygodnie temu

0

No jakoś to działa ale utknąłem w jednym punkcie.
Zrobiłem customowe polecenie, które będzie skanować wszystkie pliki .cpp i .hpp szukając "#file<nazwa_pliku>".- nie do końca finalnie chce żeby tak to działało, jest to na razie taki test.
Zadaniem tego testu jest wygenerowanie wszystkich takich plików i dodaniem ich do projektu w celu zbudowania.

Mam więc taki kod:

add_custom_command(
    TARGET ${PROJECT_NAME}
    PRE_BUILD
  COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/compiler.bat" -a ${ALL_PROJECT_SOURCES}
  COMMENT "Preprocessing - test"
  VERBATIM)

Polecenie jest wywoływane przed wszelkim budowaniem.

Niestety nie do końca wiem jak to zrobić i czy w ogóle tak się da, czyli sytuacja w której nie znam przed wywołaniem komendy stworzonych plików.

Dla testu zrobiłem taki prosty compiler.bat:

@echo off
echo. 2>autogen.cpp

Cały CMakeLists.txt:

CMAKE_MINIMUM_REQUIRED (VERSION 3.3.0)
PROJECT (testcpp)

# Source files
FILE(GLOB_RECURSE __source_SRC RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
    "${CMAKE_CURRENT_SOURCE_DIR}/cpp/*.cpp"
)
SOURCE_GROUP (TREE "${CMAKE_CURRENT_SOURCE_DIR}/cpp/" PREFIX "Source Files" FILES ${__source_SRC})

SET(ALL_PROJECT_SOURCES 
    ${__source_SRC}
)

INCLUDE_DIRECTORIES(
    "./cpp"
)

ADD_EXECUTABLE(${PROJECT_NAME} WIN32
    ${ALL_PROJECT_SOURCES}
)

IF (WIN32) 
    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS_DEBUG "/SUBSYSTEM:CONSOLE")
    SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_DEFINITIONS_DEBUG "_CONSOLE")
ENDIF (WIN32)

add_custom_command(
    TARGET ${PROJECT_NAME}
    PRE_BUILD
  COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/compiler.bat" -a ${ALL_PROJECT_SOURCES}
  COMMENT "Preprocessing - test"
  VERBATIM)
edytowany 2x, ostatnio: Focusx, 2020-05-02 18:46

Pozostało 580 znaków

2020-05-02 19:25

Rejestracja: 1 rok temu

Ostatnio: 11 godzin temu

1

Nie używaj GLOB-a, w CMake to nie jest dobry pomysł. CMake interpretuje go tylko raz na etapie generowania projektu a nie potem przy budowaniu.

Poczytaj sobie np. tu: https://crascit.com/2017/04/1[...]ated-sources-in-cmake-builds/

Pozostało 580 znaków

2020-05-02 21:27

Rejestracja: 3 lata temu

Ostatnio: 2 tygodnie temu

0

Tak ale to jest przy założeniu, że znam pliki jakie mogą być wygenerowane, a co jeśli nie wiem jeszcze jak one będą się nazywać?

Pozostało 580 znaków

2020-05-02 21:35

Rejestracja: 1 rok temu

Ostatnio: 11 godzin temu

0

No to CMake się do Twoich celów chyba nie nadaje...

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0