PellesC: Compile for architecture matching LIB environment variable

Issue: #21536
Co-authored-by: Serguei E. Leontiev <leo@sai.msu.ru>
This commit is contained in:
Brad King
2026-05-11 14:55:12 -04:00
co-authored by Serguei E. Leontiev
parent 20ccf97df8
commit bc51518821
5 changed files with 76 additions and 5 deletions
@@ -4,10 +4,21 @@
include (Platform/Windows-PellesC)
__windows_compiler_pellesc(ASM_POASM)
if(_PellesC_ARCH STREQUAL "x64")
set(_PellesC_ASM_POASM_FLAGS " -Aamd64")
elseif(_PellesC_ARCH STREQUAL "x86")
set(_PellesC_ASM_POASM_FLAGS " -Aia32")
else()
set(_PellesC_ASM_POASM_FLAGS "")
endif()
set(CMAKE_ASM_POASM_COMPILE_OBJECT
"<CMAKE_ASM_POASM_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -Fo<OBJECT> <SOURCE>")
"<CMAKE_ASM_POASM_COMPILER> <DEFINES> <INCLUDES>${_PellesC_ASM_POASM_FLAGS} <FLAGS> -Fo<OBJECT> <SOURCE>")
string(APPEND CMAKE_ASM_POASM_FLAGS_DEBUG_INIT " -Zi")
string(APPEND CMAKE_ASM_POASM_FLAGS_RELEASE_INIT "")
string(APPEND CMAKE_ASM_POASM_FLAGS_RELWITHDEBINFO_INIT " -Zi")
string(APPEND CMAKE_ASM_POASM_FLAGS_MINSIZEREL_INIT "")
unset(_PellesC_ASM_POASM_FLAGS)
unset(_PellesC_ARCH)
+10 -1
View File
@@ -4,8 +4,14 @@
include (Platform/Windows-PellesC)
__windows_compiler_pellesc(C)
if(_PellesC_ARCH)
set(_PellesC_C_OBJ_FLAGS " -T${_PellesC_ARCH}-coff")
else()
set(_PellesC_C_OBJ_FLAGS "")
endif()
set(CMAKE_C_COMPILE_OBJECT
"<CMAKE_C_COMPILER> <DEFINES> <INCLUDES> <FLAGS> -Fo<OBJECT> -c <SOURCE>")
"<CMAKE_C_COMPILER> <DEFINES> <INCLUDES>${_PellesC_C_OBJ_FLAGS} <FLAGS> -Fo<OBJECT> -c <SOURCE>")
# Enable Pelles C's Microsoft extensions to use Windows APIs.
# The flag also disables standard definitions, so add them.
@@ -15,3 +21,6 @@ string(APPEND CMAKE_C_FLAGS_DEBUG_INIT " -Zi -Ob0")
string(APPEND CMAKE_C_FLAGS_RELEASE_INIT " -Ot -Ob2 -DNDEBUG=1")
string(APPEND CMAKE_C_FLAGS_RELWITHDEBINFO_INIT " -Zi -Ot -Ob1 -DNDEBUG=1")
string(APPEND CMAKE_C_FLAGS_MINSIZEREL_INIT " -Os -Ob1 -DNDEBUG=1")
unset(_PellesC_C_OBJ_FLAGS)
unset(_PellesC_ARCH)
+20 -2
View File
@@ -8,17 +8,33 @@ set(CMAKE_LINK_LIBRARY_FLAG "")
set(CMAKE_BUILD_TYPE_INIT Debug)
# Select a default architecture based on the LIB search path.
string(TOLOWER "$ENV{LIB}" _PellesC_LIB)
if(_PellesC_LIB MATCHES [[[\/]+lib[\/]+win64[\/]*(;|$)]])
set(_PellesC_ARCH "x64")
elseif(_PellesC_LIB MATCHES [[[\/]+lib[\/]+win[\/]*(;|$)]])
set(_PellesC_ARCH "x86")
else()
set(_PellesC_ARCH "")
endif()
macro(__windows_compiler_pellesc lang)
if(_PellesC_ARCH)
set(_PellesC_LINK_FLAGS " -machine:${_PellesC_ARCH}")
else()
set(_PellesC_LINK_FLAGS "")
endif()
set(CMAKE_${lang}_CREATE_STATIC_LIBRARY "<CMAKE_AR> <LINK_FLAGS> -out:<TARGET> <OBJECTS>")
set(CMAKE_${lang}_CREATE_SHARED_LIBRARY
"<CMAKE_LINKER> <OBJECTS> ${CMAKE_START_TEMP_FILE} -out:<TARGET> -implib:<TARGET_IMPLIB> -dll -version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR> <LINK_FLAGS> <LINK_LIBRARIES> ${CMAKE_END_TEMP_FILE}")
"<CMAKE_LINKER> <OBJECTS> ${CMAKE_START_TEMP_FILE} -out:<TARGET> -implib:<TARGET_IMPLIB> -dll -version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR>${_PellesC_LINK_FLAGS} <LINK_FLAGS> <LINK_LIBRARIES> ${CMAKE_END_TEMP_FILE}")
set(CMAKE_${lang}_CREATE_SHARED_MODULE "${CMAKE_${lang}_CREATE_SHARED_LIBRARY}")
set(CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS "")
set(CMAKE_${lang}_USE_RESPONSE_FILE_FOR_OBJECTS 1)
set(CMAKE_${lang}_LINK_EXECUTABLE
"<CMAKE_LINKER> <OBJECTS> ${CMAKE_START_TEMP_FILE} -out:<TARGET> -implib:<TARGET_IMPLIB> -version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR> <LINK_FLAGS> <LINK_LIBRARIES> ${CMAKE_END_TEMP_FILE}")
"<CMAKE_LINKER> <OBJECTS> ${CMAKE_START_TEMP_FILE} -out:<TARGET> -implib:<TARGET_IMPLIB> -version:<TARGET_VERSION_MAJOR>.<TARGET_VERSION_MINOR>${_PellesC_LINK_FLAGS} <LINK_FLAGS> <LINK_LIBRARIES> ${CMAKE_END_TEMP_FILE}")
set(CMAKE_${lang}_LINK_DEF_FILE_FLAG "${CMAKE_LINK_DEF_FILE_FLAG}")
@@ -29,6 +45,8 @@ macro(__windows_compiler_pellesc lang)
set(CMAKE_RC_COMPILER_INIT porc)
endif()
enable_language(RC)
unset(_PellesC_LINK_FLAGS)
endmacro()
foreach (t IN ITEMS EXE SHARED MODULE)
+11 -1
View File
@@ -1,3 +1,13 @@
cmake_minimum_required(VERSION 4.3)
project(PellesASM LANGUAGES ASM_POASM)
add_executable(PellesASM main-AMD64.asm)
string(TOLOWER "$ENV{LIB}" env_lib)
if(env_lib MATCHES [[[\/]+lib[\/]+win64[\/]*(;|$)]])
set(arch "AMD64")
elseif(env_lib MATCHES [[[\/]+lib[\/]+win[\/]*(;|$)]])
set(arch "IA32")
else()
message(FATAL_ERROR "Cannot determine target architecture.")
endif()
add_executable(PellesASM main-${arch}.asm)
+23
View File
@@ -0,0 +1,23 @@
extern $printf:proc
.rdata
fmt db "hello assembler world, %d arguments given", 0ah, 0
.code
main proc
push ebp
mov ebp, esp
push dword ptr [ebp + 8]
lea eax, [fmt]
push eax
call $printf
add esp, 8
mov eax, 0
mov esp, ebp
pop ebp
ret
main endp
.drectve SEGMENT
db ' -defaultlib:crt'
db ' -defaultlib:kernel32'
end