Skip to content

Commit 9635904

Browse files
author
Charles PIGNEROL
committed
Cmake target lima_fortran_compile_flags intended to pass to fortran codes the compilation flags defining the encoding size of integers (INTEGER) and reals (REAL) by default.
1 parent 8609b58 commit 9635904

File tree

9 files changed

+159
-37
lines changed

9 files changed

+159
-37
lines changed

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ option (FORMAT_MLI2 "Format remplaçant le format MLI recommandé partout. Requi
2323
# Binaires optionnels :
2424
option (BUILD_SCRIPTING "Génération du wrapper swig/python pour utilisation scriptée de Lima." ON)
2525
option (BUILD_XLMLIMA "Utilitaire xlmlima (conversions, préparations de maillages), symetrise (symétrisation / x, y ou z)." ON)
26-
option (BUILD_TESTS "Création de l'utilitaire comparaison." OFF)
26+
option (BUILD_TESTS "Création de l'utilitaire comparaison." ON)
2727
option (DISABLE_MLI_WARNING "Désactivation de l'affichage d'un avertissement signalant que le format mli est obsolète et recommandant en remplacement l'usage du format mli2." OFF)
2828

2929
add_subdirectory (src)

cmake/compilation_options.cmake

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
# -------------------------------------------------------------------------------------------------------------------------
2+
# Le contenu de ce fichier permet de gérer des options de compilation indispensables à une bonne utilisation de Lima.
3+
# Ces options de compilation définissent la taille d'encodage des entiers et réels.
4+
# C'est par exemple indispensable à des codes fortran dont les arguments transmis lors des appels Lima sont de type
5+
# INTEGER ou REAL.
6+
# -------------------------------------------------------------------------------------------------------------------------
7+
8+
# ---------------------------------
9+
# manage integer
10+
# ---------------------------------
11+
#
12+
# I4
13+
# C and C++
14+
# Fortran if Intel
15+
# Fortran if GNU
16+
# Fortran if ARM
17+
# Fortran if FLANG
18+
# Fortran if IBM
19+
# Fortran if PGI
20+
# I8
21+
# C and C++
22+
# Fortran if Intel
23+
# Fortran if GNU
24+
# Fortran if ARM
25+
# Fortran if FLANG
26+
# Fortran if IBM
27+
# Fortran if PGI
28+
# ---------------------------------
29+
if (NOT INT_8)
30+
set (LIMA_INT_SIZE "INTEGER_32")
31+
else() # I8
32+
set (LIMA_INT_SIZE "INTEGER_64")
33+
endif()
34+
35+
36+
# ---------------------------------
37+
# manage real
38+
# ---------------------------------
39+
#
40+
# R4
41+
# C and C++
42+
# Fortran if Intel
43+
# Fortran if GNU
44+
# Fortran if ARM
45+
# Fortran if FLANG
46+
# Fortran if IBM
47+
# Fortran if PGI
48+
# R8
49+
# C and C++
50+
# Fortran if Intel
51+
# Fortran if GNU
52+
# Fortran if ARM
53+
# Fortran if FLANG
54+
# Fortran if IBM
55+
# Fortran if PGI
56+
# ---------------------------------
57+
if (NOT REAL_8)
58+
set (LIMA_REAL_SIZE "REAL_32")
59+
else() # R8
60+
set (LIMA_REAL_SIZE "REAL_64")
61+
endif()
62+
63+
64+
65+
if (DEFINED CMAKE_Fortran_COMPILER_ID)
66+
if(CMAKE_Fortran_COMPILER_ID STREQUAL "ARM" OR CMAKE_Fortran_COMPILER MATCHES "armflang") # cmake does always have proper COMPILER_ID for arm compiler
67+
set(i4_opt "") # -i4 does not exists, but it's the default
68+
set(i8_opt -i8)
69+
set(r4_opt "") # -r4 does not exists, but it's the default
70+
set(r8_opt -r8)
71+
set(r16_opt -r16) # future ?
72+
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") # gnu (gcc) gfortran
73+
set(i4_opt "") # -fdefault-integer-4 does not exists, but it's the default
74+
set(i8_opt -fdefault-integer-8)
75+
set(r4_opt "") # -fdefault-real-4 does not exists, but it's default
76+
set(r8_opt -fdefault-real-8)
77+
set(r16_opt -fdefault-real-16) # future ?
78+
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "Intel" OR CMAKE_Fortran_COMPILER_ID STREQUAL "IntelLLVM") # intel (icc/icx) ifort/ifx
79+
set(i4_opt -i4)
80+
set(i8_opt -i8)
81+
set(r4_opt "") # -r4 does not exists, but it's the default
82+
set(r8_opt -r8)
83+
set(r16_opt -r16)
84+
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "Flang") # llvm (clang) flang
85+
set(i4_opt "")
86+
set(i8_opt -i8)
87+
set(r4_opt "")
88+
set(r8_opt -r8)
89+
set(r16_opt -r16) # future ?
90+
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "XL" OR CMAKE_Fortran_COMPILER_NAME MATCHES "xlf*") # VisualAge (ibm) xlfortran
91+
# set(i2_opt -qintsize=2) # available but not used
92+
set(i4_opt -qintsize=4) # (default)
93+
set(i8_opt -qintsize=8)
94+
set(r4_opt -qrealsize=4) # (default)
95+
set(r8_opt -qrealsize=8)
96+
set(r16_opt -qrealsize=16) # not present in xlf (xlf_r) 16.1
97+
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "PGI" OR CMAKE_Fortran_COMPILER_ID STREQUAL "NVHPC") # PGI (portland group) pgf[77,90,95] = pgfortran
98+
# set(i2_opt -i2) # available but not used
99+
set(i4_opt -i4) # (default)
100+
set(i8_opt -i8)
101+
set(r4_opt -r4) # (default)
102+
set(r8_opt -r8)
103+
set(r16_opt -r16) # not present in pgfortran 20.9-0
104+
else()
105+
message(FATAL_ERROR
106+
"Unknown Fortran compiler '${CMAKE_Fortran_COMPILER_ID}' ('${CMAKE_Fortran_COMPILER}'), "
107+
"IR flags not implemented.")
108+
endif()
109+
110+
set(FORTRAN_FLAGS "")
111+
set(FORTRAN_FLAGS_LIST "")
112+
if (NOT INT_8)
113+
string (APPEND FORTRAN_FLAGS " ${i4_opt}")
114+
list (APPEND FORTRAN_FLAGS_LIST "${i4_opt}")
115+
else()
116+
string (APPEND FORTRAN_FLAGS " ${i8_opt}")
117+
list (APPEND FORTRAN_FLAGS_LIST "${i8_opt}")
118+
endif()
119+
120+
if (NOT REAL_8)
121+
string (APPEND FORTRAN_FLAGS " ${r4_opt}")
122+
list (APPEND FORTRAN_FLAGS_LIST "${r4_opt}")
123+
else()
124+
string (APPEND FORTRAN_FLAGS " ${r8_opt}")
125+
list (APPEND FORTRAN_FLAGS_LIST "${r8_opt}")
126+
endif()
127+
set(FORTRAN_FLAGS "")
128+
string (REPLACE ";" " " FORTRAN_FLAGS "${FORTRAN_FLAGS_LIST}")
129+
# set compile flags
130+
131+
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${FORTRAN_FLAGS}" CACHE FILEPATH "" FORCE)
132+
133+
endif()

