umieszczenie w aplikacji informacji o parametrach kompilacji

0

Jeżeli projekt używa cmake to jak umieścić w zasobach parametry kompilacji ?
Za starych czasów to pamiętam był program "configure" i niektóre programy zwracały wartość parametrów na etapie "configure"
Jak to uzyskać w filozofii cmake ?
Po prostu mieścić CMakeCache.txt w zasobach ? Albo nawet jeszcze build.ninja aby widzieć pełne ścieżki i wszystkie parametry :D

np. mam w CMakeLists.txt

option(BUILD_FFMPEG "Enable ffmpeg functions" OFF)
option(BUILD_SQLITECPP "enable SQLiteCpp" ON)
option(CONNECTION_TCP "Build  TCP version" ON)
option(CONNECTION_USB "Build  USB version" OFF)

jak buduje automat to zmienne mają wartość tak jak w pliku CMakeLists.txt

Ale jak zbuduje człowiek to zmienne mogą być "przebite" przez wartości w cache np. CONNECTION_USB=ON CONNECTION_TCP=OFF

1

Nie wiem czy do końca cię zrozumiałem
załóżmy,
option(CONNECTION_USB "Build USB version" OFF)
do parametry odpalenia cmake powinny być
cmake . -D CONNECTION_USB=ON
Czyli nie wiem chcesz sobie pobrać jakiś cache aby nie wołać
cmake . -D CONNECTION_USB=ON
tylko tak
cmake .
?
Bo jeśli tak to raczej odradzam takie hopki klocki. O ile rozumiem ccache, jakieś cache w yocot szczególnie na CI to loklanie bym uważał.

0

Na git mam rewizje ABCD
cmake generuje plik H i w Help->About i tam się pojawia , zbudowano dnia .... rewizja ABCD

Inny programista zbuduje tą samą wersję ale ma inne środowisko (inne zmienne w cache cmake) , w Help->About jest ta sama wersja ale aplikacje mogą działać zupełnie inaczej

Przychodzi mo do głowy pomysł aby wszystkie moje parametrry w cmake poprzedzic przedrostkiem i jakims skryptem dodac to do Help->About

1

Nigdy tego w sumie nie potrzebowałem, więc być może da się lepiej, bardziej automatycznie, bardziej cywilizowanie, i w ogóle… Ale nasuwa mi się jedno proste — nawet pewnie za proste — rozwiązanie: po prostu sobie walnąć w CMake’u add_definitions, a w kodzie źródłowym korzystać z preprocesora.

EDYCJA: dokumentacja CMake’a mówi, żeby zamiast add_definitions zacząć używać add_compile_definitions. Reszta idei bez zmian.

2

To tak:

  1. Da się wyeksportować stan flag z tego co się orientuję export(PACKAGE CONNECTION_USB_FLAG)
  2. Jeśli chcesz mieć swój zestaw flag to cóż zawsze pozostaje zrobić cmake z nimi, dodać if odpowiednio je zmieniać jak ktoś da -DSETFLAGS=MAXIMUS to wejdą twoje
  3. Najtrywialniejsze skrypt bash/sh odpalający cmake z twoim presetem :)

Ale generalnie uważam to za dziwne. Zawsze w projektach mam cmake z jakimiś tam flagami. I zmieniam w zalezności od potrzeb. Ale może ten export będize ok ale to też wymaga zaciągnięcia ich w cmake więc dodania lini do pociągania.

Inny programista zbuduje tą samą wersję ale ma inne środowisko (inne zmienne w cache cmake) , w Help->About jest ta sama wersja ale aplikacje mogą działać zupełnie inaczej

Hmm, wiesz ja bym powiedział że build to powinine budowac CI. A wasze lokalne softy cóż, pozostają takie rzeczy jak wpsomniałem(i może inne ktos tez ma pomysły).

3

Chyba sam musisz to zaimplementować, ale sama funkcjonalność jest wg mnie bardzo przydatna, szczególnie jeśli soft jest mocno konfigurowalny. Z pierwszych przykładów przychodzących do głowy, zarówno gcc jak i ffmpeg wypluwają linię configure z jaką zostały skompilowane.

1
Marius.Maximus napisał(a):

np. mam w CMakeLists.txt

option(BUILD_FFMPEG "Enable ffmpeg functions" OFF)
option(BUILD_SQLITECPP "enable SQLiteCpp" ON)
option(CONNECTION_TCP "Build  TCP version" ON)
option(CONNECTION_USB "Build  USB version" OFF)

Gdzieś widziałem takie podejście IMO pasuje do twojego przypadku:

add_library(build_options INTERFACE)
target_compile_definitions(
  build_options 
  INTERFACE
      PREFIX_BUILD_FFMPEG=$<BOOL:${BUILD_FFMPEG}>
      PREFIX_BUILD_SQLITECPP=$<BOOL:${BUILD_SQLITECPP}>
      PREFIX_CONNECTION_TCP=$<BOOL:${CONNECTION_TCP}>
      PREFIX_CONNECTION_USB=$<BOOL:${CONNECTION_USB}>
)

...

add_executable(your_app ...)
target_link_libraries(your_app LINK_PUBLIC build_options)

W kodzie będziesz miał zdefiniowane makra: PREFIX_BUILD_FFMPEG, ale i tak użybym ich tylko do zdefiniowania constexpr:

struct BuildOptions {
    bool ffmpeg;
    bool sqlLite;
    bool tcp;
    bool usb;
};

constexpr auto Options = BuildOptions {
    PREFIX_BUILD_FFMPEG,
    PREFIX_BUILD_SQLITECPP,
    PREFIX_CONNECTION_TCP,
    PREFIX_CONNECTION_USB
};
6

Jeszcze lepsza metoda: https://cmake.org/cmake/help/latest/command/configure_file.html
Config.h.in

#pragma once

namespace cfg {
struct BuildOptions {
    bool ffmpeg;
    bool sqlLite;
    bool tcp;
    bool usb;
};

constexpr auto ON=true;
constexpr auto OFF=false;

constexpr auto Options = BuildOptions {
    @PREFIX_BUILD_FFMPEG@,
    @PREFIX_BUILD_SQLITECPP@,
    @PREFIX_CONNECTION_TCP@,
    @PREFIX_CONNECTION_USB@
};
}
configure_file(Config.h.in ${CMAKE_BINARY_DIR}/Config.h @ONLY)

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