Forum: Compiler & IDEs CMake zwei Compilate bauen lassen


von D a v i d K. (oekel) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi,

ich habe meinen Mµ-Code soweit umgebaut, dass er unter dem Ausschluss 
einiger *.c Dateien sowie diverser #ifdefin GCC; #ifdefine AVR-GCC unter 
beiden Kompilern läuft.

Da ich mit CLion unterwegs bin, wird CMake verwendet und wenn ich es 
richtig verstanden habe, so sollte man CMakeLists.txt nur 1x 
konfigurieren und nicht bestimmte Settings vor jedem Compilieren 
setzen/"toggeln", richtig?

Ich würde nun gerne meine IDE so einstellen, dass ich:
- 1x NUR für GCC meine executable erstelle (also eine Konfiguration 
dafür habe)
- 1x NUR für AVR-GCC meine .elf erstelle (also eine Konfiguration dafür 
habe)

ODER das CMake so umschreiben, dass er JEDES mal beide Dateien erstellt.

Für diesen Zweck poste ist mal meinen komplette CMakeLists.txt und hoffe 
das mir jemand weiterhelfen kann:
1
cmake_minimum_required(VERSION 3.13)
2
3
4
option(COMPUTER "Testing on a x86 System" OFF)
5
option(MICROCONTROLLER "Build for Flashing AVR" ON)
6
7
add_definitions(-DSILENT)#TODO remove
8
9
if (COMPUTER)
10
    SET(FILES_PRINT
11
            output/display_16x4_xterminal.c
12
            output/display_16x4_xterminal_control.c
13
            output/display_16x4_xterminal_error.c
14
            output/display_16x4_xterminal_menue.c
15
            output/display_16x4_xterminal_time.c)
16
else ()
17
    SET(FILES_PRINT
18
            output/display_16x4.c
19
            output/display_16x4_control.c
20
            output/display_16x4_error.c
21
            output/display_16x4_menue.c
22
            output/display_16x4_time.c)
23
endif ()
24
SET(FILES_CONTROL
25
        controlSystem/closedLoopSystem.c
26
        controlSystem/buffer.c
27
        controlSystem/temperature.c
28
        controlSystem/errorHandling.c)
29
SET(FILES_INPUT
30
        input/adc.c
31
        input/sensors.c
32
        input/buttons.c)
33
SET(FILES_CONFIG
34
        configChange/properties.c
35
        configChange/menueStructure.c
36
        configChange/menueService.c
37
        configChange/clock.c)
38
SET(FILES_OUTPUT
39
        output/out_highVoltage.c
40
        output/out_lowVoltage.c
41
        output/displays.c
42
        output/display_7segment.c
43
        output/display_7segment_control.c
44
        output/display_7segment_error.c
45
        output/display_7segment_menu.c
46
        output/display_7segment_time.c
47
        output/disp_16x4.c
48
        ${FILES_PRINT}
49
        output/dummy.c)
50
SET(FILES_SIMULATION
51
        simulation/terminal.c
52
        simulation/triggerInterrups.c
53
        simulation/windows.c
54
        simulation/portable_getch.c)
55
56
SET(FILES_TWI
57
        i2c/twi_master.c
58
        i2c/i2c_RWRegister.c
59
        i2c/i2c_buttons.c
60
        i2c/i2c_HT16K33.c
61
        i2c/i2c_RTC.c
62
        i2c/i2c_RTC_advanced.c
63
        i2c/i2c_lcd.c
64
        i2c/i2c_lcd_advanced.c)
65
SET(FILES_LIBS
66
        countdown.c)
67
SET(FILES_
68
        timer_0.c
69
        timer_2.c
70
        inits.c
71
        ${FILES_LIBS}
72
        ${FILES_CONTROL}
73
        ${FILES_INPUT}
74
        ${FILES_OUTPUT}
75
        ${FILES_CONFIG})
76
77
if (COMPUTER)
78
    SET(MICROCONTROLLER OFF)#TODO compile both
79
    message(WARNING "Settting up build for x68")
