Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[cmake] Jak napisać cmake ?

Ostatnio zmodyfikowano 2025-06-15 11:31
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[cmake] Jak napisać cmake ?
» 2025-04-29 20:08:52
Cześć. Mam projekt składający się z wielu plików oraz korzystający z biblioteki SFML 2.6.2.
Chciałbym zbudować taki build, który po uruchomieniu stworzy mi pliki projektu Visual Studio 2022 i załączy bibliotekę.

Jak to zrobić ?

Przykładowe pliki
SFML-2.6.2
main.cpp
headers\NatureObject.hpp
headers\Buildings.hpp
P-182301
pekfos
» 2025-04-29 21:33:32
Po co cmake jak masz cały program w jednym pliku? Przeczytaj jakiś tutorial, wystarczy pewnie project(), add_executable(), include_directories(), link_directories() i target_link_libraries().
P-182302
nanoant20
» 2025-04-29 21:49:35
musi określi wersję CMake , standard c++ z jakiego będzię korzystał. Określić, czy używa bibliotek statycznych czy dynamicznych, dodać scieżkę do SFML, czy projekt ma być w wersji Release czy Debug, wskazać źródła, skopiować plik z katalogu np assets do katalogu w którym będzie budował. Linkować biblioteki SFML. Jeżeli będzie używał bibliotek dynamicznych to może je też skopiować do katalogu w którym będzie budował. Chyba że ma dodane biblioteki SFML do zmiennej środowiskowej PATH wtedy CMake będzie wiedział, gdzie szukać plików konfiguracyjnych SFML
trochę tego do ogarnięcia jest
https://cmake.org/cmake/help/book/mastering-cmake/cmake/Help/guide/tutorial/index.html
i jeszcze będzie trzeba ogarnąć jak to zrobić z cl.exe, ponieważ jest widoczny tylko z Developer Command Prompt









P-182303
tBane
Temat założony przez niniejszego użytkownika
» 2025-04-30 12:15:42
Na razie mam coś takiego. Co myślicie? Jak dodać foldery wraz z plikami ?

assets/natures/tree9.png
assets/natures/tree9.msh

assets/natures/rock1.png
assets/natures/rock1.msh


cmake_minimum_required(VERSION 3.15)

# set the project name and version
project(EditorRPG2D VERSION 1.0)

# set the C++ standard
add_library(EditorRPG2D_compiler_flags INTERFACE)
target_compile_features(EditorRPG2D_compiler_flags INTERFACE cxx_std_20)

# add the headers for project
file(GLOB_RECURSE EditorRPG2D_HEADERS "headers/*.hpp")
P-182304
nanoant20
» 2025-04-30 14:53:04
Jak dodać foldery wraz z plikami ?
w dokumentacji CMake file(COPY [...])
https://cmake.org/cmake/help/latest/command/file.html
file({COPY | INSTALL} <file>... DESTINATION <dir> [...])
czyli dla fazy budowania
file(COPY <file-or-directory>... DESTINATION <dir>)
file(COPY [...]) działa rekurencyjnie — oznacza to, że kopiuje cały katalog wraz z jego podkatalogami i zawartością, zachowując strukturę
P-182305
tBane
Temat założony przez niniejszego użytkownika
» 2025-04-30 18:34:52
Ok. Dziękuję :-)
P-182307
tBane
Temat założony przez niniejszego użytkownika
» 2025-05-26 16:48:35
Cześć.
Napisałem takie CMake, ale czy da się to jakoś uprościć tzn. kopiowanie plików - coś na zasadzie pętli ?
No i jeszcze pytanko. Jak rozdzielić dll dla debug/release (tzn w Release dodać tylko dll dla release a dla Debug dodać tylko debug dll), bo zbiorczo mi kopiuje ?

# min version CMake
cmake_minimum_required(VERSION 3.10)

# project name
project(EasyNotepad)

# set the standard C++
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# add the executable
add_executable(${PROJECT_NAME} EasyNotepad/main.cpp)

# find SFML
set(SFML_DIR "C:/SFML-2.6.2/lib/cmake/SFML")  # Zmień ścieżkę na Twoją!
find_package(SFML 2.6.2 COMPONENTS graphics window system REQUIRED)

# link SFML libraries
target_link_libraries(${PROJECT_NAME} sfml-graphics sfml-window sfml-system)