cmake/version.cmake

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
#
44

55
set (LIMA_MAJOR_VERSION "7")
6-
set (LIMA_MINOR_VERSION "9")
7-
set (LIMA_RELEASE_VERSION "6")
6+
set (LIMA_MINOR_VERSION "10")
7+
set (LIMA_RELEASE_VERSION "0")
88
set (LIMA_VERSION ${LIMA_MAJOR_VERSION}.${LIMA_MINOR_VERSION}.${LIMA_RELEASE_VERSION})
99

1010

configurations/Ubuntu_GNU11.cmake

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,6 @@ set(CMAKE_CXX_COMPILER g++-11)
44
set(CMAKE_CXX_FLAGS -std=c++11)
55
set(CMAKE_Fortran_COMPILER "${GNU_ROOT}/bin/gfortran")
66

7-
#set (CMAKE_Fortran_FLAGS "-fdefault-real-8") # I4/R8 insuffisant si des double precision sont déclarés car alors promus en R16
8-
set (CMAKE_Fortran_FLAGS)
9-
if (INT_8)
10-
string(APPEND CMAKE_Fortran_FLAGS " -fdefault-integer-8")
11-
endif (INT_8)
12-
if (REAL_8)
13-
string (APPEND CMAKE_Fortran_FLAGS " -fdefault-real-8 -fdefault-double-8")
14-
endif (REAL_8)
15-
167
# SWIG_EXECUTABLE : requiert d'être en cache pour fonctionner tout au long de la chaine ...
178
set (SWIG_EXECUTABLE "/opt/swig/3.0.12/bin/swig" CACHE FILEPATH "Swig exe" FORCE)
189