80
    SET(FILES main.c ${FILES_}
81
            ${FILES_SIMULATION})     # <-- Quelldatei(en)
82
83
84
    add_definitions(-DALLOW_PRINTF)
85
    add_definitions(-DGCC)
86
    add_definitions(-DTEST)
87
    project(Computer C)
88
89
    SET(CMAKE_C_STANDARD 99)
90
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
91
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")
92
    add_definitions(-DCMAKE_BUILD_TYPE=Debug)
93
94
    #SET(SOURCE_FILES ${FILES})
95
    add_executable(${CMAKE_PROJECT_NAME} main.c ${FILES})
96
97
98
    include_directories(/opt/local/avr/include)
99
endif ()
100
101
if (MICROCONTROLLER)
102
    message(STATUS "Settting up build for AVR")
103
    SET(FILES main.c ${FILES_}
104
            ${FILES_TWI})     # <-- Quelldatei(en)
105
    add_definitions(-DAVR_GCC)
106
    add_definitions(-DTWI)
107
endif ()
108
109
110
#============================================================================================
111
if (MICROCONTROLLER)
112
    CMAKE_MINIMUM_REQUIRED(VERSION 2.8.4)
113
114
    SET(CMAKE_SYSTEM_NAME Generic)
115
116
    #============================================================================================
117
    PROJECT(DentaGel2)   # <-- Prjektname
118
119
    #SET(FILES main.c)        # <-- Quelldatei(en)
120
121
    SET(DEVICE atmega16)  # <-- MCU
122
    SET(FREQ 8000000)   # <-- MCU-Frequenz
123
    SET(F_CPU FREQ)
124
125
    #SET(AVRBIN /opt/local/bin)    # <-- Toolchain
126
    SET(AVRBIN /usr/bin)      # <-- Toolchain
127
    SET(AVROBJCOPY avr-objcopy)  # <--     ""
128
    SET(AVRSIZE avr-size)   # <--     ""
129
    SET(AVRDUDE avrdude)   # <--     ""
130
131
    SET(PROGRAMMER avrispmkii)  # <-- Programmertype
132
    SET(PORT usb)            # <-- USB bzw. Schnittstelle z.B. /dev/cu.usbserial....
133
    # SET(BAUD 57600)            # <-- Übertragungsrate
134
135
    SET(EEPROM NO)                # <-- soll eine x.eep Datei erstellt werden?
136
    SET(FLASH NO)           # <-- soll Geflasht werden?
137
138
    #============================================================================================
139
140
    SET(CMAKE_C_COMPILER ${AVRBIN}/avr-gcc)
141
    SET(CMAKE_CXX_COMPILER ${AVRBIN}/avr-g++)
142
143
    SET(CMAKE_C_FLAGS "-Os -mmcu=${DEVICE} -DF_CPU=${FREQ}UL -std=gnu99 -Wl,--gc-sections")
144
    SET(CMAKE_CXX_FLAGS "-Os -mmcu=${DEVICE} -DF_CPU=${FREQ}UL -Wl,--gc-sections")
145
146
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin")
147
    set(CMAKE_PREFIX_PATH /opt/local/avr)
148
    set(CMAKE_EXECUTABLE_SUFFIX ".elf")
149
150
    include_directories(/opt/local/avr/include)
151
152
    SET(SOURCE_FILES ${FILES})
153
154
    #============================================================================================
155
156
    ADD_EXECUTABLE(${CMAKE_PROJECT_NAME} ${SOURCE_FILES})
157
158
    ADD_CUSTOM_COMMAND(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${AVRBIN}/${AVROBJCOPY} -O ihex -R .eeprom ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_PROJECT_NAME}.elf ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_PROJECT_NAME}.hex)
159
160
    if (EEPROM)
161
        ADD_CUSTOM_COMMAND(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${AVRBIN}/${AVROBJCOPY} -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_PROJECT_NAME}.elf ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_PROJECT_NAME}.eep)
162
    endif (EEPROM)
163
164
    ADD_CUSTOM_COMMAND(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${AVRBIN}/${AVRSIZE} --target=ihex ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_PROJECT_NAME}.hex)
