Skip to content

Commit

Permalink
Finalized cmake stuff and updated smeka build
Browse files Browse the repository at this point in the history
Now everything should be compliant. Both the cmake
and the smeka builds should be compatible.

The only difference is that smeka does not provide cmake
targets for end-users.

A large restructure of cmake files was done.
Partially because I don't want this as a sub-project to
inflict problems on the hosting code. I will test
this momentarily with Siesta.

Fixed some bugs for smeka installations. It should now
produce the same tree-structure as CMake.

Still need to check whether the dist works, but that should
be done later.

Signed-off-by: Nick Papior <[email protected]>
  • Loading branch information
zerothi committed Jun 2, 2023
1 parent aaafeb3 commit 97b069d
Show file tree
Hide file tree
Showing 16 changed files with 203 additions and 185 deletions.
94 changes: 83 additions & 11 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
cmake_minimum_required(VERSION 3.17 FATAL_ERROR)

# Include overwrites before setting up the project
set(CMAKE_USER_MAKE_RULES_OVERRIDE ${CMAKE_CURRENT_SOURCE_DIR}/config/DefaultFlags.cmake)
set(CMAKE_USER_MAKE_RULES_OVERRIDE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/fdictDefaultFlags.cmake")

# Define fdict project and languages used
project(fdict
Expand Down Expand Up @@ -29,8 +29,10 @@ set(PROJECT_AUTHOR "Nick Papior")
set(PROJECT_DESCRIPTION "Fortran dictionary for arbitrary data-types")
set(PROJECT_URL "https://github.com/zerothi/fdict")
set(PROJECT_LICENSE "Mozilla Public License, 2.0 (MPL-2.0)")
message("** PROJECT_NAME = ${PROJECT_NAME}")
message("** Please report any build problems here: ${PROJECT_URL}")
message(STATUS "
** PROJECT_NAME = ${PROJECT_NAME}
** Please report any build problems here: ${PROJECT_URL}
")


list(APPEND FYPPFLAGS
Expand All @@ -42,22 +44,92 @@ list(APPEND FYPPFLAGS
)

# Add project options
include(${CMAKE_CURRENT_SOURCE_DIR}/config/ProjectOptions.cmake)
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/fdictOptions.cmake")
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/fdictFyppify.cmake")


# Add our custom definitions
add_subdirectory(config)
# create library.
add_subdirectory(src)


# Now for installing stuff.

# Generate the version include file
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/fdict.inc.in"
"${CMAKE_CURRENT_BINARY_DIR}/fdict.inc"
@ONLY
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/fdict.inc"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
)

# Globally define a place where we will install
# cmake configuration stuff, *Target.cmake *Version.cmake etc.
set(CMAKE_INSTALL_CMAKECONFIG_DIR
"${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
CACHE STRING
"Determine where the CMake configuration files will be installed"
)
mark_as_advanced(CMAKE_INSTALL_CMAKECONFIG_DIR)


# Create pkg-config file
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/fdict.pc.in"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
@ONLY
)
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
)

# Export CMake package file
include(CMakePackageConfigHelpers)

# Export a cmake package configure file
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
INSTALL_DESTINATION "${CMAKE_INSTALL_CMAKECONFIG_DIR}"
)

if(BUILD_SHARED_LIBS OR PROJECT_VERSION_MAJOR EQUAL 0)
# Due to the uncertain ABI compatibility of Fortran shared libraries
# limit compatibility for dynamic linking to same minor version.
set(COMPATIBILITY SameMinorVersion)
else()
# Require API compatibility via semantic versioning for static linking.
set(COMPATIBILITY SameMajorVersion)
endif()

# Export a package version file
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
VERSION ${PROJECT_VERSION}
COMPATIBILITY ${COMPATIBILITY}
)

# Install cmake configuration files
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
DESTINATION "${CMAKE_INSTALL_CMAKECONFIG_DIR}"
)