configurations/Ubuntu_GNU11_external_meshlibs.cmake

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,9 @@ set (ZLIB_ROOT ${HDF5_DIR} CACHE PATH "Chemin d'acces a la bibliotheque ZLIB uti
44
message (STATUS "======================================================== VARIABLES ENVIRONNEMENTALES DEPENDANCES MAILLAGE ========================================================")
55
message (STATUS "======================> HDF5_DIR =${HDF5_DIR}")
66

7-
7+
set (HDF145_DIR "/opt22/hdf145/1.3.1" CACHE PATH "Chemin d'acces a la bibliotheque HDF 145" FORCE)
8+
set (HDF145_ROOT ${HDF145_DIR} CACHE PATH "Chemin d'acces a la bibliotheque HDF 145" FORCE)
9+
set (HDF145_INCLUDE_DIR "${HDF145_DIR}/include" CACHE PATH "Chemin d'acces aux entetes de la bibliotheque HDF 145" FORCE)
10+
set (HDF145CPP_LIBRARY "${HDF145_DIR}/lib/libhdf145_cpp.so" CACHE PATH "Chemin d'acces aux entetes de la bibliotheque HDF 145" FORCE)
11+
set (HDF145_LIBRARY "${HDF145_DIR}/lib/libhdf145.so" CACHE PATH "Chemin d'acces aux entetes de la bibliotheque HDF 145" FORCE)
812

configurations/Ubuntu_GNU7.cmake

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,6 @@ set(CMAKE_CXX_COMPILER g++-7)
44
set(CMAKE_CXX_FLAGS -std=c++11)
55
set(CMAKE_Fortran_COMPILER "${GNU_ROOT}/bin/gfortran")
66

7-
#set (CMAKE_Fortran_FLAGS "-fdefault-real-8") # I4/R8 insuffisant si des double precision sont déclarés car alors promus en R16
8-
set (CMAKE_Fortran_FLAGS)
9-
if (INT_8)
10-
string(APPEND CMAKE_Fortran_FLAGS " -fdefault-integer-8")
11-
endif (INT_8)
12-
if (REAL_8)
13-
string (APPEND CMAKE_Fortran_FLAGS " -fdefault-real-8 -fdefault-double-8")
14-
endif (REAL_8)
15-
167
# SWIG_EXECUTABLE : requiert d'être en cache pour fonctionner tout au long de la chaine ...
178
set (SWIG_EXECUTABLE "/opt/swig/3.0.12/bin/swig" CACHE FILEPATH "Swig exe" FORCE)
189

installation.txt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ cmake -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DCMAKE_
2020
-DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_XLMLIMA=ON -DBUILD_TESTS:BOOL=ON -DBUILD_SCRIPTING:BOOL=ON -DMACHINE_TYPES:BOOL=OFF -DSUMESH:BOOL=OFF -DFORMAT_MLI:BOOL=OFF -DFORMAT_MLI2:BOOL=ON -DFORMAT_MLI2:BOOL=ON \
2121
-DBUILD_SHARED_LIBS:BOOL=ON -DINT_8:BOOL=ON -DREAL_8:BOOL=ON \
2222
-DSWIG_EXECUTABLE=/opt/swig/4.1.1/bin/swig -DPython2_ROOT_DIR=/usr/lib/python2.7 -DHDF5_ROOT=/opt/HDF5/1.12.0 \
23-
-B /tmp/lima_build_dir -DCMAKE_INSTALL_PREFIX=/opt/Lima/7.9.6
23+
-B /tmp/lima_build_dir -DCMAKE_INSTALL_PREFIX=/opt/Lima/7.10.0
2424
cmake --build /tmp/lima_build_dir
2525
cmake --install /tmp/lima_build_dir
2626

@@ -30,7 +30,7 @@ cmake -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_CXX_COMPILER=/usr/bin/g++ -DCMAKE_
3030
-DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_XLMLIMA=ON -DBUILD_TESTS:BOOL=ON -DBUILD_SCRIPTING:BOOL=ON -DMACHINE_TYPES:BOOL=ON -DSUMESH:BOOL=ON -DFORMAT_MLI:BOOL=ON -DFORMAT_MLI2:BOOL=ON \
3131
-DBUILD_SHARED_LIBS:BOOL=ON -DINT_8:BOOL=ON -DREAL_8:BOOL=ON \
3232
-DSWIG_EXECUTABLE=/opt/swig/4.1.1/bin/swig -DPython2_ROOT_DIR=/usr/lib/python2.7 -DHDF5_ROOT=/opt/HDF5/1.12.0 -DHDF145_INCLUDE_DIR=/opt/hdf145/1.3.0/include -DHDF145CPP_LIBRARY=/opt/hdf145/1.3.0/lib/libhdf145_cpp.so -DHDF145_LIBRARY=/opt/hdf145/1.3.0/lib/libhdf145.so \
33-
-B /tmp/lima_build_dir -DCMAKE_INSTALL_PREFIX=/opt/Lima/7.9.6
33+
-B /tmp/lima_build_dir -DCMAKE_INSTALL_PREFIX=/opt/Lima/7.10.0
3434
cmake --build /tmp/lima_build_dir
3535
cmake --install /tmp/lima_build_dir
3636

@@ -51,6 +51,7 @@ L'option -DMACHINE_TYPES:BOOL=OFF permet de désactiver l'utilisation de Machine
5151
L'option -DSUMESH:BOOL=OFF permet de désactiver l'utilisation de la bibliothèque sumesh (lissage).
5252

5353
L'option -DFORMAT_MLI:BOOL=OFF permet de désactiver le lecteur/écrivain obsolète "mli" qui repose sur la bibliothèque HDF 5 1.4.5.
54+
L'option -DDISABLE_MLI_WARNING:BOOL=ON, fortement déconseillée, permet de désactiver l'affichage en bleu dans la console d'un avertissement signalant l'utilisation de ce lecteur/écrivain obsolète "mli".
5455

5556
L'option -DFORMAT_MLI2:BOOL=OFF permet de désactiver le lecteur/écrivain "mli2" qui repose sur une version supérieure ou égale à 1.10.0 de la bibliothèque HDF 5.
5657

@@ -74,6 +75,9 @@ ATTENTION : la lib Z peut être requise pour HDF 1.4.5, HDF5, et le logiciel à
7475
Taille des entiers pour le langage fortran : il convient de transmettre aux compilateurs C/C++ l'option -DINTEGER_32 si ils sont codés sur 32 bits ou -DINTEGER_64 si ils sont codés sur 64 bits, ce codage étant souvent côté
7576
fortran une instruction transmise au compilateur type -i8.
7677
On peut préciser à cmake la taille d'encodage des entiers et réels via les options booléennes INT_8 et REAL_8. Ex pour I4.R8 : -DINT_8:BOOL=OFF -DREAL_8:BOOL=ON
78+
Depuis la version 7.10.0 les codes fortran peuvent profiter de la cible Lima::lima_fortran_compile_flags pour récupérer à la compilation les drapeaux de compilation permettant au compilateur fortran d'encoder les entiers (INTEGER) et flottants (REAL) par défaut sur le même nombre d'octets que Lima. Pour ce il suffit par exemple d'utiliser cette cible comme suit :
79+
find_package (Lima REQUIRED)
80+
target_link_libraries (code_fortran PUBLIC Lima::Lima Lima::lima_fortran_compile_flags)
7781

7882
Le script build.sh et les fichiers du répertoire configurations - à adapter - permettent d'installer lima à moindre coût.
7983

src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ if (BUILD_XLMLIMA) # and other tools
1717
add_subdirectory (Symetrise)
1818
endif ( )
1919

20+
enable_testing ( )

src/Lima/CMakeLists.txt

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ set (CURRENT_PACKAGE_NAME "Lima")
22
set (CURRENT_PACKAGE_MACRO_NAME "LIMA_KERNEL")
33
include (${CMAKE_SOURCE_DIR}/cmake/version.cmake)
44
include (${CMAKE_SOURCE_DIR}/cmake/common.cmake)
5+
include (${CMAKE_SOURCE_DIR}/cmake/compilation_options.cmake)
56
include (${CMAKE_SOURCE_DIR}/cmake/workarounds.cmake)
7+
8+
69
if (MACHINE_TYPES)
710
find_package (MachineTypes REQUIRED)
811
endif (MACHINE_TYPES)
@@ -35,6 +38,7 @@ if ((PLATFORM STREQUAL "CentOS") OR (PLATFORM STREQUAL "Atos_7__x86_64") OR (PLA
3538
endif ()
3639

3740
add_library (Lima ${CPP_SOURCES} ${HEADERS} ${ICEMCFD_OBJS})
41+
add_library (lima_fortran_compile_flags INTERFACE)
3842

3943
set (MLI_SUPPORTED OFF)
4044
set (EXTERNAL_LIBS_FLAGS)
@@ -60,16 +64,9 @@ else (HDF5_FOUND AND HDF5_INCLUDE_DIRS AND HDF5_CXX_LIBRARIES AND (HDF5_VERSION
6064
message (WARNING "======================> API HDF5 NON TROUVEE (ou version < 1.10.0 ou absence d'API c++) : pas de support du format mli2 <======================")
6165
endif (HDF5_FOUND AND HDF5_INCLUDE_DIRS AND HDF5_CXX_LIBRARIES AND (HDF5_VERSION VERSION_GREATER_EQUAL 1.10.0))
6266

63-
if (INT_8)
64-
list (APPEND LIMA_CFLAGS -DINTEGER_64)
65-
else (INT_8)
66-
list (APPEND LIMA_CFLAGS -DINTEGER_32)
67-
endif (INT_8)
68-
if (REAL_8)
69-
list (APPEND LIMA_CFLAGS -DREAL_64)
70-
else (REAL_8)
71-
list (APPEND LIMA_CFLAGS -DREAL_32)
72-
endif (REAL_8)
67+
list (APPEND LIMA_CFLAGS "-D${LIMA_INT_SIZE}")
68+
list (APPEND LIMA_CFLAGS "-D${LIMA_REAL_SIZE}")
69+
target_compile_options (lima_fortran_compile_flags INTERFACE "${FORTRAN_FLAGS_LIST}")
7370

7471
set (MachineTypes_ENABLED OFF)
7572
if (${MachineTypes_FOUND})
@@ -99,7 +96,7 @@ endif (${Sumesh_FOUND})
9996

10097
set (LIMA_KERNEL_PUBLIC_FLAGS "${LIMA_CFLAGS}" LIMA_MT LIMA_USES_ATOMIC_API)
10198
#set (LIMA_KERNEL_PRIVATE_FLAGS "${CMAKE_CXX_FLAGS}")
102-
set (ALL_TARGETS Lima)
99+
set (ALL_TARGETS Lima lima_fortran_compile_flags)
103100
set_property (TARGET Lima PROPERTY VERSION ${LIMA_VERSION})
104101
set_property (TARGET Lima PROPERTY SOVERSION ${LIMA_MAJOR_VERSION})
105102
target_include_directories (Lima PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/public>$<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include>)
@@ -113,8 +110,9 @@ target_compile_definitions (Lima PUBLIC ${EXTERNAL_LIBS_FLAGS})
113110
if (DISABLE_MLI_WARNING)
114111
target_compile_definitions (Lima PRIVATE "DISABLE_MLI_WARNING")
115112
endif (DISABLE_MLI_WARNING)
116-
# Threads::Threads : A ne pas mettre en PRIVATE car "référence au symbole non défini «sem_getvalue@@GLIBC_2.2.5»"
117-
target_link_libraries (Lima PUBLIC Threads::Threads)
113+
# v 7.10.0 : Lima a au moins 1 appel direct à la lm (pow), et HDF145 en a aussi (ceil), mais HDF145 ne déclare pas de dépendance à la lm. Dans de rares cas ça manque au linker ...
114+
# Donc la dépendance ci-dessous est à laisser.
115+
target_link_libraries (Lima PUBLIC Threads::Threads m)
118116

119117

120118
# Etre capable une fois installée de retrouver Lima*, ... :

0 commit comments

Comments
 (0)