# copy files to project folder
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_SOURCE_DIR}/EasyNotepad/arial.ttf
        ${CMAKE_BINARY_DIR}
)

# copy files to release/debug (DLLs, font etc.)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_SOURCE_DIR}/EasyNotepad/openal32.dll
        ${CMAKE_BINARY_DIR}/$<CONFIG>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-audio-2.dll
        ${CMAKE_BINARY_DIR}/$<CONFIG>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-audio-d-2.dll
        ${CMAKE_BINARY_DIR}/$<CONFIG>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-graphics-2.dll
        ${CMAKE_BINARY_DIR}/$<CONFIG>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-graphics-d-2.dll
        ${CMAKE_BINARY_DIR}/$<CONFIG>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-system-2.dll
        ${CMAKE_BINARY_DIR}/$<CONFIG>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-system-d-2.dll
        ${CMAKE_BINARY_DIR}/$<CONFIG>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-window-2.dll
        ${CMAKE_BINARY_DIR}/$<CONFIG>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_SOURCE_DIR}/EasyNotepad/sfml-window-d-2.dll
        ${CMAKE_BINARY_DIR}/$<CONFIG>
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
        ${CMAKE_SOURCE_DIR}/EasyNotepad/arial.ttf
        ${CMAKE_BINARY_DIR}/$<CONFIG>
)
P-182406
DejaVu
» 2025-05-26 17:54:17
ChatGPT 4o:
W wątku na forum cpp0x.pl dotyczącym konfiguracji CMake dla projektu z biblioteką SFML, użytkownik tBane pyta o uproszczenie kopiowania plików oraz o sposób rozdzielenia bibliotek DLL dla wersji Debug i Release. Oto kilka sugestii, które mogą pomóc:

---

### 📁 Uproszczenie kopiowania plików

Zamiast powtarzać polecenia `add_custom_command` dla każdego pliku, można wykorzystać pętlę w CMake do iteracyjnego kopiowania plików. Przykład:

```cmake
# Lista plików do skopiowania
set(ASSETS
    arial.ttf
    openal32.dll
    sfml-audio-2.dll
    sfml-audio-d-2.dll
)

# Iteracyjne kopiowanie plików
foreach(ASSET ${ASSETS})
    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            ${CMAKE_SOURCE_DIR}/EasyNotepad/${ASSET}
            ${CMAKE_BINARY_DIR}/$<CONFIG>
    )
endforeach()
```

Jeśli chcesz skopiować cały katalog (np. `assets/`), możesz użyć:

```cmake
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory
        ${CMAKE_SOURCE_DIR}/assets
        ${CMAKE_BINARY_DIR}/$<CONFIG>/assets
)
```

---

### 🧩 Rozdzielenie DLL dla Debug i Release

Aby uniknąć kopiowania wszystkich plików DLL do obu konfiguracji, możesz użyć generatora `$<CONFIG>` oraz warunków `if` w CMake:

```cmake
# Kopiowanie plików specyficznych dla konfiguracji
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(DLLS sfml-audio-d-2.dll)
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")
    set(DLLS sfml-audio-2.dll)
endif()

foreach(DLL ${DLLS})
    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_if_different
            ${CMAKE_SOURCE_DIR}/EasyNotepad/${DLL}
            ${CMAKE_BINARY_DIR}/$<CONFIG>
    )
endforeach()
```

Alternatywnie, możesz użyć funkcji `target_sources` i `target_link_libraries` z generatorami `$<$<CONFIG:Debug>:...>` i `$<$<CONFIG:Release>:...>` do dodawania plików i bibliotek specyficznych dla konfiguracji.

---

### ✅ Dodatkowe wskazówki

* Upewnij się, że zmienna `CMAKE_BUILD_TYPE` jest ustawiona, np. przez `-DCMAKE_BUILD_TYPE=Release` podczas konfiguracji CMake.
* Rozważ użycie `install()` i `CMakeLists.txt` w połączeniu z `CMake` do zarządzania kopiowaniem plików i instalacją projektu.

Jeśli potrzebujesz bardziej zaawansowanej konfiguracji lub masz dodatkowe pytania, daj znać!
P-182407
« 1 » 2 3 4 5
  Strona 1 z 5 Następna strona