diff --git a/setter/CMakeLists.txt b/setter/CMakeLists.txt index c13327c..3cc2e39 100644 --- a/setter/CMakeLists.txt +++ b/setter/CMakeLists.txt @@ -22,15 +22,77 @@ # Copyright (C) 2011-2021 Natalia Portillo # *****************************************************************************/ -cmake_minimum_required(VERSION 2.20) +cmake_minimum_required(VERSION 2.8) -project(setter C) +project(fssetter-test + DESCRIPTION "Filesystem test creator" + LANGUAGES C) set(CMAKE_C_STANDARD 90) message("Detected system name: ${CMAKE_SYSTEM_NAME}") message("Detected system processor: ${CMAKE_SYSTEM_PROCESSOR}") +# It's best to hide all the details of setting up the variable SRCS in a CMake +# macro. The macro can then be called in all the project CMake list files to add +# sources. +# +# The macro first computes the path of the source file relative to the project +# root for each argument. If the macro is invoked from inside a project sub +# directory the new value of the variable SRCS needs to be propagated to the +# parent folder by using the PARENT_SCOPE option. +# +# Source: http://stackoverflow.com/questions/7046956/populating-srcs-from-cmakelists-txt-in-subdirectories +macro(add_sources) + file(RELATIVE_PATH _relPath "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}") + foreach(_src ${ARGN}) + if(_relPath) + list(APPEND SRCS "${_relPath}/${_src}") + else() + list(APPEND SRCS "${_src}") + endif() + endforeach() + if(_relPath) + # propagate to parent directory + set(SRCS ${SRCS} PARENT_SCOPE) + endif() +endmacro() + +# Based on add_sources() but to add compiler definitions +macro(add_sub_definitions) + file(RELATIVE_PATH _relPath "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}") + foreach(_def ${ARGN}) + list(APPEND PRJ_DEFINITIONS "${_def}") + endforeach() + if(_relPath) + # propagate to parent directory + set(PRJ_DEFINITIONS ${PRJ_DEFINITIONS} PARENT_SCOPE) + endif() +endmacro() + +# Based on add_sources() but to add libraries +macro(add_sub_libraries) + file(RELATIVE_PATH _relPath "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}") + foreach(_lib ${ARGN}) + list(APPEND PRJ_LIBRARIES "${_lib}") + endforeach() + if(_relPath) + # propagate to parent directory + set(PRJ_LIBRARIES ${PRJ_LIBRARIES} PARENT_SCOPE) + endif() +endmacro() + +set(EXECUTABLE_NAME "fssetter-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") + add_subdirectory(src) +add_compile_definitions(${PRJ_DEFINITIONS}) + +if(${CMAKE_SYSTEM_NAME} MATCHES "Retro68|RetroPPC") + add_application(${EXECUTABLE_NAME} ${SRCS}) +else() + add_executable(${EXECUTABLE_NAME} ${SRCS}) +endif() + +target_link_libraries(${EXECUTABLE_NAME} ${PRJ_LIBRARIES}) diff --git a/setter/src/CMakeLists.txt b/setter/src/CMakeLists.txt index e3bdcef..3871ab1 100644 --- a/setter/src/CMakeLists.txt +++ b/setter/src/CMakeLists.txt @@ -22,14 +22,19 @@ # Copyright (C) 2011-2021 Natalia Portillo # *****************************************************************************/ -set(MAIN_SOURCES main.c main.h log.c log.h) - -add_library(core ${MAIN_SOURCES}) - add_subdirectory(macos) add_subdirectory(dos) add_subdirectory(win32) add_subdirectory(unix) add_subdirectory(beos) add_subdirectory(amiga) -add_subdirectory(os2) \ No newline at end of file +add_subdirectory(os2) + +# This must be after all directories +add_sources(main.c main.h log.c log.h) + +# Even if empty it needs to be present +add_sub_definitions() + +# Even if empty it needs to be present +add_sub_libraries() diff --git a/setter/src/amiga/CMakeLists.txt b/setter/src/amiga/CMakeLists.txt index 7ce20ad..6201634 100644 --- a/setter/src/amiga/CMakeLists.txt +++ b/setter/src/amiga/CMakeLists.txt @@ -26,18 +26,7 @@ if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "AmigaOS|MorphOS" AND NOT AROS) return() endif() -project( - fssetter-amiga - DESCRIPTION "Filesystem test creator for AmigaOS and compatibles" - LANGUAGES C) +add_sub_definitions(__USE_INLINE__) +add_sub_definitions(__USE_BASETYPE__) -add_definitions(-D__USE_INLINE__) -add_definitions(-D__USE_BASETYPE__) - -set(PLATFORM_SOURCES attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c perms.h rsrcfork.c sparse.c time.c time.h volume.c xattr.c) - -set(EXECUTABLE_NAME "fssetter-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") - -add_executable(${EXECUTABLE_NAME} ${PLATFORM_SOURCES}) - -target_link_libraries(${EXECUTABLE_NAME} core) \ No newline at end of file +add_sources(attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c perms.h rsrcfork.c sparse.c time.c time.h volume.c xattr.c) diff --git a/setter/src/beos/CMakeLists.txt b/setter/src/beos/CMakeLists.txt index ff0d9e9..12b0e6d 100644 --- a/setter/src/beos/CMakeLists.txt +++ b/setter/src/beos/CMakeLists.txt @@ -26,15 +26,4 @@ if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "BeOS|Haiku") return() endif() -project( - fssetter-beos - DESCRIPTION "Filesystem test creator for BeOS and Haiku" - LANGUAGES C) - -set(PLATFORM_SOURCES attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c perms.h rsrcfork.c sparse.c time.c time.h volume.c volume.h xattr.c xattr.h) - -set(EXECUTABLE_NAME "fssetter-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") - -add_executable(${EXECUTABLE_NAME} ${PLATFORM_SOURCES}) - -target_link_libraries(${EXECUTABLE_NAME} core) \ No newline at end of file +add_sources(attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c perms.h rsrcfork.c sparse.c time.c time.h volume.c volume.h xattr.c xattr.h) diff --git a/setter/src/dos/CMakeLists.txt b/setter/src/dos/CMakeLists.txt index 20dde7a..24051de 100644 --- a/setter/src/dos/CMakeLists.txt +++ b/setter/src/dos/CMakeLists.txt @@ -26,14 +26,4 @@ if(NOT DOS) return() endif() -project(fssetter-dos - DESCRIPTION "Filesystem test creator for DOS" - LANGUAGES C) - -set(PLATFORM_SOURCES attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c rsrcfork.c sparse.c dostime.h time.c volume.c xattr.c dos.c attr.h dosuname.c dosuname.h dosdefs.h djgpp.c) - -set(EXECUTABLE_NAME "fssetter") - -add_executable(${EXECUTABLE_NAME} ${PLATFORM_SOURCES}) - -target_link_libraries(${EXECUTABLE_NAME} core) \ No newline at end of file +add_sources(attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c rsrcfork.c sparse.c dostime.h time.c volume.c xattr.c dos.c attr.h dosuname.c dosuname.h dosdefs.h djgpp.c) diff --git a/setter/src/macos/CMakeLists.txt b/setter/src/macos/CMakeLists.txt index e5f94db..4cd91b3 100644 --- a/setter/src/macos/CMakeLists.txt +++ b/setter/src/macos/CMakeLists.txt @@ -29,13 +29,8 @@ endif() include(CheckIncludeFiles) include(CheckSymbolExists) -project( - fssetter-macos - DESCRIPTION "Filesystem test creator for MacOS" - LANGUAGES C) - -add_definitions(-Dmacintosh) -add_definitions(-DRetro68) +add_sub_definitions(macintosh) +add_sub_definitions(Retro68) CHECK_INCLUDE_FILES("Aliases.h" HAVE_ALIASES_H) CHECK_INCLUDE_FILES("FileTypesAndCreators.h" HAVE_FILE_TYPES_AND_CREATORS_H) @@ -43,33 +38,25 @@ CHECK_INCLUDE_FILES("Multiverse.h" HAVE_MULTIVERSE_H) CHECK_SYMBOL_EXISTS(PBXGetVolInfo Files.h HAVE_PBXGETVOLINFO) if(HAVE_ALIASES_H) - add_definitions(-DHAVE_ALIASES_H) + add_sub_definitions(HAVE_ALIASES_H) endif() if(HAVE_FILE_TYPES_AND_CREATORS_H) - add_definitions(-DHAVE_FILE_TYPES_AND_CREATORS_H) + add_sub_definitions(HAVE_FILE_TYPES_AND_CREATORS_H) endif() if(HAVE_MULTIVERSE_H) - add_definitions(-DHAVE_MULTIVERSE_H) + add_sub_definitions(HAVE_MULTIVERSE_H) endif() if(NOT HAVE_PBXGETVOLINFO) - add_definitions(-DNO_PBXGETVOLINFO) + add_sub_definitions(NO_PBXGETVOLINFO) endif() -set(PLATFORM_SOURCES attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c rsrcfork.c sparse.c time.c volume.c xattr.c macos.h macos.r retro68.h attr.h time.h rsrcfork.h links.h) +add_sources(attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c rsrcfork.c sparse.c time.c volume.c xattr.c macos.h macos.r retro68.h attr.h time.h rsrcfork.h links.h) if(${CMAKE_SYSTEM_NAME} MATCHES "Retro68") set(PROCESSOR "m68k") else() set(PROCESSOR "ppc") endif() - -set(EXECUTABLE_NAME "fssetter-macos-${PROCESSOR}") - -#add_application(${EXECUTABLE_NAME} ${PLATFORM_SOURCES}) - -#target_link_libraries(${EXECUTABLE_NAME} core) - -add_application(${EXECUTABLE_NAME} ../main.c ../log.c ${PLATFORM_SOURCES}) \ No newline at end of file diff --git a/setter/src/os2/16bit/CMakeLists.txt b/setter/src/os2/16bit/CMakeLists.txt index 0b85184..ba369e6 100644 --- a/setter/src/os2/16bit/CMakeLists.txt +++ b/setter/src/os2/16bit/CMakeLists.txt @@ -26,14 +26,4 @@ if(NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "I86") return() endif() -project(fssetter-os2 - DESCRIPTION "Filesystem test creator for 16-bit OS/2" - LANGUAGES C) - -set(SUBPLATFORM_SOURCES os.c xattr.c xattr.h) - -set(EXECUTABLE_NAME "fssetter") - -add_executable(${EXECUTABLE_NAME} ${SUBPLATFORM_SOURCES}) - -target_link_libraries(${EXECUTABLE_NAME} core platform) \ No newline at end of file +add_sources(os.c xattr.c xattr.h) diff --git a/setter/src/os2/32bit/CMakeLists.txt b/setter/src/os2/32bit/CMakeLists.txt index 796ca09..b704453 100644 --- a/setter/src/os2/32bit/CMakeLists.txt +++ b/setter/src/os2/32bit/CMakeLists.txt @@ -26,16 +26,4 @@ if(NOT ${CMAKE_SYSTEM_PROCESSOR} MATCHES "i386|X86") return() endif() -project(fssetter-os2 - DESCRIPTION "Filesystem test creator for 32-bit OS/2" - LANGUAGES C) - -set(SUBPLATFORM_SOURCES os.c xattr.c) - -set(EXECUTABLE_NAME "fssetter32") - -find_library(OS2LIB "os2386") - -add_executable(${EXECUTABLE_NAME} ${SUBPLATFORM_SOURCES}) - -target_link_libraries(${EXECUTABLE_NAME} core platform) \ No newline at end of file +add_sources(os.c xattr.c) diff --git a/setter/src/os2/CMakeLists.txt b/setter/src/os2/CMakeLists.txt index e24aaca..b1a2e5c 100644 --- a/setter/src/os2/CMakeLists.txt +++ b/setter/src/os2/CMakeLists.txt @@ -26,10 +26,7 @@ if(NOT OS2) return() endif() -set(PLATFORM_SOURCES attr.c attr.h deleted.c dirdepth.c filename.c files.c frag.c links.c os2defs.h perms.c rsrcfork.c sparse.c time.c volume.c) - -add_library(platform ${PLATFORM_SOURCES}) - add_subdirectory(16bit) add_subdirectory(32bit) +add_sources(attr.c attr.h deleted.c dirdepth.c filename.c files.c frag.c links.c os2defs.h perms.c rsrcfork.c sparse.c time.c volume.c) diff --git a/setter/src/unix/CMakeLists.txt b/setter/src/unix/CMakeLists.txt index 9205df0..e60de54 100644 --- a/setter/src/unix/CMakeLists.txt +++ b/setter/src/unix/CMakeLists.txt @@ -36,21 +36,22 @@ CHECK_SYMBOL_EXISTS(statvfs "sys/statvfs.h" HAVE_SYS_STATVFS) if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") message("-- Forcing statfs in sys/mount.h due to OpenBSD") - add_definitions(-DHAVE_SYS_MOUNT_H) - add_definitions(-DNEED_SYS_TYPES_H) + add_sub_definitions(HAVE_SYS_MOUNT_H) + add_sub_definitions(NEED_SYS_TYPES_H) set(HAVE_STATFS_FTYPENAME 1) set(HAVE_STATFS_NAMEMAX 1) -# Linux and FreeBSD + # Linux and FreeBSD elseif(HAVE_SYS_STATFS) message("-- Found statfs in sys/statfs.h") - add_definitions(-DHAVE_SYS_STATFS_H) + add_sub_definitions(HAVE_SYS_STATFS_H) + add_sub_definitions(TEST) CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_namelen" "sys/statfs.h" HAVE_STATFS_FNAMELEN) CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_fstypename" "sys/statfs.h" HAVE_STATFS_FTYPENAME) CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_namemax" "sys/statfs.h" HAVE_STATFS_NAMEMAX) CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_type" "sys/statfs.h" HAVE_STATFS_FTYPE) elseif(HAVE_SYS_MOUNT) # Darwin and most other BSDs message("-- Found statfs in sys/mount.h") - add_definitions(-DHAVE_SYS_MOUNT_H) + add_sub_definitions(HAVE_SYS_MOUNT_H) CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_namelen" "sys/mount.h" HAVE_STATFS_FNAMELEN) CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_fstypename" "sys/mount.h" HAVE_STATFS_FTYPENAME) if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # It's giving false positives sometimes @@ -59,7 +60,7 @@ elseif(HAVE_SYS_MOUNT) # Darwin and most other BSDs CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_type" "sys/mount.h" HAVE_STATFS_FTYPE) elseif(HAVE_SYS_STATVFS) # NetBSD >= 3.0 message("-- Found statvfs in sys/statvfs.h") - add_definitions(-DHAVE_SYS_STATVFS_H) + add_sub_definitions(HAVE_SYS_STATVFS_H) CHECK_STRUCT_HAS_MEMBER("struct statvfs" "f_namemax" "sys/statvfs.h" HAVE_STATFS_NAMEMAX) CHECK_STRUCT_HAS_MEMBER("struct statvfs" "f_fstypename" "sys/statvfs.h" HAVE_STATFS_FTYPENAME) CHECK_STRUCT_HAS_MEMBER("struct statvfs" "f_type" "sys/statvfs.h" HAVE_STATFS_FTYPE) @@ -67,23 +68,24 @@ endif() if(HAVE_STATFS_FNAMELEN) message("-- statfs has f_namelen member") - add_definitions(-DUSE_STATFS_FNAMELEN) + add_sub_definitions(USE_STATFS_FNAMELEN) endif() if(HAVE_STATFS_FTYPENAME) message("-- statfs has f_fstypename member") - add_definitions(-DUSE_STATFS_FTYPENAME) + add_sub_definitions(USE_STATFS_FTYPENAME) endif() if(HAVE_STATFS_NAMEMAX) message("-- statfs has f_namemax member") - add_definitions(-DUSE_STATFS_NAMEMAX) + add_sub_definitions(USE_STATFS_NAMEMAX) endif() -set(UNIX_SOURCES attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c rsrcfork.c sparse.c time.c volume.c xattr.c time.h) - -add_library(unix ${UNIX_SOURCES}) - add_subdirectory(darwin) add_subdirectory(linux) add_subdirectory(bsd) + +# Even if empty it needs to be present +add_sub_libraries() + +add_sources(attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c rsrcfork.c sparse.c time.c volume.c xattr.c time.h) diff --git a/setter/src/unix/bsd/CMakeLists.txt b/setter/src/unix/bsd/CMakeLists.txt index 037f622..9f5b762 100644 --- a/setter/src/unix/bsd/CMakeLists.txt +++ b/setter/src/unix/bsd/CMakeLists.txt @@ -26,15 +26,4 @@ if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "^(([^k].*)?BSD|DragonFly)$" ) return() endif() -project( - fssetter-bsd - DESCRIPTION "Filesystem test creator for BSD" - LANGUAGES C) - -set(PLATFORM_SOURCES bsd.h xattr.c xattr.h attr.c attr.h volume.c volume.h) - -set(EXECUTABLE_NAME "fssetter-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") - -add_executable(${EXECUTABLE_NAME} ${PLATFORM_SOURCES}) - -target_link_libraries(${EXECUTABLE_NAME} core unix) \ No newline at end of file +add_sources(bsd.h xattr.c xattr.h attr.c attr.h volume.c volume.h) diff --git a/setter/src/unix/darwin/CMakeLists.txt b/setter/src/unix/darwin/CMakeLists.txt index 776cca0..d8836a4 100644 --- a/setter/src/unix/darwin/CMakeLists.txt +++ b/setter/src/unix/darwin/CMakeLists.txt @@ -26,25 +26,15 @@ if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") return() endif() -project(fssetter-darwin - DESCRIPTION "Filesystem test creator for Darwin" - LANGUAGES C) - find_library(CARBON_LIBRARY NAMES Carbon) -set(PLATFORM_SOURCES os.c darwin.h volume.c volume.h attr.c attr.h rsrcfork.c rsrcfork.h sparse.c xattr.c xattr.h) +add_sources(os.c darwin.h volume.c volume.h attr.c attr.h rsrcfork.c rsrcfork.h sparse.c xattr.c xattr.h) if(CARBON_LIBRARY) - add_definitions("-DHAVE_CARBON") - set(PLATFORM_SOURCES ${PLATFORM_SOURCES} carbon.c carbon.h) + add_sub_definitions(HAVE_CARBON) + add_sources(carbon.c carbon.h) endif() -set(EXECUTABLE_NAME "fssetter-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") - -add_executable(${EXECUTABLE_NAME} ${PLATFORM_SOURCES}) - if(CARBON_LIBRARY) - target_link_libraries(${EXECUTABLE_NAME} core unix ${CARBON_LIBRARY}) -else() - target_link_libraries(${EXECUTABLE_NAME} core unix) -endif() \ No newline at end of file + add_sub_libraries(${CARBON_LIBRARY}) +endif() diff --git a/setter/src/unix/linux/CMakeLists.txt b/setter/src/unix/linux/CMakeLists.txt index 3d5088a..2d7633e 100644 --- a/setter/src/unix/linux/CMakeLists.txt +++ b/setter/src/unix/linux/CMakeLists.txt @@ -26,15 +26,6 @@ if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Linux") return() endif() -project( - fssetter-linux - DESCRIPTION "Filesystem test creator for Linux" - LANGUAGES C) +add_sources(attr.c sparse.c xattr.c xattr.h volume.c volume.h) -set(PLATFORM_SOURCES attr.c sparse.c xattr.c xattr.h volume.c volume.h) - -set(EXECUTABLE_NAME "fssetter-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") - -add_executable(${EXECUTABLE_NAME} ${PLATFORM_SOURCES}) - -target_link_libraries(${EXECUTABLE_NAME} core unix dl) \ No newline at end of file +add_sub_libraries(dl) diff --git a/setter/src/win32/CMakeLists.txt b/setter/src/win32/CMakeLists.txt index 82ff0d2..3ac9c74 100644 --- a/setter/src/win32/CMakeLists.txt +++ b/setter/src/win32/CMakeLists.txt @@ -26,15 +26,4 @@ if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows") return() endif() -project( - fssetter-win32 - DESCRIPTION "Filesystem test creator for 32-bit and 64-bit Windows" - LANGUAGES C) - -set(PLATFORM_SOURCES attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c rsrcfork.c sparse.c time.c volume.c xattr.c attr.h rsrcfork.h xattr.h links.h volume.h timew32.h os.h sparse.h) - -set(EXECUTABLE_NAME "fssetter-${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}") - -add_executable(${EXECUTABLE_NAME} ${PLATFORM_SOURCES}) - -target_link_libraries(${EXECUTABLE_NAME} core) \ No newline at end of file +add_sources(attr.c deleted.c dirdepth.c filename.c files.c frag.c links.c os.c perms.c rsrcfork.c sparse.c time.c volume.c xattr.c attr.h rsrcfork.h xattr.h links.h volume.h timew32.h os.h sparse.h)