# Install project
install(EXPORT ${PROJECT_NAME}-targets
FILE ${PROJECT_NAME}Targets.cmake
NAMESPACE ${PROJECT_NAME}::
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
DESTINATION "${CMAKE_INSTALL_CMAKECONFIG_DIR}"
)

# Export a cmake configuration for the targets
# Export a cmake configuration for the targets if used as a sub-project
export(EXPORT ${PROJECT_NAME}-targets
NAMESPACE ${PROJECT_NAME}::
FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/${PROJECT_NAME}-targets.cmake"
FILE "${PROJECT_NAME}Targets.cmake"
)
33 changes: 23 additions & 10 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,24 @@ include $(TOP_DIR)/$(SMEKA_DIR)/Makefile.smeka

# SMEKAENDSETTINGS (DO NOT DELETE)


# Define the creation of the inclusion data
fdict.inc:
@$(ECHO) "Creating $@ version inclusion file"
@$(ECHO) "! fdict version inclusion" > $@
@$(ECHO) "#ifndef _FDICT_INCLUDE_DEFINED" >> $@
@$(ECHO) "#define _FDICT_INCLUDE_DEFINED" >> $@
@$(ECHO) "#define _FDICT_MAJOR_ $(PROJECT_VERSION_MAJOR)" >> $@
@$(ECHO) "#define _FDICT_MINOR_ $(PROJECT_VERSION_MINOR)" >> $@
@$(ECHO) "#define _FDICT_PATCH_ $(PROJECT_VERSION_PATCH)" >> $@
@$(ECHO) "#define _FDICT_VERSION_ $(PROJECT_VERSION)" >> $@
@$(ECHO) "#endif" >> $@


# Dependent on the option we can fake a VPATH to contain
# any pre-created sources, if they exist we can simply use those
SOURCES_DIR = $(TOP_DIR)/sources

# Include the makefile in the src directory
include $(TOP_DIR)/src/Makefile.inc

Expand All @@ -33,7 +51,6 @@ $(LIBRARIES): $(OBJECTS)
# Create target
lib: fdict.inc fdict.fypp $(LIBRARIES)


# Include the makefile in the test directory
include $(TOP_DIR)/test/Makefile.inc

