From c05350ef676c43fe2646a5233d56f5b2b452e060 Mon Sep 17 00:00:00 2001 From: Adrien Jaguenet Date: Tue, 9 Sep 2025 09:09:42 +0200 Subject: [PATCH] Server/Client build separation --- Makefile | 65 +++++++++++++++++++++++--------- doc/cd_GameState.odg | Bin 12606 -> 20345 bytes src/{main.c => client/client.c} | 3 +- src/{ => client}/gfx_context.c | 0 src/{ => client}/gfx_context.h | 5 ++- src/{ => common}/game_state.c | 0 src/{ => common}/game_state.h | 0 src/{ => common}/util.h | 0 src/{ => common}/world.c | 0 src/{ => common}/world.h | 19 +++++----- src/server/server.c | 7 ++++ 11 files changed, 71 insertions(+), 28 deletions(-) rename src/{main.c => client/client.c} (98%) rename src/{ => client}/gfx_context.c (100%) rename src/{ => client}/gfx_context.h (73%) rename src/{ => common}/game_state.c (100%) rename src/{ => common}/game_state.h (100%) rename src/{ => common}/util.h (100%) rename src/{ => common}/world.c (100%) rename src/{ => common}/world.h (85%) create mode 100644 src/server/server.c diff --git a/Makefile b/Makefile index 04b285a..68f3235 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,18 @@ # To launch with debug messages: G_MESSAGES_DEBUG=all ./librefront -SRC := $(shell find src -name '*.c') -OBJ := $(patsubst src/%.c, build/%.o, $(SRC)) -DEP := $(OBJ:.o=.d) +SRC_DIR := src + +COMMON_SRC := $(shell find $(SRC_DIR)/common -name '*.c') +SERVER_SRC := $(shell find $(SRC_DIR)/server -name '*.c') +CLIENT_SRC := $(shell find $(SRC_DIR)/client -name '*.c') + +COMMON_OBJ := $(patsubst $(SRC_DIR)/%.c, build/%.o, $(COMMON_SRC)) +SERVER_OBJ := $(patsubst $(SRC_DIR)/%.c, build/%.o, $(SERVER_SRC)) +CLIENT_OBJ := $(patsubst $(SRC_DIR)/%.c, build/%.o, $(CLIENT_SRC)) + +COMMON_DEP := $(COMMON_OBJ:.o=.d) +SERVER_DEP := $(SERVER_OBJ:.o=.d) +CLIENT_DEP := $(CLIENT_OBJ:.o=.d) CC := gcc LD := gcc @@ -11,30 +21,51 @@ RM := rm -f DEBUG ?= 1 -CFLAGS := -std=$(STD) -Werror -Wextra -Wall -MMD -MP `pkg-config --cflags sdl3 sdl3-image glib-2.0` -LDFLAGS := -std=$(STD) -lm `pkg-config --libs sdl3 sdl3-image glib-2.0` - -TARGET := librefront +COMMON_CFLAGS := -std=$(STD) -Werror -Wextra -Wall -MMD -MP -I$(SRC_DIR) `pkg-config --cflags glib-2.0` +COMMON_LDFLAGS := -std=$(STD) -lm `pkg-config --libs glib-2.0` ifeq ($(DEBUG),1) - CFLAGS += -g -DDEBUG - LDFLAGS += -g + COMMON_CFLAGS += -g -DDEBUG + COMMON_LDFLAGS += -g else - CFLAGS += -O2 -DNDEBUG + COMMON_CFLAGS += -O2 -DNDEBUG endif + +CLIENT_CFLAGS := $(COMMON_CFLAGS) `pkg-config --cflags sdl3 sdl3-image` +CLIENT_LDFLAGS := $(COMMON_LDFLAGS) `pkg-config --libs sdl3 sdl3-image` + +SERVER_CFLAGS := $(COMMON_CFLAGS) +SERVER_LDFLAGS := $(COMMON_LDFLAGS) + +CLIENT := librefront +SERVER := librefront-headless + .PHONY: all clean -all: $(TARGET) +all: $(CLIENT) $(SERVER) -$(TARGET): $(OBJ) - $(LD) $^ -o $@ $(LDFLAGS) +$(CLIENT): $(COMMON_OBJ) $(CLIENT_OBJ) + $(LD) $^ -o $@ $(CLIENT_LDFLAGS) -build/%.o: src/%.c +$(SERVER): $(COMMON_OBJ) $(SERVER_OBJ) + $(LD) $^ -o $@ $(SERVER_LDFLAGS) + +build/common/%.o: $(SRC_DIR)/common/%.c @mkdir -p $(dir $@) - $(CC) -c $< -o $@ $(CFLAGS) + $(CC) -c $< -o $@ $(COMMON_CFLAGS) + +build/client/%.o: $(SRC_DIR)/client/%.c + @mkdir -p $(dir $@) + $(CC) -c $< -o $@ $(CLIENT_CFLAGS) + +build/server/%.o: $(SRC_DIR)/server/%.c + @mkdir -p $(dir $@) + $(CC) -c $< -o $@ $(SERVER_CFLAGS) clean: - $(RM) -r build/ $(TARGET) $(OBJ) $(DEP) perf.data* massif.out* + $(RM) -r build/ $(CLIENT) $(SERVER) perf.data* massif.out* --include $(DEP) +-include $(COMMON_DEP) +-include $(CLIENT_DEP) +-include $(SERVER_DEP) diff --git a/doc/cd_GameState.odg b/doc/cd_GameState.odg index 26631c4a52e26d4498d2335c1778a275bf12611c..353c57ac71bf14046874baac6562d5b3f499e9b6 100644 GIT binary patch delta 15386 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 delta 7694 zcmex4k8xiTcYrrDiwFY)2LprZMD74a)yaxXhOA)j{ui zWbVu>sms3QO`du7O4X#8yVEsiwWz!cVsQ@Iw6|VK{{8>E`kV~=I7B$RHmP(^t6p|$ z8-vM(j0c$|=Cd!%wzpez=pvhXro*D`$+1_DDa%wI;a_z0_Q(7CYS#N4udn$opMRo8 zuHwfr^?OyVi+w(NOu2Yp*-Lh*d7j9cdwthEOX{8Pn0VwXmA77=eP*|!VV~Em*}2i? zix=PhaPZTi6491g>xA5wKUUB9RwSOZakj-l&D;~a-`}3=q5SRX(v=hU%Ia^{**DYY z-TU`ftDRL(CVhIkoO5-s(Vq#vr>=D$`F?oYHIK_ZCzBrSp1C@QspkLeNskg|u8q?C zax=&5;nvX0CKKvQ*82Z@e))KGerNbPA(zZ&ZgTg6e*Rv$>R9olH9?-$CMQ>)K4ur` zS-nhGWY0pTwNcCCgpNeMzxs6T(bfd#?@QBiU88ngo+c#euRcFR_5a70$v5rpKdW`u zc2Mkb=UCa6%u?AMWc5tt|DL&#_b19-3YaN;a^3Rgd*yvq^I0VQR@E=%YkndA^H}oM zt4`|gYM)Oj$vt$7V@}1~ITd*?Lg(hsKK5GWNpDSllk*w1d446K>mM9_p>c<+P_^4j z@a##ePsMMZeLBo<=*JZHv~A9tW!Id2U#9dYzTf(+*Y#D->GN@qa?(?b-tRxEA-n2W z$;(US?>F9TF&7Ho@IGRVZs>2N#r1VbKmMNNjbGyXXic+!_M`_hRAzR3YEN3Rs_^zK zp+g}&AD@Rjycp}7#QEj&*+t)P<%tPpRC=4g+AGt^-Dw_c-i+ciIKa9=LZFFLmBQQ*IsA3v7;Vf_E*U#;z~Qst@_ z7te;6Ep9vY`1Z%`c|Mokx0qEPtO$8MX=|vM#UkNFRfe@b#(P$ob~c|`oPP6|FB9Jf zPjmnK>Jr`(LaWZ5Jb1ieo$Y;#yOVBaUU#NLco_qg)>My?i{r65SDZA5V_xXM?=HEFH8?Z}GCQsU)dwP90Q`p5rH?}>y@loCA zZ0MBTuX_xRpAN3DpX&A4KKstEjd8qT8zN`0dA-qVIcer8?%7;2amPoa564skKSp-0 zoOaAp?7-D*r>^`&s;x#Zpxj_ixzeA#tIv#pq~x@U9B^7yfVRU2k1q zpYdy|-qUcC->2+m{j}4Ry3cO+Ing9^Gf#f#>Q5dXFJAtV?)|TQEMjNs|`&IyFh<;QAIx<}PVA?psgKzc%51*1wzAJZJ8n+|AaL0&_&x zO88B2b$T~dl~2rD>#$B_@UrJm(nRZBLKhx;7CB|=X8o?D>*)`LRh12eJJ&6o+f}pY z+b)6g#(Ex4-ds^Rdcf(b?cHjw&d&wxzXMK{z5I1You@|LeXCRJs%DY&Q_SyIMy;uO znw*`g`FG{9fBo}0ZgZ9Bx%=7M7BJl5ZTNll;N1V#l6N%qmPY7D++*Cm(l2*4XGQQ; zpZaLFU$H-!UYzHs5_aHUP;d0&VMD!V#CC?);q9dxo-@7^+HsrV`|9T3OW#&HZ}nZy zSrJ{TWi0>Zr+3pm#tY0Z4$i9=jhN4LZ9U)Xg!9aIR14-a-dWH0Zu<7;yv(MI_MvlE zGJgBR;IKZsp~}Hl;>&vGHD7VM#p@0&RX)Ddm?vhQLbmVzf?HAh%%cJdvs~u<`%)bz5OVzXyN^p| z_36y$DbsGLy}x4hx4(Hu%Wg+I-~XC!U!*tZD{BVhmOTnv9Cls#TA3_RB+IaZ{nZ4= zQ&+w|{CmkT+-0wB{o>Aw6P%Qc>xE6yOj0oS@snq@wiM>==##M z$V2>`4&xSvs5pTrh1Ms(_84~TjNglP_`Z!~ob)R6MgZdLI#!Gbv4zMxr7LT$sZ<=@2)MmNn=UE-vxo*3S7{cVlIVKl}36Ctr5Eo;}}Pa^J+Pfw#-PPkY$0TB@yQ!bW{;emc z+`TKV9s4bOMf{wLs$na*x?UJfGrBu-&ZA`|d++ttt4KbaEWP*t=Xkg6@3VPtnw)O? znR3)?-GlC1R_sj0vb+}3a*;jWf!Hkju<(RhmL2Hf2UH-o|!R?S9@5<`Q3JADvgTWDGWK-WvbRZ~HEmsjOPuAz~}m zIEREOhuPPB?x*ydVtcNKub;N;aFF-gH!*Lg$Ke0aLK2@%9YWv5g zA6H+?Z{T#)ZCq_tu=Pqszw8wun`YKt*0w7Nrqk|KaMvHm)6tmyI@GLO<;(dsS$)QR zE^O?HQk^`!ac4`G9coHtsXxUvMO0&TqQ+`{-q@qNdFI zoLC-S+K`h{$gI=O=WP(b{ydckIr{2Tw&`?lyNlD*I7>HNTFcPKVh0dmqkh zxDorn#$9Lo*_-KmcbR_QxU1kw|JPS~=cd^HOW^I^b^Ft{ON-9CPOh04@TontLik7i z@y2|y+Nt&Py$%)hPMyILxNWVToZf(UE83G2cML= zu3I^48TXTtbcwRk$B&LF>zVtGA zvA6Wpvsrp~CAKFDb54J(m2~y_Cbbgzn@e|p5sys&>CoC_@>A4sPfB&-y0>Re9b!*A zp3$aZ>Xo$Nr=8%}YnKK0_g|T|{-j-y`#zc99?R!iE!$XJ{c=X+_hq?nx7^zDr=_!d zbI={WtIk1HO>Sp@>2LXGe7|1nsOHgGQ`N&_3c44o?p}K$Tx`agf@wBI`^*^k{TEJD zlE_qEay#ndW}A{G6~)ei%+KdqFIARS_WwGU`o@M)@t~aTGO@(SsEvZVbENB~Ha6Oe zIbV;E$gR&_{9pF(iSsYm)>S#3o#1q~hUXz>}o6_Hw(1lwno`1bzIUe$A>{{CX= ztV=3aN;2Z_JZ9@SY3uibqeS>|YtDZeYnMHIpJOI(?%P}>Z)blw!134o#0`ns#qJ&* zcVE~v|M_0^)Gb}^$nw9(Yu^9=@KA=iVE634kMsVreN_qcf0lW5^0ISV^t>I?;~yn{ zH)WkAratSdIoqsf@9MImv%J16e7EKE_sOU0&o({IdCGTr!TgmqECTB5+43rHF52$h zlci_KG+iPlsi0H;xlpwGjw5`gyH*GLKNETVNN?$zTYMEquD=wlFM6!+*m3aL6o<2R zho0rM&RXcF8_j0AYO?Qd7CFP6{WDeAQGi+k)nr zgPxDrE{fOxdTI0T3A@eliT!_zf3LOQS@$6A_i;u6wR0;SSBSFbX>+89Fe(@PKJa$8 z)dtyD-(H$-_h;YEf5)!ix8Cz_zWoKi)3l7{)aKn^6VqtKly!lLJ7)julE42PCtYBl z9n7@trl486_6>@25db$1$ znIHbHXLq`NYZmPbvXYSgrT#{-^E+p?)y1vB`B|}7br)v`Tdzv~Zs&MlX4S`YS9aT9 zxv+hCVch(k( zKW{(t&=8Rp?-Ou+t$ue2PhUy1(bm9{Qmea0WZ z@T>Q?JEw0lK9!<9aqp#x&kxS^vRbyva#6tqtENMIfS=q*_$rvsr{!9PY^=uRO--^ETsy{DL30X2L_)4Qm?A4y& z6qYBI3};{X{Bt|9Gs!q|!=uj6@k}?TH9fB{Q@=g)_>xsy-uT42x?MlFByNh`+iEt4 zl;=m?%i{R&@O65h2oC;sM0HzWP^`g|D|`k@UBXA+v3RId5T%` zQ+tFuS4zaH(C*|Hs|wpJj#)O@c>L3O;+tE_N z`svTZ9Wx%LFjzlZ)Ew3jXrs8BJHhys?e~3OIhra3&Qu$ASS!qEe{#O;o2sO5s5{5? zmq|G*dFMkvxa(rT5@V;qQo8I;sZB5r%m+l|^ z$Uj6rLiyH%89#(4*-x?vRAJ0y%96RLVec#8Xzl&NQ_jRLwC>^-xx|ILKc>1yoazm( zYvSN`iBLFHw3Fks;re+u4>c#h)SZ)I9($#&+G4%=u}g=)@5@`gMgCQNUnTom-cpab z=XM1?-!nzq(sokX{q@T0JG^UnF7+%m{yV|l@ySo04QquS&)9z8*3_Rq=DW6uUV3qH zy>kWQA@1<@9n6Qg+y3nQ71C!d7UyuKMC_AJ$v?ARRf&L(rgK4W-yRKet@6%u+ImcU zP1Hv}p#bB33EZvLFI`h>7$c{goLIju@R(V~GYjunhrojEApBkBirLQ z?+pVlW*_shQCj)r;^_`!iS+vZlQ+)(-x%_oN568e#kmXL=S*pTm|lG}J&X78>A-A7 zslc4t{$tH^cn==6>^PUV{B=E#oYPj@zekP>wq;5DeJrB1^iq2WN03Il@awlnm~xk% zt6%r~&Fglh%7DF9E5rGeowsh8cKi06U$;GZHBQzB=l1VfxUKhjKVRj<*?aYhXYagu z^8U<|(+!m-3aKB|I$>rT9yCAmc%GkfmiEw!f_C)Fp!>x6E&^zCU# z#vPI9_4>+rMAw@yoMY_*pnI)e@OxITj{*3F}R`_w`=OR*Be@ zlgcL*T#Pqwn3Bu_AJ9{V9$kRbL`j zEvO1w9UF4}{@xNkL7kk+jY7VjCYOC3oi6x3Hh+61-SMpad!c46GhyEA%~mNj@eIH7 zj!sW((Fo?7Z7`9kS6}VJ??bugZXWrxbjHSn_$gm+&;C4pPUrFWb}>3)$GhDg?f-T3 zsH%DzAtU*ThU~UO zQF5#9)Ff^AA!i$RZO{DYHHo+MCQnxOuHPGRQiexn>n-=>2%ZG*KV_>k$8gYUI9x7F5gd});97V=#(brO4iNQ_Xe3)2sukOM7c z>PP;`8Zquv;(M@c_e=W+v-cfxd>-T`WIjcr1zE0HIBqO(qFOrXm{$dayX({;A=UPEXgG#((bj zjOHp+N0H;((_gEfnSFa^uAXRH)jDABBWw+vNJwM5+;Hbm*lpeo* zkIvN3IdCZ^c-m}}(;c2HF=snD9>lGy{PFN;kLBV8?hD>MRjTIY3UYouwTIQC?^x5v zPye5v6z{7nT5MsxXOc_iiL3kKv}e7oYk2-Tj&E;&jc)kI$=_8ce%`9bn(G<0=u7}*Wlx%VVQPG4Q*Z5|hf~i+8*Hs-Ta?Vo|A^J!Ths60mI_%v#^7*?!ic`wqe{uj zms~$99yx0rWWd~7z1CbxW4Ux~A60pDbXKi2iZ2-nH~2=M;|^)2`P1M{}RLawfaEOmvu-Vb^!~!qf@U zNq>GGS@yL3ccS0tuV-(sRBF0a=CJ0+?p5=IS+8>N%O*eg?)Lrc?TF^Cj+y(tOIKty z3wJC!9(9h}jZ5z7^(L#(wFPaDgDgYO=wCGarK~n*=G(iW&*mII z-Ty$~U#a6~-OD#)xu;&LIb`uB>G#uFzrvj6OS&^z1x^WIxvJb|aogIwC&)ufN!{G_ zrIy9cy&I)JpZ+!PmtRcb%2*xPmM5v!&!_7y{mzqG&2@Lz&X>N2D_xWVw#|`f?%aO+ z8N2rGn5!k7k@XWg7H|e7vKAg#7T2G#J(O8@Yu?P$U%R)@)C_TJc)LHa%0St0drWT5 zruDI}cFuiwr!MI0(e6=a|x7nt%lm7jdVvgK2J8YuGgPGs&)!h2|cV+IL z^nh93fjFP`L2jV`_xwKZvt<@W@Mwt^cvU-JWcBT`pAn0fd^ zU1E>#9@AGHvF^!VWLCWneavLowV-k0l0cbb83*S{>D9%b);YI{$MQYX-~SRHR~z~* zuaEYgQGP@AFZvui|4#zw%7XcEXakE?{a~- zS~-8rm*t21OR8@q<+oatc>QC_67XBR+ut@nV#1mFz&Md&x0ADnH~zkhu9x@D*NId8td&e9iB_f)dZe=GdskJO8g zW*LW9K7aGcA}nuxjK0sq$4A^#`}ESf*X>n*8V`#9qwl6&y3feK(8~ggfA9pDre^ee zPUeIsx{M4Ax{Q+pwVZ@F1AIbU|NsBbz`*eT|Npx8{r;2xYl+u0obq&W45_&F_8=oK z0|UdM1>gO1`PoGn=mhGiXwQe_s~rrCW@+VaAVWP}{an^LB{U&5Q#3WBK{7Bb%D}*| z`MqZ-BctkMS8r3$OrY@OK5seW+|<0%q{Jfq0B=Sn5eDcKBbsIzm?>boed0sm$y`i) z+(;TG>-owu9t26m`-;h{;?@5Xq-+KwivEcgg?Ye+g9&5C$pMTq=;kwJGESCYltUIq z)wYmvvc8WRqbkTTOxHmiv55ybkkwDF_LgPhXPTI+3>Ag6=-B+sc|mT5xA-P|`RQSSGiS*B^)lizxZiv@VIvVr6T7z7x!Sr{1p>VS9vw#L9f diff --git a/src/main.c b/src/client/client.c similarity index 98% rename from src/main.c rename to src/client/client.c index e710d1b..bd1b65f 100644 --- a/src/main.c +++ b/src/client/client.c @@ -4,7 +4,8 @@ #include #include -#include "util.h" +#include + #include "gfx_context.h" static GfxContext *gfx_ctx; diff --git a/src/gfx_context.c b/src/client/gfx_context.c similarity index 100% rename from src/gfx_context.c rename to src/client/gfx_context.c diff --git a/src/gfx_context.h b/src/client/gfx_context.h similarity index 73% rename from src/gfx_context.h rename to src/client/gfx_context.h index da41892..246a84a 100644 --- a/src/gfx_context.h +++ b/src/client/gfx_context.h @@ -3,7 +3,8 @@ #include #include -#include "util.h" +#include +#include typedef struct GfxContext { @@ -15,3 +16,5 @@ GfxContext *GfxContext_new (); void GfxContext_prerender (GfxContext *self); void GfxContext_postrender (GfxContext *self); void GfxContext_free (GfxContext *self); + +void GfxContext_renderWorld (GfxContext *self, World *world); diff --git a/src/game_state.c b/src/common/game_state.c similarity index 100% rename from src/game_state.c rename to src/common/game_state.c diff --git a/src/game_state.h b/src/common/game_state.h similarity index 100% rename from src/game_state.h rename to src/common/game_state.h diff --git a/src/util.h b/src/common/util.h similarity index 100% rename from src/util.h rename to src/common/util.h diff --git a/src/world.c b/src/common/world.c similarity index 100% rename from src/world.c rename to src/common/world.c diff --git a/src/world.h b/src/common/world.h similarity index 85% rename from src/world.h rename to src/common/world.h index 80ee669..5f11062 100644 --- a/src/world.h +++ b/src/common/world.h @@ -19,14 +19,6 @@ typedef struct MapTile gboolean is_defended : 1, is_radiated : 1; } MapTile; -typedef struct Building -{ - MapTile *parent_tile; - unsigned int level; - - unsigned int (*at_what_cost) (Building *self, World *world); -} Building; - typedef struct World { unsigned int width, height; @@ -34,6 +26,15 @@ typedef struct World GArray *buildings; } World; + +typedef struct Building Building; // Typedef is needed to avoid circular dependency +struct Building +{ + MapTile *parent_tile; + unsigned int level; + + unsigned int (*at_what_cost) (Building *self, World *world); +}; + World *World_new (unsigned int width, unsigned int height); void World_tick (World *self); -void World_render (World *self, GfxContext *gfx_context); diff --git a/src/server/server.c b/src/server/server.c new file mode 100644 index 0000000..604ee00 --- /dev/null +++ b/src/server/server.c @@ -0,0 +1,7 @@ +#include + +int main () +{ + fprintf(stderr, "Server not implemented!\n"); + return -1; +}