From 078523ebad94f5d6711cd1db2fa659dc207dc7e5 Mon Sep 17 00:00:00 2001 From: Florian Briand Date: Fri, 5 Jul 2024 23:30:11 +0200 Subject: [PATCH] chore: Make the compilation and linking crossplatform (win, linux) --- .env.linux.example | 2 ++ .env.win.example | 2 ++ .gitignore | 4 ++++ Cargo.lock | 7 +++++++ Cargo.toml | 4 ++++ README.md | 19 +++++++++++++++++-- build.bat | 36 ++++++++++++++++++++++++++++++++++++ build.rs | 37 ++++++++++++++++++++++++++++++------- lib/p4pillondebuglib.lib | Bin 0 -> 5656 bytes lib/p4pillondebuglib.obj | Bin 0 -> 4896 bytes lib/ssvw64.exp | Bin 0 -> 1149 bytes lib/ssvw64.lib | Bin 0 -> 2104 bytes src/ssvlib_demo.rs | 10 ++++++++-- src/ssvw64.def | 5 +++++ 14 files changed, 115 insertions(+), 11 deletions(-) create mode 100644 .env.linux.example create mode 100644 .env.win.example create mode 100644 build.bat create mode 100644 lib/p4pillondebuglib.lib create mode 100644 lib/p4pillondebuglib.obj create mode 100644 lib/ssvw64.exp create mode 100644 lib/ssvw64.lib create mode 100644 src/ssvw64.def diff --git a/.env.linux.example b/.env.linux.example new file mode 100644 index 0000000..c8d84aa --- /dev/null +++ b/.env.linux.example @@ -0,0 +1,2 @@ +SESAM_FSV_VERSION=1.40.13 +SESAM_INI_PATH=/etc/opt/santesocial/fsv/${SESAM_FSV_VERSION}/conf/sesam.ini diff --git a/.env.win.example b/.env.win.example new file mode 100644 index 0000000..bcd5177 --- /dev/null +++ b/.env.win.example @@ -0,0 +1,2 @@ +SESAM_FSV_VERSION=1.40.13 +SESAM_INI_PATH=${ALLUSERSPROFILE}\\santesocial\\fsv\\${SESAM_FSV_VERSION}\\conf\\sesam.ini diff --git a/.gitignore b/.gitignore index ea8c4bf..e6bb1c8 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ +# Ignore Rust target directory /target + +# Ignore .env file +.env diff --git a/Cargo.lock b/Cargo.lock index 72980c3..4d677ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,12 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + [[package]] name = "libc" version = "0.2.155" @@ -12,5 +18,6 @@ checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" name = "utils-debug-c-lib" version = "0.1.0" dependencies = [ + "dotenv", "libc", ] diff --git a/Cargo.toml b/Cargo.toml index 837c7be..87392b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,5 +4,9 @@ version = "0.1.0" edition = "2021" build = "build.rs" +[build] +rustflags = "-L ./lib" + [dependencies] +dotenv = "0.15" libc = "0.2" diff --git a/README.md b/README.md index 16fff43..91ec9d6 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,23 @@ ## Setup - Installer le [package FSV](https://industriels.sesam-vitale.fr/group/fournitures-sesam-vitale) -- Ajouter le path des librairies FSV à `LD_LIBRARY_PATH` : `export LD_LIBRARY_PATH=/path/to/your/library:$LD_LIBRARY_PATH` + - Linux : ajouter le path des librairies FSV à la variable d'environnement `LD_LIBRARY_PATH` avant execution + - Windows : ajouter le path des librairies FSV à la variable d'environnement `PATH` avant execution - Installer la [CryptolibCPS](https://industriels.sesam-vitale.fr/group/galss-cryptolib-cps) - Fourni l'utilitaire "CPS Gestion" pour obtenir des informations sur le lecteur de carte, etc. - - Linux : `cpgeslux` \ No newline at end of file + - Linux : `cpgeslux` + +- Créer un fichier `.env` en s'inspirant d'un des fichiers d'exemple (`.env.linux.example`, `.env.win.example`...) + +## C Compilation + +Pour compiler les fichiers de librairie : + +- Windows : `.\build.bat` +- Linux : `make` + +Pour nettoyer le dossier `./lib` : + +- Windows : `.\build.bat /clean` +- Linux : `make clean` \ No newline at end of file diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..aecec45 --- /dev/null +++ b/build.bat @@ -0,0 +1,36 @@ +@echo off +rem Set variables +set SRC_DIR=src +set LIB_DIR=lib + +rem Create the %LIB_DIR% directory if it does not exist +if not exist %LIB_DIR% mkdir %LIB_DIR% + +if "%1"=="/clean" ( + goto clean +) + +rem Configure the environment for Visual Studio +call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 + +rem Build %SRC_DIR%\*.c files +cl /c /Fd:%LIB_DIR%\ /Fo:%LIB_DIR%\ /Iinclude\ /I%SRC_DIR%\ %SRC_DIR%\*.c + +rem Link the object files into a static library +lib %LIB_DIR%\*.obj + +rem Create a ssvw64.lib file from a ssvw64.def file +lib /def:%SRC_DIR%\ssvw64.def /out:%LIB_DIR%\ssvw64.lib /machine:x64 + +rem Build complete +pause +exit /b 0 + +:clean +del %LIB_DIR%\*.obj +del %LIB_DIR%\*.lib +del %LIB_DIR%\*.exp + +rem Clean complete +pause +exit /b 0 diff --git a/build.rs b/build.rs index eb6d53f..2f26f67 100644 --- a/build.rs +++ b/build.rs @@ -1,9 +1,32 @@ -fn main() { - println!("cargo:rustc-link-search=native=./lib"); - println!("cargo:rustc-link-lib=static=p4pillondebuglib"); - println!("cargo:rerun-if-changed=lib/libp4pillondebuglib.a"); +// use std::env; +// use std::path::PathBuf; - println!("cargo:rustc-link-search=native=/opt/santesocial/fsv/1.40.13/lib"); - println!("cargo:rustc-link-lib=dylib=ssvlux64"); - println!("cargo:rerun-if-changed=/opt/santesocial/fsv/1.40.13/lib/libssvlux64.so"); +fn main() { + // --- OLD VERSION --- + // In fact, the commented code is not necessary + // Indeed, the static library is automatically found + // when the directory is provided by rustflags in Cargo.toml + // The dynamic library is found in the PATH or LD_LIBRARY_PATH + + // let static_lib_path = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()).join("lib"); + // println!("cargo:rustc-link-search=native={}", static_lib_path.display()); + // println!("cargo:rustc-link-lib=static=p4pillondebuglib"); + // println!("cargo:rerun-if-changed={}", static_lib_path.join("libp4pillondebuglib.lib").display()); + + // let dynamic_lib_path = PathBuf::from("C:/Program Files/santesocial/fsv/1.40.13/lib"); + // println!("cargo:rustc-link-search=native={}", dynamic_lib_path.display()); + // println!("cargo:rustc-link-lib=dylib=ssvw64"); + // println!("cargo:rerun-if-changed={}", dynamic_lib_path.join("ssvw64.dll").display()); + + // --- NEW VERSION --- + + // Cross-platform libraries + println!("cargo:rustc-link-lib=static=p4pillondebuglib"); + + // Target-specific libraries + if cfg!(target_os = "windows") { + println!("cargo:rustc-link-lib=dylib=ssvw64"); + } else if cfg!(target_os = "linux") { + println!("cargo:rustc-link-lib=dylib=ssvlux64"); + } } diff --git a/lib/p4pillondebuglib.lib b/lib/p4pillondebuglib.lib new file mode 100644 index 0000000000000000000000000000000000000000..f14f1b06777502c62027758a821d1189138bda3b GIT binary patch literal 5656 zcmds5Yit}>6~5!$IF2dFHm1aR6vob!xFKDy?X6=cAz43?4(Z0RV#kT7#d^IvwzvBj zcXu6PNKl1Ch_$k6ffQQ))Cg26wN+>fG)O@SO(2n|(g+Yls*uuBK_nsssPL;OeCOPm z*%?2Qlpp-ytmf>w-~G6UcU@~tcibo7t z5~2~t`?xeY#cuU3G58fN#R8j{Z4)16(UW`kO zG*t&Ij*UhFp-6Dt%exPiwcu$Mm!^n$i^S`^$9Q|e8@Pvf#e0l*47^i!i5Eh@UjXNK z7LVp7A{LH!2k;xYW z6IZ`b?x$#7+XfF7jC^5mZ#-|L2fNM0MApa^3xmCR^GPfg7}nApd^|r{2xn4BV{pk8 zyG`u4UkoF;MU7|>H7Bratp9zfMBXfzBSp30z{4s%7P6@?r*flemzl-VH}dFcWbIXbxc!5aZR+;twr>i2bcu9%9L3h zFgTamoS=4a{M+#xTz(ad9nuoZ$Oc{(h~%fgbpcVQi3-ueo=R)@8Qu>n{c*|HZ0je_=Zzlh>qseDg7 z6RlhMhP849IT+Q(DP4k{qma>nR;WdXxy51#G!|!UzCT!BjYjh z7BJI|u2SMq_ZxP%V43yP^0MPlGdeonfG`3r$yNU-3ZLM>O06PlzebfpOvpdh8nh1$ z<0-~g6?Bj-_85i<>6Cx0AA*)1(jpJqt9`=lLHEd(&%lr#(jt#-j43M=u>x)IKN?Y1 zDq{s%v8pLw_MrPRPz_oSl#%yyn{y!l*b z%dh|R;TLE7zJBx62YsX8S^bZ`XTR6^{DZHp89Uq>`0%%db#Hf^-u=k-(zglOmALAiNX>|;K3J6C2LOjmD{&zP9h^lyci6HW)fx*FA6dw$WKJhE#mWEZ3>qi4I}Q%0h(qg#IO(qQNFL&lP(MigLbb3u2|(Kj zZ6+kk9E5U{q>>T))sB$mjAY};v;>t&C{EVMCdMaaSt5mEej$=EoU=c9$u~{u<#Sr6 zXAYeRC1SsHjynkP2XW2eDtnEg6i{r0UT#UAb|dtjD&`!7>W|{O=0Q#p%wo^aw{1WW zqD6aXlVqVgSV>5W1)ww^p}WHz&SW_*H%E@k&6$G-<(SKhd+0`Fp9u-N-W@34WY)nD z_r3a#wv3MjR60Wn!W`j#Gob^uPoZ6mTK(YpAHHAqx&(xTIi9v~oOZSKa=d+}(rN2D z`v}1tPg@^jFT1VTUz|;sy>3}v%<;6vd|pjNp|+MgZDA{5kulxl!Y3HlxH_)=>~CeS zRhUr{=6Kp#3Dl>Apo#LY4Qey~Ecuk>#T?JLR)OJD=zWK*^ocoVEeJv984~8O)d7U= zgN#Ga0U$JjGG`bFWlNcJ1PJZ*WzMvPlsVr8qIo!HfvBE1SAo#@WSpSuU5wiEDWpl> zd+MDRq!j}P+bRol*!m;l&?rbMJnw3B;PELvTqDGfPlxG&1=0E*YYMe*rN;SC(k@8Bwp&e#*9Q7T`CxfiF~R!8A}ilOPFRlWe9B| z_oY-Wsd+x>Y5a|09#$qgpZm(ZGGx*04c?+SMXS0zCX3(#+!PwAo5AIIgheyL%yTOcR@KV3C#r2qf` literal 0 HcmV?d00001 diff --git a/lib/p4pillondebuglib.obj b/lib/p4pillondebuglib.obj new file mode 100644 index 0000000000000000000000000000000000000000..6af47c74faf2a13257da48f2647ba992a0d0d490 GIT binary patch literal 4896 zcmcgwYitzP6~5zHjB!)g;HH>I+QCf1hLUB8-C#o+*6W2#$zm+l7}QwZ>|<daIRuz?SrOM6`P=Z*yPrncWY3D zb7p2@R8P7sb5Pn;wu<(cfY4j(>{32=aa&oIf}`8keY8*xv_$ zUjb*$5-2Fk@G$S7RkSlj#z+M5yykG~U~2^H$~VlSAB}I#<3&aEOgKAMsNUaIH=TtR z#5(pB)HO}p6yLG4cVA*K@zvPY4v4MTT`>#8aVtAfGRt;#c%WiEhRp({Ydl{pTIJz~E0fi(Vm@aM7xS6naR=tD z0w8Q<9ur%|1GkF|7Pn{z!1l>cVFJgW6sCHOZh z$iUFM?)6+H6~^e#M-|?bTmP%6A-$P!**T}`%{K+HMb{fSUC%a5;=v8 z&UfVK(+Z%|X)m6D_#)&=*1iP!dDh~Pbl?YgSJFBPh{KSBtQ~`t*sIX?F?I%0dbtcu zdigK3c02*G7Kg|XYY}LYXF!v@5;VzsAKHHAt!{E#4QMME8-liuHFtARFX$W(hy>Qd&rjEa-_)OBAsLG5C!j z%2GuvrMmN8d8e$CC+ZnJ9e8LJ2(g=`6q-jLy@~#$2VW0e<|H-BDasgq)hUk3-!ZAt z7}5?=dDY&-+8RiyY0!2uMq{{vHL{c1Mra0O^qr+0r}B77tsC`SjM2JS3yt>05j=*8 z&(20|zf~#b2zTmtRjJab&u_m;ecj@bJJzo{z3TK&e$g}Ye)7fq(6@Ky6aOy7PH(#U z<5=f!|MKzIXOrK(diPJt%@?pd391tqZ@x{V*+7s)g zbk9t4J=SHm5rR3sSf61lH`eUirwR?LYmOCje6g6%yNM_iYjHgmjsh;yr?+391>Wda z@1yfA4vzrNF_l%7rZ>8i>m$LAC%PLpVC}DhiN>({_&^-#Fl^tqP)ZtW7o@o8)k|{NuICSXn88&3) zb54B(KM)P`&``QKVN#HXl193m!;iYYF*94BsAhJelD8*QSprg7%PQnep-+^*kuT?T zUv!=SW0;3Ei1jQRyawdZ++I19dev#>?72@4!2@_H)Kf2m>+=XV;4Gkd2FmNs3p-x@ n#cE(&LZL5+VHKW@%Z{Pk&a~_TMM0({k9PF?R;R z1fF-GbtzBWCFaFeBJ6NzJpcEYfG!AvW-DVEj_X3PxN&>lV_{)_CM}%;<1}yckggQ> zeBZ0ED!@tH?ub0?EZS~~bhJk$8b;eAQ3~w|i7d3oB)WiBtk)om_P9hQ+EWrup%ppP zcz0(FrTE&behaGnCq%Q2I;W8oB_PQCDh(np^zZPIS^zu93N6G| zy7uDBucz#J;`haePu|`9wDaTHrOe>vwO9I^_pPn3kGekt{KU8`*#9e6B;e&(C5Kkv z+v~Ub=xm{&k1nsTO%CnV+)%FU*XjmyP_e}Bt`I#}p>}APW|~`YDcwyzqvohXXc9l literal 0 HcmV?d00001 diff --git a/lib/ssvw64.lib b/lib/ssvw64.lib new file mode 100644 index 0000000000000000000000000000000000000000..87b44b5c1b4aa4d5bf947ee09865939971392a36 GIT binary patch literal 2104 zcmcIlOK%cU6#jTti7_ZHjE{&(6YB7ygRI zAK|h;zz`QMUG#T!VLfN=y)y$+g#>SM@44sPGjq=U&f`9PS?Sb{UPWHSM@MQ^OKK@S zrDsOvNy%!OCU*xB05<{uHV|w9p)(+SDds{Iu;-BI&@{8Vg}q|g+>?8;Xtw=8D+rv0fJ+io7l0v6f($`~5QYzaxeJWm z%W+R$!r_&>v*S4dDp%x%W=tw9UKb4!q=eOK3AFx|J^Gr;ql1Vw2%um6)QI?i8-xju zgjKJ;J6tRY4lro*Suv6th;AgBR;5>2)YQ>E+I*vVAq4@V29oDeFD=EmMVntVFO-0& zf%rLv3U};nnRKdRap>Avdwzo%0V&6^Jkvcl-&_{4|R$K|o zpYS3F{~gFkj)@-yTIX4_?p>$L5=~!odW<#j+gb9}_Kf|ToF$exa#l~4EGr>r$rr^) z%31P1qCZVcACnK)Hb74rPKjDZ_n;nB+d5uS|NUutVb0mZe+wdEZK3{_jYlC$0q z#YoC}^G0_XWFL|Jx%DgsYn)#^u1{;gee1q`$KYt^c2nI`;nT%WUzOn-v-6Pb_^5w4 ckAQp>Jf>#O6+J!K)&sJ|Z<1q6w11DO-$I|Ap#T5? literal 0 HcmV?d00001 diff --git a/src/ssvlib_demo.rs b/src/ssvlib_demo.rs index cccee0c..9dd6f3e 100644 --- a/src/ssvlib_demo.rs +++ b/src/ssvlib_demo.rs @@ -1,10 +1,13 @@ extern crate libc; +extern crate dotenv; use libc::{ c_char, c_void, c_ushort, size_t }; use std::ffi::CString; use std::ptr; -#[link(name = "ssvlux64")] +use dotenv::dotenv; +use std::env; + extern "C" { fn SSV_InitLIB2(pcRepSesamIni: *const c_char) -> c_ushort; fn SSV_LireCartePS(NomRessourcePS: *const c_char, NomRessourceLecteur: *const c_char, CodePorteurPS: *const c_char, ZDonneesSortie: *mut *mut c_void, TTailleDonneesSortie: *mut size_t) -> c_ushort; @@ -12,7 +15,8 @@ extern "C" { } fn ssv_init_lib_2() { - let ini = CString::new("/etc/opt/santesocial/fsv/1.40.13/conf/sesam.ini").expect("CString::new failed"); + let ini_str = env::var("SESAM_INI_PATH").expect("SESAM_INI_PATH must be set"); + let ini = CString::new(ini_str).expect("CString::new failed"); unsafe { let result = SSV_InitLIB2(ini.as_ptr()); println!("SSV_InitLIB2 result: {}", result); @@ -68,6 +72,8 @@ fn ssv_lire_config() { } pub fn demo() { + dotenv().ok(); + println!("------- Demo for the SSV library --------"); ssv_init_lib_2(); diff --git a/src/ssvw64.def b/src/ssvw64.def new file mode 100644 index 0000000..4d66637 --- /dev/null +++ b/src/ssvw64.def @@ -0,0 +1,5 @@ +LIBRARY "ssvw64" +EXPORTS + SSV_InitLIB2 + SSV_LireCartePS + SSV_LireConfig