Expand All @@ -51,19 +68,15 @@ copy:
@$(ECHO) ""
else
copy:
$(CP) $(SOURCES_DIR)/src/*.f90 $(SOURCES_DIR)/src/*.inc .
$(CP) $(SOURCES_DIR)/src/*.f90 $(SOURCES_DIR)/src/*.inc $(SOURCES_DIR)/*.inc .
endif


# Create source target for creating _only_ the sources.
.PHONY: source
source: source-src

# Dependent on the option we can fake a VPATH to contain
# any pre-created sources, if they exist we can simply use those
SOURCES_DIR = $(TOP_DIR)/sources

# Create target
source: source-src
source: fdict-inc source-src
$(MKDIR) $(MKDIR_FLAG_PARENT) $(SOURCES_DIR)
mv fdict.inc $(SOURCES_DIR)

##
# Distribution targets for creating the distribution of flook
Expand Down
8 changes: 4 additions & 4 deletions Makefile.project
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ _SMEKA_project = 1
# Step this version upon new versions
PROJECT_VERSION_MAJOR = 0
PROJECT_VERSION_MINOR = 9
PROJECT_VERSION_PATCH = 0
PROJECT_VERSION_PATCH = 1
PROJECT_VERSION = $(PROJECT_VERSION_MAJOR).$(PROJECT_VERSION_MINOR).$(PROJECT_VERSION_PATCH)

# These are constant default
Expand Down Expand Up @@ -49,13 +49,13 @@ install: $(LIBRARIES) fdict.inc fdict.fypp
.NOTPARALLEL: install-mod
smeka-install: install-mod
install-mod: $(F_MODS)
$(INSTALL) -m $(_OCT_rwxrxrx) -d $(DESTDIR)$(FMOD_DIR)
$(INSTALL) -m $(_OCT_rwrr) $(F_MODS) $(DESTDIR)$(FMOD_DIR)
$(INSTALL) -m $(_OCT_rwxrxrx) -d $(DESTDIR)$(PREFIX)/$(FMOD_DIR)
$(INSTALL) -m $(_OCT_rwrr) -t $(DESTDIR)$(PREFIX)/$(FMOD_DIR) $(F_MODS)

.NOTPARALLEL: install-header
smeka-install: install-header
install-header: fdict.inc smeka-install-init-dir
$(INSTALL) -m $(_OCT_rwrr) fdict.inc fdict.fypp $(DESTDIR)$(INC_DIR)
$(INSTALL) -m $(_OCT_rwrr) -t $(DESTDIR)$(PREFIX)/$(INC_DIR) fdict.inc fdict.fypp


# Force the deletion of both libraries
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.9.0
0.9.1
56 changes: 56 additions & 0 deletions cmake/Config.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
@PACKAGE_INIT@

# Check that the fortran language is enabled
check_language(Fortran)
if( NOT CMAKE_Fortran_COMPILER )
message(FATAL_ERROR "fdict package requires Fortran language support")
endif()
# should we instead just enable it in the config file?


# Define all the available components
set(_valid_components
INT8
INT16
REAL80
REAL128
LOG8
LOG16
LOG64
ISO_C
ISO_ENV
PURE_INTERFACE
)


string(TOUPPER PROJECT_NAME_UPPER "@PROJECT_NAME@")

set_and_check(${PROJECT_NAME_UPPER}_FYPPFLAGS "@FYPPFLAGS@")

set_and_check(${PROJECT_NAME_UPPER}_WITH_PURE_INTERFACE "@WITH_PURE_INTERFACE@")

set_and_check(${PROJECT_NAME_UPPER}_WITH_INT8 "@WITH_INT8@")
set_and_check(${PROJECT_NAME_UPPER}_WITH_INT16 "@WITH_INT16@")
set_and_check(${PROJECT_NAME_UPPER}_WITH_REAL80 "@WITH_REAL80@")
set_and_check(${PROJECT_NAME_UPPER}_WITH_REAL128 "@WITH_REAL128@")
set_and_check(${PROJECT_NAME_UPPER}_WITH_LOG8 "@WITH_LOG8@")
set_and_check(${PROJECT_NAME_UPPER}_WITH_LOG16 "@WITH_LOG16@")
set_and_check(${PROJECT_NAME_UPPER}_WITH_LOG64 "@WITH_LOG64@")
set_and_check(${PROJECT_NAME_UPPER}_WITH_ISO_C "@WITH_ISO_C@")
set_and_check(${PROJECT_NAME_UPPER}_WITH_ISO_ENV "@WITH_ISO_ENV@")

set_and_check(${PROJECT_NAME_UPPER}_MAXRANK "@MAXRANK@")
set_and_check(${PROJECT_NAME_UPPER}_MAXRANK_INT "@MAXRANK_INT@")
set_and_check(${PROJECT_NAME_UPPER}_MAXRANK_REAL "@MAXRANK_REAL@")
set_and_check(${PROJECT_NAME_UPPER}_MAXRANK_CMPLX "@MAXRANK_CMPLX@")
set_and_check(${PROJECT_NAME_UPPER}_MAXRANK_LOG "@MAXRANK_LOG@")
set_and_check(${PROJECT_NAME_UPPER}_MAXRANK_ISO_C "@MAXRANK_ISO_C@")

# Convert to components
foreach(comp IN LISTS _valid_components)
set(${PROJECT_NAME_UPPER}_${comp}_FOUND "${${PROJECT_NAME_UPPER}_WITH_${comp}}")
endforeach()

include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")

check_required_components(${PROJECT_NAME_UPPER})
File renamed without changes.
File renamed without changes.
File renamed without changes.
76 changes: 8 additions & 68 deletions config/CMakeLists.txt → cmake/fdictFyppify.cmake
Original file line number Diff line number Diff line change
@@ -1,64 +1,3 @@
# Ensure we use some basic packages

# return variables required
foreach(var IN ITEMS FYPP FYPPFLAGS)
set(${var} "${${var}}" PARENT_SCOPE)
endforeach()


set(CMAKE_INSTALL_CMAKECONFIG_DIR
"${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
)


# Export a pkg-config file
configure_file(
"${PROJECT_SOURCE_DIR}/fdict.pc.in"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
@ONLY
)

# Install pkg-config files
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
)

# Export CMake package file
include(CMakePackageConfigHelpers)

# Export a cmake package configure file
configure_package_config_file(
"${CMAKE_CURRENT_SOURCE_DIR}/template.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
INSTALL_DESTINATION "${CMAKE_INSTALL_CMAKECONFIG_DIR}"
)

if(BUILD_SHARED_LIBS OR PROJECT_VERSION_MAJOR EQUAL 0)
# Due to the uncertain ABI compatibility of Fortran shared libraries
# limit compatibility for dynamic linking to same minor version.
set(COMPATIBILITY SameMinorVersion)
else()
# Require API compatibility via semantic versioning for static linking.
set(COMPATIBILITY SameMajorVersion)
endif()

# Export a package version file
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
VERSION ${PROJECT_VERSION}
COMPATIBILITY ${COMPATIBILITY}
)

# Install cmake configuration files
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
DESTINATION ${CMAKE_INSTALL_CMAKECONFIG_DIR}
)


# Preprocesses a list of files with given preprocessor and preprocessor options
#
# Args:
Expand All @@ -69,23 +8,23 @@ install(FILES
# srcfiles [in]: List of the source files
# trgfiles [out]: Contains the list of the preprocessed files on exit
#
function(preprocess preproc preprocopts srcext trgext srcfiles trgfiles)
function(fdict_preprocess preproc preprocopts srcext trgext srcfiles trgfiles)

set(_trgfiles)
foreach(srcfile IN LISTS srcfiles)
string(REGEX REPLACE "\\.${srcext}$" ".${trgext}" trgfile ${srcfile})
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${trgfile}
COMMAND ${preproc} ${preprocopts} ${CMAKE_CURRENT_SOURCE_DIR}/${srcfile} ${CMAKE_CURRENT_BINARY_DIR}/${trgfile}
MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/${srcfile})
list(APPEND _trgfiles ${CMAKE_CURRENT_BINARY_DIR}/${trgfile})
OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${trgfile}"
COMMAND ${preproc} ${preprocopts} "${CMAKE_CURRENT_SOURCE_DIR}/${srcfile}" "${CMAKE_CURRENT_BINARY_DIR}/${trgfile}"
MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/${srcfile}")
list(APPEND _trgfiles "${CMAKE_CURRENT_BINARY_DIR}/${trgfile}")
endforeach()
set(${trgfiles} ${_trgfiles} PARENT_SCOPE)

endfunction()

# Define a function for fyppifying sources
function(fyppify)
function(fdict_fyppify)
# Parse arguments
set(options "")
set(oneValueArgs FYPP EXTIN EXTOUT COMMENT OUTPUT)
Expand Down Expand Up @@ -138,11 +77,12 @@ function(fyppify)
]==]

# Lets do the preprocessing
preprocess("${_fyppify_FYPP}" "${_fyppify_FLAGS}"
fdict_preprocess("${_fyppify_FYPP}" "${_fyppify_FLAGS}"
"${_fyppify_EXTIN}" "${_fyppify_EXTOUT}"
"${_fyppify_FILES}" _outfiles)
if(DEFINED _fyppify_OUTPUT)
set(${_fyppify_OUTPUT} ${_outfiles} PARENT_SCOPE)
endif()

endfunction()

File renamed without changes.
Loading

0 comments on commit 97b069d

Please sign in to comment.