165
    ADD_CUSTOM_COMMAND(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${AVRBIN}/${AVRSIZE} --target=ihex --mcu=${DEVICE} -C ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_PROJECT_NAME}.elf)
166
167
    if (FLASH)
168
        ADD_CUSTOM_COMMAND(TARGET ${CMAKE_PROJECT_NAME} POST_BUILD COMMAND ${AVRBIN}/${AVRDUDE} -p${DEVICE} -c${PROGRAMMER} -P${PORT} -b${BAUD} -U flash:w:${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${CMAKE_PROJECT_NAME}.hex)
169
    endif (FLASH)
170
171
172
endif (MICROCONTROLLER)

Zeile 4+5 sind jene, welche ich vorm bauen "toggel" und dann noch in
1
cmake-build-debug-gcc
2
cmake-build-default-avr-gcc
die "CMakeCache.txt" lösche.

Vermutung: Für den avr-gcc setze/überschreibe ich ALLE Variablen. Bei 
gcc greife ich vermutlich auf "Defaults" der IDE zurück!?

Grüße David

von Zweig (Gast)


Angehängte Dateien:

Lesenswert?

Leider ist es nur möglich eine (1) Toolchain je Ausgabeverzeichnis zu 
verwenden. Das ist eine Einschrängung von CMAKE.

Die Lösung ist also eine weitere Build Configuration in CLion anzulegen.

Damit ist es dann einfach zwischen deinen beiden Erzeugnissen 
umzuschalten.


beim Aufruf von CMAKE kann man Variablen bereits setzten. Diese kann man 
dann abfragen

von D a v i d K. (oekel) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ah...
Ich hatte nicht gemerkt, dass die grau eingeblendeten Parameter 
(vermutlich aus der CMakeList.txt angezeigt) durch meinen Eintrag 
erhalten bleiben.

Es ist also ein echtes "append" (steht ja auch drunter)

Nun passiert tatsächlich genau was ich will. (Es werden alle 
C-Make-Profile nacheinander gebaut. Und da jedes einer Toolchain 
zugeordnet ist, kommen auch zwei targets raus)

Letzte Frage:
Kann ich einträge dieser Profil-Liste einzelnd bauen?
Unter Build habe ich nur die Möglichkeit von "Build Project" Ich denke 
nicht, dass die Run/Debug-Configurations dies ermöglichen, oder 
vielleicht doch?

Grüße David

von D a v i d K. (oekel) Benutzerseite


Angehängte Dateien:

Lesenswert?

D a v i d K. schrieb:
> Kann ich einträge dieser Profil-Liste einzelnd bauen?
> Unter Build habe ich nur die Möglichkeit von "Build Project" Ich denke
> nicht, dass die Run/Debug-Configurations dies ermöglichen, oder
> vielleicht doch?

Scheinbar doch ;)

von Zweig (Gast)


Lesenswert?

Du scheinst noch nicht lange mit dem CLion zu arbeiten.
Ich nutze den schon eine ganze Weile.
Und meine Begeisterung für diese Tool wächst und wächst.

Immer noch!

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Zweig schrieb:
> Du scheinst noch nicht lange mit dem CLion zu arbeiten.
> Ich nutze den schon eine ganze Weile.
> Und meine Begeisterung für diese Tool wächst und wächst.
>
> Immer noch!

Normalerweise bin ich gegen Werbung, aber ich bekomme auf der Arbeit die 
Ultimate-Lizenz von IntelliJ und habe da bereits das gleiche Phänomen 
der Begeisterung.
Sobald meine DemoLizens für Clion ausläuft muss ich dringend prüfen, ob 
dessen Inhalt nicht ähnlich wie bei PHPStorm bereits ootb in IntelliJ 
enthalten ist. (Ich vermute nein, aber habe bereits ein C/C++ Plugin 
gesichtet)

Wäre ja genial, wenn mir der Arbeitgeber (unfreiwillig) auch die IDE für 
mein Semi-Hobby stellt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.